From 94ff0f6e2af808b198158f06912b0efc98a162e7 Mon Sep 17 00:00:00 2001 From: SuGar-456 Date: Mon, 1 Dec 2025 14:35:22 +0800 Subject: [PATCH] Initial commit HandDriverUPM --- .gitignore | 25 + .vsconfig | 6 + Assets/HandDriverUPM.meta | 8 + Assets/HandDriverUPM/HandDriver.meta | 8 + Assets/HandDriverUPM/HandDriver/Model.meta | 8 + .../HandDriver/Model/vr_glove_color.jpg | Bin 0 -> 710197 bytes .../HandDriver/Model/vr_glove_color.jpg.meta | 135 + .../HandDriver/Model/vr_glove_color.mat | 82 + .../HandDriver/Model/vr_glove_color.mat.meta | 8 + .../HandDriver/Model/vr_glove_new.fbx | Bin 0 -> 282624 bytes .../HandDriver/Model/vr_glove_new.fbx.meta | 106 + .../HandDriver/Model/vr_glove_normal.png | Bin 0 -> 2298961 bytes .../HandDriver/Model/vr_glove_normal.png.meta | 135 + .../HandDriver/Model/vr_glove_right_model.fbx | Bin 0 -> 442864 bytes .../Model/vr_glove_right_model.fbx.meta | 106 + .../HandDriver/Model/vr_gloves_prototype.fbx | Bin 0 -> 538240 bytes .../Model/vr_gloves_prototype.fbx.meta | 106 + Assets/HandDriverUPM/HandDriver/Plugins.meta | 8 + .../HandDriver/Plugins/Newtonsoft.Json.dll | Bin 0 -> 711952 bytes .../Plugins/Newtonsoft.Json.dll.meta | 33 + Assets/HandDriverUPM/HandDriver/Scenes.meta | 8 + .../HandDriver/Scenes/Sample.unity | 2561 +++++++++++++++++ .../HandDriver/Scenes/Sample.unity.meta | 7 + Assets/HandDriverUPM/HandDriver/Scripts.meta | 8 + .../HandDriver/Scripts/HandDriver.cs | 698 +++++ .../HandDriver/Scripts/HandDriver.cs.meta | 11 + .../HandDriver/Scripts/InputData.cs | 35 + .../HandDriver/Scripts/InputData.cs.meta | 11 + .../HandDriver/Scripts/Network.cs | 207 ++ .../HandDriver/Scripts/Network.cs.meta | 11 + .../HandDriver/Scripts/VibrationData.cs | 33 + .../HandDriver/Scripts/VibrationData.cs.meta | 11 + Assets/HandDriverUPM/HandDriver/_3rd.meta | 8 + .../HandDriver/_3rd/TouchSocket.meta | 8 + .../HandDriver/_3rd/TouchSocket/Core.meta | 8 + .../_3rd/TouchSocket/Core/ByteManager.meta | 8 + .../TouchSocket/Core/ByteManager/ByteBlock.cs | 1309 +++++++++ .../Core/ByteManager/ByteBlock.cs.meta | 11 + .../TouchSocket/Core/ByteManager/BytePool.cs | 438 +++ .../Core/ByteManager/BytePool.cs.meta | 11 + .../Core/ByteManager/BytesQueue.cs | 57 + .../Core/ByteManager/BytesQueue.cs.meta | 11 + .../Core/ByteManager/ValueByteBlock.cs | 1249 ++++++++ .../Core/ByteManager/ValueByteBlock.cs.meta | 11 + .../_3rd/TouchSocket/Core/Caching.meta | 8 + .../TouchSocket/Core/Caching/CacheEntry.cs | 61 + .../Core/Caching/CacheEntry.cs.meta | 11 + .../Core/Caching/CacheManagementExtensions.cs | 58 + .../Caching/CacheManagementExtensions.cs.meta | 11 + .../_3rd/TouchSocket/Core/Caching/ICache.cs | 106 + .../TouchSocket/Core/Caching/ICache.cs.meta | 11 + .../TouchSocket/Core/Caching/ICacheEntry.cs | 48 + .../Core/Caching/ICacheEntry.cs.meta | 11 + .../TouchSocket/Core/Caching/MemoryCache.cs | 319 ++ .../Core/Caching/MemoryCache.cs.meta | 11 + .../_3rd/TouchSocket/Core/Collections.meta | 8 + .../Core/Collections/Concurrent.meta | 8 + .../Concurrent/ConcurrentDoublyDictionary.cs | 125 + .../ConcurrentDoublyDictionary.cs.meta | 11 + .../Collections/Concurrent/ConcurrentList.cs | 680 +++++ .../Concurrent/ConcurrentList.cs.meta | 11 + .../Concurrent/ConcurrentMultiDictionary.cs | 194 ++ .../ConcurrentMultiDictionary.cs.meta | 11 + .../Concurrent/IntelligentConcurrentQueue.cs | 78 + .../IntelligentConcurrentQueue.cs.meta | 11 + .../Concurrent/IntelligentDataQueue.cs | 233 ++ .../Concurrent/IntelligentDataQueue.cs.meta | 11 + .../Collections/Concurrent/TriggerQueue.cs | 150 + .../Concurrent/TriggerQueue.cs.meta | 11 + .../IgnoreCaseNameValueCollection.cs | 32 + .../IgnoreCaseNameValueCollection.cs.meta | 11 + .../NameValueCollectionDebugView.cs | 50 + .../NameValueCollectionDebugView.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common.meta | 8 + .../TouchSocket/Core/Common/AppConfigBase.cs | 137 + .../Core/Common/AppConfigBase.cs.meta | 11 + .../TouchSocket/Core/Common/DateExtensions.cs | 48 + .../Core/Common/DateExtensions.cs.meta | 11 + .../Core/Common/DisposableObject.cs | 51 + .../Core/Common/DisposableObject.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common/Enum.meta | 8 + .../Core/Common/Enum/EndianType.cs | 31 + .../Core/Common/Enum/EndianType.cs.meta | 11 + .../Core/Common/Enum/ResultCode.cs | 56 + .../Core/Common/Enum/ResultCode.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common/FlowGate.cs | 112 + .../TouchSocket/Core/Common/FlowGate.cs.meta | 11 + .../Core/Common/GlobalEnvironment.cs | 19 + .../Core/Common/GlobalEnvironment.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common/IResult.cs | 30 + .../TouchSocket/Core/Common/IResult.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common/IWrite.cs | 35 + .../TouchSocket/Core/Common/IWrite.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common/Locker.cs | 69 + .../TouchSocket/Core/Common/Locker.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common/Metadata.cs | 70 + .../TouchSocket/Core/Common/Metadata.cs.meta | 11 + .../Common/MetadataFastBinaryConverter.cs | 43 + .../MetadataFastBinaryConverter.cs.meta | 11 + .../Core/Common/OptimizedPlatforms.cs | 26 + .../Core/Common/OptimizedPlatforms.cs.meta | 11 + .../_3rd/TouchSocket/Core/Common/Result.cs | 268 ++ .../TouchSocket/Core/Common/Result.cs.meta | 11 + .../Core/Common/SnowflakeIDGenerator.cs | 129 + .../Core/Common/SnowflakeIDGenerator.cs.meta | 11 + .../TouchSocket/Core/Common/StringResStore.cs | 65 + .../Core/Common/StringResStore.cs.meta | 11 + .../TouchSocket/Core/Common/ThrowHelper.cs | 56 + .../Core/Common/ThrowHelper.cs.meta | 11 + .../Core/Common/TouchSocketBitConverter.cs | 498 ++++ .../Common/TouchSocketBitConverter.cs.meta | 11 + .../Core/Common/TouchSocketCoreUtility.cs | 50 + .../Common/TouchSocketCoreUtility.cs.meta | 11 + .../_3rd/TouchSocket/Core/Config.meta | 8 + .../Core/Config/TouchSocketConfig.cs | 114 + .../Core/Config/TouchSocketConfig.cs.meta | 11 + .../Config/TouchSocketCoreConfigExtension.cs | 54 + .../TouchSocketCoreConfigExtension.cs.meta | 11 + .../_3rd/TouchSocket/Core/Converter.meta | 8 + .../Core/Converter/BytesConverter.cs | 83 + .../Core/Converter/BytesConverter.cs.meta | 11 + .../TouchSocket/Core/Converter/IConverter.cs | 46 + .../Core/Converter/IConverter.cs.meta | 11 + .../Core/Converter/StringConverter.cs | 134 + .../Core/Converter/StringConverter.cs.meta | 11 + .../Core/Converter/TouchSocketConverter.cs | 129 + .../Converter/TouchSocketConverter.cs.meta | 11 + .../_3rd/TouchSocket/Core/Data.meta | 8 + .../_3rd/TouchSocket/Core/Data/Compress.meta | 8 + .../Core/Data/Compress/GZipDataCompressor.cs | 33 + .../Data/Compress/GZipDataCompressor.cs.meta | 11 + .../Core/Data/Compress/IDataCompressor.cs | 36 + .../Data/Compress/IDataCompressor.cs.meta | 11 + .../_3rd/TouchSocket/Core/Data/Crc.cs | 783 +++++ .../_3rd/TouchSocket/Core/Data/Crc.cs.meta | 11 + .../_3rd/TouchSocket/Core/Data/GZip.cs | 142 + .../_3rd/TouchSocket/Core/Data/GZip.cs.meta | 11 + .../_3rd/TouchSocket/Core/Data/MD5.cs | 85 + .../_3rd/TouchSocket/Core/Data/MD5.cs.meta | 11 + .../_3rd/TouchSocket/Core/Data/Security.meta | 8 + .../Core/Data/Security/DataSecurity.cs | 161 ++ .../Core/Data/Security/DataSecurity.cs.meta | 11 + .../_3rd/TouchSocket/Core/Data/Swap.cs | 37 + .../_3rd/TouchSocket/Core/Data/Swap.cs.meta | 11 + .../_3rd/TouchSocket/Core/Data/XML.meta | 8 + .../_3rd/TouchSocket/Core/Data/XML/XmlTool.cs | 721 +++++ .../TouchSocket/Core/Data/XML/XmlTool.cs.meta | 11 + .../_3rd/TouchSocket/Core/Dependency.meta | 8 + .../Core/Dependency/Attribute.meta | 8 + .../Attribute/DataValidationAttribute.cs | 24 + .../Attribute/DataValidationAttribute.cs.meta | 11 + .../Attribute/DependencyInjectionAttribute.cs | 153 + .../DependencyInjectionAttribute.cs.meta | 11 + .../TouchSocket/Core/Dependency/Container.cs | 371 +++ .../Core/Dependency/Container.cs.meta | 11 + .../Core/Dependency/ContainerExtension.cs | 360 +++ .../Dependency/ContainerExtension.cs.meta | 11 + .../Core/Dependency/ContainerProvider.cs | 36 + .../Core/Dependency/ContainerProvider.cs.meta | 11 + .../Core/Dependency/DependencyDescriptor.cs | 82 + .../Dependency/DependencyDescriptor.cs.meta | 11 + .../Core/Dependency/DependencyObject.cs | 131 + .../Core/Dependency/DependencyObject.cs.meta | 11 + .../Core/Dependency/DependencyProperty.cs | 100 + .../Dependency/DependencyProperty.cs.meta | 11 + .../TouchSocket/Core/Dependency/IContainer.cs | 38 + .../Core/Dependency/IContainer.cs.meta | 11 + .../Core/Dependency/IContainerProvider.cs | 39 + .../Dependency/IContainerProvider.cs.meta | 11 + .../TouchSocket/Core/Dependency/Lifetime.cs | 36 + .../Core/Dependency/Lifetime.cs.meta | 11 + .../_3rd/TouchSocket/Core/Diagnostics.meta | 8 + .../Core/Diagnostics/TimeMeasurer.cs | 48 + .../Core/Diagnostics/TimeMeasurer.cs.meta | 11 + .../_3rd/TouchSocket/Core/Event.meta | 8 + .../Core/Event/TouchSocketEventArgs.cs | 33 + .../Core/Event/TouchSocketEventArgs.cs.meta | 11 + .../_3rd/TouchSocket/Core/Exceptions.meta | 8 + .../Exceptions/MessageNotFoundException.cs | 31 + .../MessageNotFoundException.cs.meta | 11 + .../Exceptions/MessageRegisteredException.cs | 31 + .../MessageRegisteredException.cs.meta | 11 + .../_3rd/TouchSocket/Core/Extensions.meta | 8 + .../Core/Extensions/BytesExtension.cs | 138 + .../Core/Extensions/BytesExtension.cs.meta | 11 + .../Core/Extensions/DictionaryExtension.cs | 122 + .../Extensions/DictionaryExtension.cs.meta | 11 + .../Core/Extensions/RangeExtension.cs | 72 + .../Core/Extensions/RangeExtension.cs.meta | 11 + .../Core/Extensions/StringExtension.cs | 349 +++ .../Core/Extensions/StringExtension.cs.meta | 11 + .../Core/Extensions/SystemExtensions.cs | 172 ++ .../Core/Extensions/SystemExtensions.cs.meta | 11 + .../Core/Extensions/SystemNetExtension.cs | 46 + .../Extensions/SystemNetExtension.cs.meta | 11 + .../Core/Extensions/TaskExtension.cs | 21 + .../Core/Extensions/TaskExtension.cs.meta | 11 + .../Core/Extensions/TupleExtension.cs | 36 + .../Core/Extensions/TupleExtension.cs.meta | 11 + .../Core/Extensions/TypeExtension.cs | 140 + .../Core/Extensions/TypeExtension.cs.meta | 11 + .../HandDriver/_3rd/TouchSocket/Core/IO.meta | 8 + .../TouchSocket/Core/IO/BlockReadStream.cs | 216 ++ .../Core/IO/BlockReadStream.cs.meta | 11 + .../_3rd/TouchSocket/Core/IO/BlockReader.cs | 206 ++ .../TouchSocket/Core/IO/BlockReader.cs.meta | 11 + .../_3rd/TouchSocket/Core/IO/ConsoleAction.cs | 160 + .../TouchSocket/Core/IO/ConsoleAction.cs.meta | 11 + .../TouchSocket/Core/IO/DirectoryUtility.cs | 66 + .../Core/IO/DirectoryUtility.cs.meta | 11 + .../_3rd/TouchSocket/Core/IO/FileIO.meta | 8 + .../TouchSocket/Core/IO/FileIO/FilePool.cs | 341 +++ .../Core/IO/FileIO/FilePool.cs.meta | 11 + .../TouchSocket/Core/IO/FileIO/FileStorage.cs | 229 ++ .../Core/IO/FileIO/FileStorage.cs.meta | 11 + .../Core/IO/FileIO/FileStorageReader.cs | 91 + .../Core/IO/FileIO/FileStorageReader.cs.meta | 11 + .../Core/IO/FileIO/FileStorageStream.cs | 152 + .../Core/IO/FileIO/FileStorageStream.cs.meta | 11 + .../Core/IO/FileIO/FileStorageWriter.cs | 105 + .../Core/IO/FileIO/FileStorageWriter.cs.meta | 11 + .../_3rd/TouchSocket/Core/IO/FileUtility.cs | 313 ++ .../TouchSocket/Core/IO/FileUtility.cs.meta | 11 + .../_3rd/TouchSocket/Core/IO/WrapStream.cs | 126 + .../TouchSocket/Core/IO/WrapStream.cs.meta | 11 + .../_3rd/TouchSocket/Core/Logger.meta | 8 + .../TouchSocket/Core/Logger/ConsoleLogger.cs | 90 + .../Core/Logger/ConsoleLogger.cs.meta | 11 + .../TouchSocket/Core/Logger/EasyLogger.cs | 85 + .../Core/Logger/EasyLogger.cs.meta | 11 + .../TouchSocket/Core/Logger/FileLogger.cs | 118 + .../Core/Logger/FileLogger.cs.meta | 11 + .../_3rd/TouchSocket/Core/Logger/ILog.cs | 38 + .../_3rd/TouchSocket/Core/Logger/ILog.cs.meta | 11 + .../_3rd/TouchSocket/Core/Logger/LogType.cs | 56 + .../TouchSocket/Core/Logger/LogType.cs.meta | 11 + .../TouchSocket/Core/Logger/LoggerBase.cs | 65 + .../Core/Logger/LoggerBase.cs.meta | 11 + .../Core/Logger/LoggerContainerExtension.cs | 125 + .../Logger/LoggerContainerExtension.cs.meta | 11 + .../Core/Logger/LoggerExtensions.cs | 274 ++ .../Core/Logger/LoggerExtensions.cs.meta | 11 + .../TouchSocket/Core/Logger/LoggerGroup.cs | 252 ++ .../Core/Logger/LoggerGroup.cs.meta | 11 + .../_3rd/TouchSocket/Core/Mapper.meta | 8 + .../_3rd/TouchSocket/Core/Mapper/Mapper.cs | 189 ++ .../TouchSocket/Core/Mapper/Mapper.cs.meta | 11 + .../TouchSocket/Core/Mapper/MapperOption.cs | 24 + .../Core/Mapper/MapperOption.cs.meta | 11 + .../_3rd/TouchSocket/Core/Packages_.meta | 8 + .../TouchSocket/Core/Packages_/IPackage.cs | 34 + .../Core/Packages_/IPackage.cs.meta | 11 + .../Core/Packages_/MsgRouterPackage.cs | 38 + .../Core/Packages_/MsgRouterPackage.cs.meta | 11 + .../TouchSocket/Core/Packages_/PackageBase.cs | 27 + .../Core/Packages_/PackageBase.cs.meta | 11 + .../Core/Packages_/PackageExtensions.cs | 34 + .../Core/Packages_/PackageExtensions.cs.meta | 11 + .../Core/Packages_/RouterPackage.cs | 104 + .../Core/Packages_/RouterPackage.cs.meta | 11 + .../TouchSocket/Core/Packages_/WaitPackage.cs | 52 + .../Core/Packages_/WaitPackage.cs.meta | 11 + .../Core/Packages_/WaitRouterPackage.cs | 42 + .../Core/Packages_/WaitRouterPackage.cs.meta | 11 + .../_3rd/TouchSocket/Core/Plugins.meta | 8 + .../Core/Plugins/AsyncRaiserAttribute.cs | 25 + .../Core/Plugins/AsyncRaiserAttribute.cs.meta | 11 + .../_3rd/TouchSocket/Core/Plugins/IPlugin.cs | 29 + .../TouchSocket/Core/Plugins/IPlugin.cs.meta | 11 + .../TouchSocket/Core/Plugins/IPluginObject.cs | 36 + .../Core/Plugins/IPluginObject.cs.meta | 11 + .../Core/Plugins/IPluginsManager.cs | 66 + .../Core/Plugins/IPluginsManager.cs.meta | 11 + .../Core/Plugins/PlguinObjectExtension.cs | 75 + .../Plugins/PlguinObjectExtension.cs.meta | 11 + .../TouchSocket/Core/Plugins/PluginBase.cs | 17 + .../Core/Plugins/PluginBase.cs.meta | 11 + .../Core/Plugins/PluginsManager.cs | 275 ++ .../Core/Plugins/PluginsManager.cs.meta | 11 + .../Core/Plugins/PluginsManagerExtension.cs | 77 + .../Plugins/PluginsManagerExtension.cs.meta | 11 + .../Core/Plugins/SingletonPluginAttribute.cs | 24 + .../Plugins/SingletonPluginAttribute.cs.meta | 11 + .../_3rd/TouchSocket/Core/Pool.meta | 8 + .../TouchSocket/Core/Pool/ObjectPool.meta | 8 + .../Core/Pool/ObjectPool/IObjectPool.cs | 32 + .../Core/Pool/ObjectPool/IObjectPool.cs.meta | 11 + .../Core/Pool/ObjectPool/IPoolObject.cs | 41 + .../Core/Pool/ObjectPool/IPoolObject.cs.meta | 11 + .../Core/Pool/ObjectPool/ObjectPool.cs | 145 + .../Core/Pool/ObjectPool/ObjectPool.cs.meta | 11 + .../_3rd/TouchSocket/Core/Reflection.meta | 8 + .../Reflection/DynamicMethodMemberAccessor.cs | 62 + .../DynamicMethodMemberAccessor.cs.meta | 11 + .../Core/Reflection/ExpressionMapper.cs | 56 + .../Core/Reflection/ExpressionMapper.cs.meta | 11 + .../Core/Reflection/IMemberAccessor.cs | 30 + .../Core/Reflection/IMemberAccessor.cs.meta | 11 + .../TouchSocket/Core/Reflection/Member.cs | 15 + .../Core/Reflection/Member.cs.meta | 11 + .../Core/Reflection/MemberAccessor.cs | 188 ++ .../Core/Reflection/MemberAccessor.cs.meta | 11 + .../Core/Reflection/MemberGetter.cs | 78 + .../Core/Reflection/MemberGetter.cs.meta | 11 + .../Core/Reflection/MemberSetter.cs | 66 + .../Core/Reflection/MemberSetter.cs.meta | 11 + .../TouchSocket/Core/Reflection/Method.cs | 360 +++ .../Core/Reflection/Method.cs.meta | 11 + .../TouchSocket/Core/Reflection/Property.cs | 121 + .../Core/Reflection/Property.cs.meta | 11 + .../HandDriver/_3rd/TouchSocket/Core/Run.meta | 8 + .../_3rd/TouchSocket/Core/Run/Action.meta | 8 + .../TouchSocket/Core/Run/Action/EasyTask.cs | 152 + .../Core/Run/Action/EasyTask.cs.meta | 11 + .../TouchSocket/Core/Run/Action/LoopAction.cs | 259 ++ .../Core/Run/Action/LoopAction.cs.meta | 11 + .../TouchSocket/Core/Run/Action/RunStatus.cs | 45 + .../Core/Run/Action/RunStatus.cs.meta | 11 + .../_3rd/TouchSocket/Core/Run/Message.meta | 8 + .../Core/Run/Message/AppMessageAttribute.cs | 44 + .../Run/Message/AppMessageAttribute.cs.meta | 11 + .../Core/Run/Message/AppMessenger.cs | 269 ++ .../Core/Run/Message/AppMessenger.cs.meta | 11 + .../Run/Message/AppMessengerExtensions.cs | 321 +++ .../Message/AppMessengerExtensions.cs.meta | 11 + .../Core/Run/Message/IMessageObject.cs | 22 + .../Core/Run/Message/IMessageObject.cs.meta | 11 + .../Core/Run/Message/MessageInstance.cs | 52 + .../Core/Run/Message/MessageInstance.cs.meta | 11 + .../_3rd/TouchSocket/Core/Run/Timers.meta | 8 + .../Core/Run/Timers/SingleTimer.cs | 175 ++ .../Core/Run/Timers/SingleTimer.cs.meta | 11 + .../_3rd/TouchSocket/Core/Run/WaitPool.meta | 8 + .../Core/Run/WaitPool/IWaitResult.cs | 36 + .../Core/Run/WaitPool/IWaitResult.cs.meta | 11 + .../Core/Run/WaitPool/ValueWaitResult.cs | 38 + .../Core/Run/WaitPool/ValueWaitResult.cs.meta | 11 + .../TouchSocket/Core/Run/WaitPool/WaitData.cs | 216 ++ .../Core/Run/WaitPool/WaitData.cs.meta | 11 + .../Core/Run/WaitPool/WaitDataStatus.cs | 45 + .../Core/Run/WaitPool/WaitDataStatus.cs.meta | 11 + .../Core/Run/WaitPool/WaitHandlePool.cs | 191 ++ .../Core/Run/WaitPool/WaitHandlePool.cs.meta | 11 + .../Core/Run/WaitPool/WaitResult.cs | 38 + .../Core/Run/WaitPool/WaitResult.cs.meta | 11 + .../_3rd/TouchSocket/Core/Serialization.meta | 8 + .../Core/Serialization/Attributes.meta | 8 + .../Attributes/FastConverterAttribute.cs | 36 + .../Attributes/FastConverterAttribute.cs.meta | 11 + .../Attributes/FastNonSerializedAttribute.cs | 24 + .../FastNonSerializedAttribute.cs.meta | 11 + .../Attributes/FastSerializedAttribute.cs | 16 + .../FastSerializedAttribute.cs.meta | 11 + .../Core/Serialization/FastBinary.meta | 8 + .../FastBinary/FastBinaryFormatter.cs | 675 +++++ .../FastBinary/FastBinaryFormatter.cs.meta | 11 + .../FastBinary/IFastBinaryConverter.cs | 69 + .../FastBinary/IFastBinaryConverter.cs.meta | 11 + .../Serialization/FastBinary/InstanceType.cs | 23 + .../FastBinary/InstanceType.cs.meta | 11 + .../FastBinary/SerializObject.cs | 191 ++ .../FastBinary/SerializObject.cs.meta | 11 + .../FastBinary/SerializationType.cs | 41 + .../FastBinary/SerializationType.cs.meta | 11 + .../FastBinary/VersionFastBinaryConverter.cs | 27 + .../VersionFastBinaryConverter.cs.meta | 11 + .../TouchSocket/Core/Serialization/Json.meta | 8 + .../Core/Serialization/Json/JsonFast.cs | 830 ++++++ .../Core/Serialization/Json/JsonFast.cs.meta | 11 + .../Core/Serialization/Json/JsonNet.cs | 147 + .../Core/Serialization/Json/JsonNet.cs.meta | 11 + .../Core/Serialization/SerializeConvert.cs | 524 ++++ .../Serialization/SerializeConvert.cs.meta | 11 + .../_3rd/TouchSocket/Core/代码说明.txt | 10 + .../TouchSocket/Core/代码说明.txt.meta | 7 + .../HandDriver/_3rd/TouchSocket/Http.meta | 8 + .../_3rd/TouchSocket/Http/Common.meta | 8 + .../TouchSocket/Http/Common/FileCachePool.cs | 444 +++ .../Http/Common/FileCachePool.cs.meta | 11 + .../_3rd/TouchSocket/Http/Common/HttpBase.cs | 279 ++ .../TouchSocket/Http/Common/HttpBase.cs.meta | 11 + .../TouchSocket/Http/Common/HttpContext.cs | 67 + .../Http/Common/HttpContext.cs.meta | 11 + .../_3rd/TouchSocket/Http/Common/HttpProxy.cs | 53 + .../TouchSocket/Http/Common/HttpProxy.cs.meta | 11 + .../_3rd/TouchSocket/Http/Common/HttpRange.cs | 139 + .../TouchSocket/Http/Common/HttpRange.cs.meta | 11 + .../TouchSocket/Http/Common/HttpRequest.cs | 455 +++ .../Http/Common/HttpRequest.cs.meta | 11 + .../TouchSocket/Http/Common/HttpResponse.cs | 405 +++ .../Http/Common/HttpResponse.cs.meta | 11 + .../_3rd/TouchSocket/Http/Common/HttpTools.cs | 181 ++ .../TouchSocket/Http/Common/HttpTools.cs.meta | 11 + .../Http/Common/MultifileCollection.cs | 97 + .../Http/Common/MultifileCollection.cs.meta | 11 + .../Http/Common/TouchSocketHttpUtility.cs | 45 + .../Common/TouchSocketHttpUtility.cs.meta | 11 + .../TouchSocket/Http/Common/WebProxy.meta | 8 + .../WebProxy/AuthenticationChallenge.cs | 161 ++ .../WebProxy/AuthenticationChallenge.cs.meta | 11 + .../Common/WebProxy/AuthenticationType.cs | 40 + .../WebProxy/AuthenticationType.cs.meta | 11 + .../Http/Common/WebProxy/NetworkCredential.cs | 65 + .../Common/WebProxy/NetworkCredential.cs.meta | 11 + .../_3rd/TouchSocket/Http/Components.meta | 8 + .../TouchSocket/Http/Components/HttpClient.cs | 238 ++ .../Http/Components/HttpClient.cs.meta | 11 + .../Http/Components/HttpService.cs | 31 + .../Http/Components/HttpService.cs.meta | 11 + .../Http/Components/HttpSocketClient.cs | 89 + .../Http/Components/HttpSocketClient.cs.meta | 11 + .../_3rd/TouchSocket/Http/Config.meta | 8 + .../Http/Config/HttpConfigExtensions.cs | 94 + .../Http/Config/HttpConfigExtensions.cs.meta | 11 + .../_3rd/TouchSocket/Http/DataAdapter.meta | 8 + .../HttpClientDataHandlingAdapter.cs | 206 ++ .../HttpClientDataHandlingAdapter.cs.meta | 11 + .../HttpServerDataHandlingAdapter.cs | 146 + .../HttpServerDataHandlingAdapter.cs.meta | 11 + .../TouchSocket/Http/DelegateCollection.cs | 21 + .../Http/DelegateCollection.cs.meta | 11 + .../_3rd/TouchSocket/Http/Enum.meta | 8 + .../_3rd/TouchSocket/Http/Enum/HttpHeaders.cs | 340 +++ .../TouchSocket/Http/Enum/HttpHeaders.cs.meta | 11 + .../_3rd/TouchSocket/Http/EventArgs.meta | 8 + .../Http/EventArgs/HttpContextEventArgs.cs | 36 + .../EventArgs/HttpContextEventArgs.cs.meta | 11 + .../_3rd/TouchSocket/Http/Extensions.meta | 8 + .../Http/Extensions/HttpExtensions.cs | 474 +++ .../Http/Extensions/HttpExtensions.cs.meta | 11 + .../Extensions/HttpPluginsManagerExtension.cs | 32 + .../HttpPluginsManagerExtension.cs.meta | 11 + .../_3rd/TouchSocket/Http/Interface.meta | 8 + .../Http/Interface/HttpPluginInterface.cs | 104 + .../Interface/HttpPluginInterface.cs.meta | 11 + .../TouchSocket/Http/Interface/IFormFile.cs | 82 + .../Http/Interface/IFormFile.cs.meta | 11 + .../TouchSocket/Http/Interface/IHttpClient.cs | 57 + .../Http/Interface/IHttpClient.cs.meta | 11 + .../Http/Interface/IHttpService.cs | 23 + .../Http/Interface/IHttpService.cs.meta | 11 + .../_3rd/TouchSocket/Http/Plugins.meta | 8 + .../Http/Plugins/DefaultHttpServicePlugin.cs | 117 + .../Plugins/DefaultHttpServicePlugin.cs.meta | 11 + .../Http/Plugins/HttpPluginBase.cs | 185 ++ .../Http/Plugins/HttpPluginBase.cs.meta | 11 + .../Http/Plugins/HttpStaticPagePlugin.cs | 89 + .../Http/Plugins/HttpStaticPagePlugin.cs.meta | 11 + .../_3rd/TouchSocket/Http/WebSockets.meta | 8 + .../TouchSocket/Http/WebSockets/Common.meta | 8 + .../Http/WebSockets/Common/WSDataFrame.cs | 132 + .../WebSockets/Common/WSDataFrame.cs.meta | 11 + .../Http/WebSockets/Common/WSTools.cs | 210 ++ .../Http/WebSockets/Common/WSTools.cs.meta | 11 + .../Http/WebSockets/Components.meta | 8 + .../WebSockets/Components/WebSocketClient.cs | 199 ++ .../Components/WebSocketClient.cs.meta | 11 + .../TouchSocket/Http/WebSockets/Config.meta | 8 + .../Config/WebSocketConfigExtensions.cs | 47 + .../Config/WebSocketConfigExtensions.cs.meta | 11 + .../Http/WebSockets/DataAdapter.meta | 8 + .../WebSocketDataHandlingAdapter.cs | 290 ++ .../WebSocketDataHandlingAdapter.cs.meta | 11 + .../Http/WebSockets/DelegateCollection.cs | 22 + .../WebSockets/DelegateCollection.cs.meta | 11 + .../TouchSocket/Http/WebSockets/Enum.meta | 8 + .../Http/WebSockets/Enum/WSDataType.cs | 51 + .../Http/WebSockets/Enum/WSDataType.cs.meta | 11 + .../Http/WebSockets/EventArgs.meta | 8 + .../EventArgs/WSDataFrameEventArgs.cs | 36 + .../EventArgs/WSDataFrameEventArgs.cs.meta | 11 + .../Http/WebSockets/Exceptions.meta | 8 + .../Exceptions/WebSocketConnectException.cs | 39 + .../WebSocketConnectException.cs.meta | 11 + .../Http/WebSockets/Extensions.meta | 8 + .../Extensions/WSClientExtensions.cs | 811 ++++++ .../Extensions/WSClientExtensions.cs.meta | 11 + .../Extensions/WSDataFrameExtensions.cs | 158 + .../Extensions/WSDataFrameExtensions.cs.meta | 11 + .../Extensions/WebSocketExtensions.cs | 30 + .../Extensions/WebSocketExtensions.cs.meta | 11 + .../WebSocketPluginsManagerExtension.cs | 40 + .../WebSocketPluginsManagerExtension.cs.meta | 11 + .../Extensions/WebSocketServerExtensions.cs | 95 + .../WebSocketServerExtensions.cs.meta | 11 + .../Http/WebSockets/Interface.meta | 8 + .../WebSockets/Interface/IWebSocketClient.cs | 41 + .../Interface/IWebSocketClient.cs.meta | 11 + .../WebSockets/Interface/IWebSocketPlugin.cs | 87 + .../Interface/IWebSocketPlugin.cs.meta | 11 + .../TouchSocket/Http/WebSockets/Plugins.meta | 8 + .../WebSockets/Plugins/WSCommandLinePlugin.cs | 138 + .../Plugins/WSCommandLinePlugin.cs.meta | 11 + .../Plugins/WebSocketHeartbeatPlugin.cs | 81 + .../Plugins/WebSocketHeartbeatPlugin.cs.meta | 11 + .../WebSockets/Plugins/WebSocketPluginBase.cs | 157 + .../Plugins/WebSocketPluginBase.cs.meta | 11 + .../Plugins/WebSocketServerPlugin.cs | 183 ++ .../Plugins/WebSocketServerPlugin.cs.meta | 11 + .../_3rd/TouchSocket/Resources.meta | 8 + .../TouchSocket/Resources/AssemblyInfo.cs | 18 + .../Resources/AssemblyInfo.cs.meta | 11 + .../Resources/TouchSocketStatus.cs | 251 ++ .../Resources/TouchSocketStatus.cs.meta | 11 + .../Resources/TouchSocketStatusExtension.cs | 40 + .../TouchSocketStatusExtension.cs.meta | 11 + .../HandDriver/_3rd/TouchSocket/Rpc.meta | 8 + .../_3rd/TouchSocket/Rpc/Global.meta | 8 + .../TouchSocket/Rpc/Global/Attribute.meta | 8 + .../Rpc/Global/Attribute/IRpcActionFilter.cs | 81 + .../Global/Attribute/IRpcActionFilter.cs.meta | 11 + .../Attribute/RpcActionFilterAttribute.cs | 57 + .../RpcActionFilterAttribute.cs.meta | 11 + .../Rpc/Global/Attribute/RpcAttribute.cs | 902 ++++++ .../Rpc/Global/Attribute/RpcAttribute.cs.meta | 11 + .../Rpc/Global/Attribute/RpcProxyAttribute.cs | 49 + .../Attribute/RpcProxyAttribute.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/Global/Code.meta | 8 + .../Rpc/Global/Code/ClassCellCode.cs | 31 + .../Rpc/Global/Code/ClassCellCode.cs.meta | 11 + .../Rpc/Global/Code/ClassCodeGenerator.cs | 547 ++++ .../Global/Code/ClassCodeGenerator.cs.meta | 11 + .../Rpc/Global/Code/CodeGenerator.cs | 552 ++++ .../Rpc/Global/Code/CodeGenerator.cs.meta | 11 + .../Rpc/Global/Code/MethodCellCode.cs | 42 + .../Rpc/Global/Code/MethodCellCode.cs.meta | 11 + .../Rpc/Global/Code/ServerCellCode.cs | 73 + .../Rpc/Global/Code/ServerCellCode.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/Global/Common.meta | 8 + .../Rpc/Global/Common/ActionMap.cs | 111 + .../Rpc/Global/Common/ActionMap.cs.meta | 11 + .../Rpc/Global/Common/FeedbackType.cs | 36 + .../Rpc/Global/Common/FeedbackType.cs.meta | 11 + .../Rpc/Global/Common/InvokeResult.cs | 35 + .../Rpc/Global/Common/InvokeResult.cs.meta | 11 + .../Rpc/Global/Common/MethodInstance.cs | 151 + .../Rpc/Global/Common/MethodInstance.cs.meta | 11 + .../Rpc/Global/Common/RpcServer.cs | 22 + .../Rpc/Global/Common/RpcServer.cs.meta | 11 + .../Rpc/Global/Common/RpcServerFactory.cs | 38 + .../Global/Common/RpcServerFactory.cs.meta | 11 + .../TouchSocket/Rpc/Global/Common/RpcStore.cs | 704 +++++ .../Rpc/Global/Common/RpcStore.cs.meta | 11 + .../Rpc/Global/Common/TransientRpcServer.cs | 41 + .../Global/Common/TransientRpcServer.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/Global/Enum.meta | 8 + .../Rpc/Global/Enum/CodeGeneratorFlag.cs | 83 + .../Rpc/Global/Enum/CodeGeneratorFlag.cs.meta | 11 + .../Rpc/Global/Enum/InvokeStatus.cs | 51 + .../Rpc/Global/Enum/InvokeStatus.cs.meta | 11 + .../Rpc/Global/Enum/MethodFlags.cs | 33 + .../Rpc/Global/Enum/MethodFlags.cs.meta | 11 + .../TouchSocket/Rpc/Global/Exceptions.meta | 8 + .../Rpc/Global/Exceptions/RpcExceptions.cs | 83 + .../Global/Exceptions/RpcExceptions.cs.meta | 11 + .../TouchSocket/Rpc/Global/Extensions.meta | 8 + .../Global/Extensions/RpcConfigExtensions.cs | 64 + .../Extensions/RpcConfigExtensions.cs.meta | 11 + .../Global/Extensions/RpcParserExtensions.cs | 198 ++ .../Extensions/RpcParserExtensions.cs.meta | 11 + .../Global/Extensions/RpcStoreExtensions.cs | 93 + .../Extensions/RpcStoreExtensions.cs.meta | 11 + .../TouchSocket/Rpc/Global/Interface.meta | 8 + .../Rpc/Global/Interface/ICallContext.cs | 47 + .../Rpc/Global/Interface/ICallContext.cs.meta | 11 + .../Rpc/Global/Interface/IInvokeOption.cs | 37 + .../Global/Interface/IInvokeOption.cs.meta | 11 + .../Rpc/Global/Interface/IRemoteServer.cs | 26 + .../Global/Interface/IRemoteServer.cs.meta | 11 + .../Rpc/Global/Interface/IRpcClient.cs | 123 + .../Rpc/Global/Interface/IRpcClient.cs.meta | 11 + .../Rpc/Global/Interface/IRpcParser.cs | 45 + .../Rpc/Global/Interface/IRpcParser.cs.meta | 11 + .../Rpc/Global/Interface/IRpcServer.cs | 22 + .../Rpc/Global/Interface/IRpcServer.cs.meta | 11 + .../Rpc/Global/Interface/IRpcServerFactory.cs | 29 + .../Interface/IRpcServerFactory.cs.meta | 11 + .../Global/Interface/ITransientRpcServer.cs | 26 + .../Interface/ITransientRpcServer.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/JsonRpc.meta | 8 + .../TouchSocket/Rpc/JsonRpc/Attribute.meta | 8 + .../Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs | 51 + .../Attribute/JsonRpcAttribute.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/JsonRpc/Common.meta | 8 + .../Rpc/JsonRpc/Common/JsonResponseContext.cs | 60 + .../Common/JsonResponseContext.cs.meta | 11 + .../Rpc/JsonRpc/Common/JsonRpcCallContext.cs | 71 + .../JsonRpc/Common/JsonRpcCallContext.cs.meta | 11 + .../Rpc/JsonRpc/Common/JsonRpcContext.cs | 31 + .../Rpc/JsonRpc/Common/JsonRpcContext.cs.meta | 11 + .../Rpc/JsonRpc/Common/JsonRpcRequest.cs | 41 + .../Rpc/JsonRpc/Common/JsonRpcRequest.cs.meta | 11 + .../Rpc/JsonRpc/Common/JsonRpcResponse.cs | 57 + .../JsonRpc/Common/JsonRpcResponse.cs.meta | 11 + .../Rpc/JsonRpc/Common/JsonRpcWaitResult.cs | 23 + .../JsonRpc/Common/JsonRpcWaitResult.cs.meta | 11 + .../TouchSocket/Rpc/JsonRpc/Components.meta | 8 + .../Rpc/JsonRpc/Components/JsonRpcClient.cs | 874 ++++++ .../JsonRpc/Components/JsonRpcClient.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/JsonRpc/Config.meta | 8 + .../JsonRpc/Config/JsonRpcConfigExtensions.cs | 79 + .../Config/JsonRpcConfigExtensions.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/JsonRpc/Enum.meta | 8 + .../_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs | 35 + .../TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs.meta | 11 + .../TouchSocket/Rpc/JsonRpc/Extensions.meta | 8 + .../JsonRpcPluginsManagerExtension.cs | 32 + .../JsonRpcPluginsManagerExtension.cs.meta | 11 + .../TouchSocket/Rpc/JsonRpc/Interface.meta | 8 + .../JsonRpc/Interface/IJsonRpcCallContext.cs | 37 + .../Interface/IJsonRpcCallContext.cs.meta | 11 + .../Rpc/JsonRpc/Interface/IJsonRpcClient.cs | 23 + .../JsonRpc/Interface/IJsonRpcClient.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/JsonRpc/Plugins.meta | 8 + .../JsonRpc/Plugins/JsonRpcParserPlugin.cs | 430 +++ .../Plugins/JsonRpcParserPlugin.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc.meta | 8 + .../TouchSocket/Rpc/TouchRpc/Attribute.meta | 8 + .../TouchRpc/Attribute/TouchRpcAttribute.cs | 42 + .../Attribute/TouchRpcAttribute.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/Channel.meta | 8 + .../Rpc/TouchRpc/Channel/Channel.cs | 745 +++++ .../Rpc/TouchRpc/Channel/Channel.cs.meta | 11 + .../Rpc/TouchRpc/Channel/ChannelPackage.cs | 68 + .../TouchRpc/Channel/ChannelPackage.cs.meta | 11 + .../Rpc/TouchRpc/Channel/ChannelStatus.cs | 55 + .../TouchRpc/Channel/ChannelStatus.cs.meta | 11 + .../Channel/WaitCreateChannelPackage.cs | 46 + .../Channel/WaitCreateChannelPackage.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc/Common.meta | 8 + .../Rpc/TouchRpc/Common/FlowOperator.cs | 120 + .../Rpc/TouchRpc/Common/FlowOperator.cs.meta | 11 + .../Rpc/TouchRpc/Common/Interface.meta | 8 + .../Common/Interface/IDependencyTouchRpc.cs | 24 + .../Interface/IDependencyTouchRpc.cs.meta | 11 + .../TouchRpc/Common/Interface/ITouchRpc.cs | 25 + .../Common/Interface/ITouchRpc.cs.meta | 11 + .../Common/Interface/ITouchRpcCallContext.cs | 39 + .../Interface/ITouchRpcCallContext.cs.meta | 11 + .../Common/Interface/ITouchRpcService.cs | 50 + .../Common/Interface/ITouchRpcService.cs.meta | 11 + .../Rpc/TouchRpc/Common/TouchRpcUtility.cs | 281 ++ .../TouchRpc/Common/TouchRpcUtility.cs.meta | 11 + .../Rpc/TouchRpc/Common/WaitPingPackage.cs | 20 + .../TouchRpc/Common/WaitPingPackage.cs.meta | 11 + .../Rpc/TouchRpc/Common/WaitSetID.cs | 50 + .../Rpc/TouchRpc/Common/WaitSetID.cs.meta | 11 + .../Rpc/TouchRpc/Common/WaitVerify.cs | 39 + .../Rpc/TouchRpc/Common/WaitVerify.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/Components.meta | 8 + .../Rpc/TouchRpc/Components/Http.meta | 8 + .../Components/Http/HttpTouchRpcClient.cs | 627 ++++ .../Http/HttpTouchRpcClient.cs.meta | 11 + .../Components/Http/HttpTouchRpcService.cs | 602 ++++ .../Http/HttpTouchRpcService.cs.meta | 11 + .../Http/HttpTouchRpcSocketClient.cs | 429 +++ .../Http/HttpTouchRpcSocketClient.cs.meta | 11 + .../TouchRpc/Components/Http/Interface.meta | 8 + .../Http/Interface/IHttpTouchRpcClient.cs | 37 + .../Interface/IHttpTouchRpcClient.cs.meta | 11 + .../Http/Interface/IHttpTouchRpcService.cs | 23 + .../Interface/IHttpTouchRpcService.cs.meta | 11 + .../Rpc/TouchRpc/Components/RpcActorGroup.cs | 128 + .../TouchRpc/Components/RpcActorGroup.cs.meta | 11 + .../Rpc/TouchRpc/Components/Tcp.meta | 8 + .../TouchRpc/Components/Tcp/Interface.meta | 8 + .../Tcp/Interface/ITcpTouchRpcClient.cs | 38 + .../Tcp/Interface/ITcpTouchRpcClient.cs.meta | 11 + .../Tcp/Interface/ITcpTouchRpcService.cs | 23 + .../Tcp/Interface/ITcpTouchRpcService.cs.meta | 11 + .../Components/Tcp/TcpTouchRpcClient.cs | 625 ++++ .../Components/Tcp/TcpTouchRpcClient.cs.meta | 11 + .../Components/Tcp/TcpTouchRpcService.cs | 598 ++++ .../Components/Tcp/TcpTouchRpcService.cs.meta | 11 + .../Components/Tcp/TcpTouchRpcSocketClient.cs | 407 +++ .../Tcp/TcpTouchRpcSocketClient.cs.meta | 11 + .../Rpc/TouchRpc/Components/Udp.meta | 8 + .../TouchRpc/Components/Udp/Interface.meta | 8 + .../Components/Udp/Interface/IUdpTouchRpc.cs | 23 + .../Udp/Interface/IUdpTouchRpc.cs.meta | 11 + .../TouchRpc/Components/Udp/UdpTouchRpc.cs | 385 +++ .../Components/Udp/UdpTouchRpc.cs.meta | 11 + .../Rpc/TouchRpc/Components/Websocket.meta | 8 + .../Components/Websocket/Interface.meta | 8 + .../Websocket/Interface/IWSTouchRpcClient.cs | 30 + .../Interface/IWSTouchRpcClient.cs.meta | 11 + .../Interface/IWSTouchRpcClientBase.cs | 17 + .../Interface/IWSTouchRpcClientBase.cs.meta | 11 + .../Components/Websocket/WSTouchRpcClient.cs | 731 +++++ .../Websocket/WSTouchRpcClient.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc/Config.meta | 8 + .../Config/TouchRpcConfigExtensions.cs | 284 ++ .../Config/TouchRpcConfigExtensions.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc/Enum.meta | 8 + .../Rpc/TouchRpc/Enum/RouteType.cs | 119 + .../Rpc/TouchRpc/Enum/RouteType.cs.meta | 11 + .../Rpc/TouchRpc/Enum/TransferFlags.cs | 45 + .../Rpc/TouchRpc/Enum/TransferFlags.cs.meta | 11 + .../Rpc/TouchRpc/Enum/TransferType.cs | 70 + .../Rpc/TouchRpc/Enum/TransferType.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/EventArgs.meta | 8 + .../EventArgs/FileOperationEventArgs.cs | 120 + .../EventArgs/FileOperationEventArgs.cs.meta | 11 + .../EventArgs/FileTransferStatusEventArgs.cs | 64 + .../FileTransferStatusEventArgs.cs.meta | 11 + .../EventArgs/HttpVerifyOptionEventArgs.cs | 37 + .../HttpVerifyOptionEventArgs.cs.meta | 11 + .../EventArgs/PackageRouterEventArgs.cs | 44 + .../EventArgs/PackageRouterEventArgs.cs.meta | 11 + .../EventArgs/ProtocolDataEventArgs.cs | 43 + .../EventArgs/ProtocolDataEventArgs.cs.meta | 11 + .../Rpc/TouchRpc/EventArgs/StreamEventArgs.cs | 50 + .../EventArgs/StreamEventArgs.cs.meta | 11 + .../EventArgs/StreamOperationEventArgs.cs | 40 + .../StreamOperationEventArgs.cs.meta | 11 + .../EventArgs/StreamStatusEventArgs.cs | 40 + .../EventArgs/StreamStatusEventArgs.cs.meta | 11 + .../EventArgs/VerifyOptionEventArgs.cs | 45 + .../EventArgs/VerifyOptionEventArgs.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/Exceptions.meta | 8 + .../TouchRpc/Exceptions/ProtocolException.cs | 51 + .../Exceptions/ProtocolException.cs.meta | 11 + .../Exceptions/TokenVerifyException.cs | 52 + .../Exceptions/TokenVerifyException.cs.meta | 11 + .../TouchRpc/Exceptions/TouchRpcExceptions.cs | 113 + .../Exceptions/TouchRpcExceptions.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/Extensions.meta | 8 + .../TouchRpc/Extensions/RpcActorExtensions.cs | 244 ++ .../Extensions/RpcActorExtensions.cs.meta | 11 + .../Extensions/TouchRpcContainerExtension.cs | 60 + .../TouchRpcContainerExtension.cs.meta | 11 + .../TouchRpc/Extensions/TouchRpcExtensions.cs | 334 +++ .../Extensions/TouchRpcExtensions.cs.meta | 11 + .../TouchRpcPluginsManagerExtension.cs | 47 + .../TouchRpcPluginsManagerExtension.cs.meta | 11 + .../Extensions/TouchRpcServiceExtension.cs | 53 + .../TouchRpcServiceExtension.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc/File.meta | 8 + .../Rpc/TouchRpc/File/FileOperator.cs | 39 + .../Rpc/TouchRpc/File/FileOperator.cs.meta | 11 + .../TouchRpc/File/FileResourceController.cs | 131 + .../File/FileResourceController.cs.meta | 11 + .../TouchRpc/File/IFileResourceController.cs | 66 + .../File/IFileResourceController.cs.meta | 11 + .../Rpc/TouchRpc/File/PullSmallFileResult.cs | 80 + .../TouchRpc/File/PullSmallFileResult.cs.meta | 11 + .../Rpc/TouchRpc/File/RemoteFileInfo.cs | 72 + .../Rpc/TouchRpc/File/RemoteFileInfo.cs.meta | 11 + .../Rpc/TouchRpc/File/RemoteFileOperator.cs | 25 + .../TouchRpc/File/RemoteFileOperator.cs.meta | 11 + .../Rpc/TouchRpc/File/RemoteFileSystemInfo.cs | 76 + .../File/RemoteFileSystemInfo.cs.meta | 11 + .../Rpc/TouchRpc/File/TouchRpcFileInfo.cs | 42 + .../TouchRpc/File/TouchRpcFileInfo.cs.meta | 11 + .../Rpc/TouchRpc/File/TouchRpcFileStream.cs | 131 + .../TouchRpc/File/TouchRpcFileStream.cs.meta | 11 + .../Rpc/TouchRpc/File/WaitFileInfoPackage.cs | 77 + .../TouchRpc/File/WaitFileInfoPackage.cs.meta | 11 + .../TouchRpc/File/WaitPushFileAckPackage.cs | 20 + .../File/WaitPushFileAckPackage.cs.meta | 11 + .../Rpc/TouchRpc/File/WaitSmallFilePackage.cs | 43 + .../File/WaitSmallFilePackage.cs.meta | 11 + .../Rpc/TouchRpc/File/WaitTransferPackage.cs | 60 + .../TouchRpc/File/WaitTransferPackage.cs.meta | 11 + .../Rpc/TouchRpc/MessageQueue.meta | 8 + .../TouchRpc/MessageQueue/DeliverEventArgs.cs | 23 + .../MessageQueue/DeliverEventArgs.cs.meta | 11 + .../MessageQueue/MessageQueueClient.cs | 49 + .../MessageQueue/MessageQueueClient.cs.meta | 11 + .../MessageQueueClientExtensions.cs | 41 + .../MessageQueueClientExtensions.cs.meta | 11 + .../MessageQueue/MessageQueuePlugin.cs | 58 + .../MessageQueue/MessageQueuePlugin.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/Plugins.meta | 8 + .../Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs | 152 + .../TouchRpc/Plugins/ITouchRpcPlugin.cs.meta | 11 + .../TouchRpc/Plugins/TouchRpcActionPlugin.cs | 182 ++ .../Plugins/TouchRpcActionPlugin.cs.meta | 11 + .../Plugins/TouchRpcHeartbeatPlugin.cs | 119 + .../Plugins/TouchRpcHeartbeatPlugin.cs.meta | 11 + .../TouchRpc/Plugins/TouchRpcPluginBase.cs | 275 ++ .../Plugins/TouchRpcPluginBase.cs.meta | 11 + .../TouchRpc/Plugins/WSTouchRpcPluginBase.cs | 298 ++ .../Plugins/WSTouchRpcPluginBase.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc/Redis.meta | 8 + .../Rpc/TouchRpc/Redis/RedisClient.cs | 576 ++++ .../Rpc/TouchRpc/Redis/RedisClient.cs.meta | 11 + .../TouchRpc/Redis/RedisClientExtensions.cs | 41 + .../Redis/RedisClientExtensions.cs.meta | 11 + .../Rpc/TouchRpc/Redis/RedisPackageType.cs | 24 + .../TouchRpc/Redis/RedisPackageType.cs.meta | 11 + .../Rpc/TouchRpc/Redis/RedisPlugin.cs | 181 ++ .../Rpc/TouchRpc/Redis/RedisPlugin.cs.meta | 11 + .../TouchRpc/Redis/RedisRequestWaitPackage.cs | 51 + .../Redis/RedisRequestWaitPackage.cs.meta | 11 + .../Redis/RedisResponseWaitPackage.cs | 33 + .../Redis/RedisResponseWaitPackage.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc/Rpc.meta | 8 + .../Rpc/TouchRpc/Rpc/CanceledPackage.cs | 32 + .../Rpc/TouchRpc/Rpc/CanceledPackage.cs.meta | 11 + .../Rpc/TouchRpc/Rpc/InvokeOption.cs | 104 + .../Rpc/TouchRpc/Rpc/InvokeOption.cs.meta | 11 + .../Rpc/TouchRpc/Rpc/Serialization.meta | 8 + .../DefaultSerializationSelector.cs | 96 + .../DefaultSerializationSelector.cs.meta | 11 + .../Serialization/SerializationSelector.cs | 40 + .../SerializationSelector.cs.meta | 11 + .../Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs | 74 + .../TouchRpc/Rpc/TouchRpcCallContext.cs.meta | 11 + .../Rpc/TouchRpc/Rpc/TouchRpcPackage.cs | 130 + .../Rpc/TouchRpc/Rpc/TouchRpcPackage.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs | 48 + .../Rpc/TouchRpc/Rpc/UdpCaller.cs.meta | 11 + .../TouchSocket/Rpc/TouchRpc/RpcActor.meta | 8 + .../Rpc/TouchRpc/RpcActor/Interface.meta | 8 + .../TouchRpc/RpcActor/Interface/IDRpcActor.cs | 125 + .../RpcActor/Interface/IDRpcActor.cs.meta | 11 + .../TouchRpc/RpcActor/Interface/IRpcActor.cs | 160 + .../RpcActor/Interface/IRpcActor.cs.meta | 11 + .../RpcActor/Interface/IRpcActorBase.cs | 40 + .../RpcActor/Interface/IRpcActorBase.cs.meta | 11 + .../RpcActor/Interface/IRpcActorSender.cs | 32 + .../Interface/IRpcActorSender.cs.meta | 11 + .../RpcActor/Interface/ITargetRpcActor.cs | 137 + .../Interface/ITargetRpcActor.cs.meta | 11 + .../RpcActor/Interface/ITargetRpcClient.cs | 113 + .../Interface/ITargetRpcClient.cs.meta | 11 + .../Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs | 228 ++ .../RpcActor/RpcActor-Channel.cs.meta | 11 + .../Rpc/TouchRpc/RpcActor/RpcActor-File.cs | 1220 ++++++++ .../TouchRpc/RpcActor/RpcActor-File.cs.meta | 11 + .../Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs | 1085 +++++++ .../TouchRpc/RpcActor/RpcActor-Rpc.cs.meta | 11 + .../Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs | 295 ++ .../TouchRpc/RpcActor/RpcActor-Stream.cs.meta | 11 + .../Rpc/TouchRpc/RpcActor/RpcActor.cs | 1387 +++++++++ .../Rpc/TouchRpc/RpcActor/RpcActor.cs.meta | 11 + .../Rpc/TouchRpc/RpcActor/Udp.meta | 8 + .../Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs | 40 + .../TouchRpc/RpcActor/Udp/UdpRpcActor.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/TouchRpc/Stream.meta | 8 + .../Rpc/TouchRpc/Stream/StreamInfo.cs | 41 + .../Rpc/TouchRpc/Stream/StreamInfo.cs.meta | 11 + .../Rpc/TouchRpc/Stream/StreamOperator.cs | 24 + .../TouchRpc/Stream/StreamOperator.cs.meta | 11 + .../Rpc/TouchRpc/Stream/WaitStream.cs | 42 + .../Rpc/TouchRpc/Stream/WaitStream.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/WebApi.meta | 8 + .../TouchSocket/Rpc/WebApi/Attribute.meta | 8 + .../Rpc/WebApi/Attribute/OriginAttribute.cs | 57 + .../WebApi/Attribute/OriginAttribute.cs.meta | 11 + .../Rpc/WebApi/Attribute/RouterAttribute.cs | 51 + .../WebApi/Attribute/RouterAttribute.cs.meta | 11 + .../Rpc/WebApi/Attribute/WebApiAttribute.cs | 163 ++ .../WebApi/Attribute/WebApiAttribute.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/WebApi/Common.meta | 8 + .../Rpc/WebApi/Common/ActionResult.cs | 31 + .../Rpc/WebApi/Common/ActionResult.cs.meta | 11 + .../Rpc/WebApi/Common/WebApiCallContext.cs | 56 + .../WebApi/Common/WebApiCallContext.cs.meta | 11 + .../TouchSocket/Rpc/WebApi/Components.meta | 8 + .../Rpc/WebApi/Components/WebApiClient.cs | 255 ++ .../WebApi/Components/WebApiClient.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/WebApi/Config.meta | 8 + .../WebApi/Config/WebApiConfigExtensions.cs | 47 + .../Config/WebApiConfigExtensions.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/WebApi/Enum.meta | 8 + .../Rpc/WebApi/Enum/HttpMethodType.cs | 36 + .../Rpc/WebApi/Enum/HttpMethodType.cs.meta | 11 + .../TouchSocket/Rpc/WebApi/Extensions.meta | 8 + .../WebApiPluginsManagerExtension.cs | 32 + .../WebApiPluginsManagerExtension.cs.meta | 11 + .../TouchSocket/Rpc/WebApi/Interface.meta | 8 + .../Rpc/WebApi/Interface/IHttpCallContext.cs | 27 + .../WebApi/Interface/IHttpCallContext.cs.meta | 11 + .../WebApi/Interface/IWebApiCallContext.cs | 22 + .../Interface/IWebApiCallContext.cs.meta | 11 + .../Rpc/WebApi/Interface/IWebApiClient.cs | 24 + .../WebApi/Interface/IWebApiClient.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/WebApi/Plugins.meta | 8 + .../Rpc/WebApi/Plugins/WebApiParserPlugin.cs | 358 +++ .../WebApi/Plugins/WebApiParserPlugin.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/XmlRpc.meta | 8 + .../TouchSocket/Rpc/XmlRpc/Attribute.meta | 8 + .../Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs | 52 + .../XmlRpc/Attribute/XmlRpcAttribute.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/XmlRpc/Common.meta | 8 + .../Rpc/XmlRpc/Common/XmlDataTool.cs | 259 ++ .../Rpc/XmlRpc/Common/XmlDataTool.cs.meta | 11 + .../Rpc/XmlRpc/Common/XmlRpcCallContext.cs | 45 + .../XmlRpc/Common/XmlRpcCallContext.cs.meta | 11 + .../TouchSocket/Rpc/XmlRpc/Components.meta | 8 + .../Rpc/XmlRpc/Components/XmlRpcClient.cs | 183 ++ .../XmlRpc/Components/XmlRpcClient.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/XmlRpc/Config.meta | 8 + .../XmlRpc/Config/XmlRpcConfigExtensions.cs | 47 + .../Config/XmlRpcConfigExtensions.cs.meta | 11 + .../TouchSocket/Rpc/XmlRpc/Extensions.meta | 8 + .../XmlRpcPluginsManagerExtension.cs | 32 + .../XmlRpcPluginsManagerExtension.cs.meta | 11 + .../TouchSocket/Rpc/XmlRpc/Interface.meta | 8 + .../XmlRpc/Interface/IXmlRpcCallContext.cs | 27 + .../Interface/IXmlRpcCallContext.cs.meta | 11 + .../Rpc/XmlRpc/Interface/IXmlRpcClient.cs | 24 + .../XmlRpc/Interface/IXmlRpcClient.cs.meta | 11 + .../_3rd/TouchSocket/Rpc/XmlRpc/Plugins.meta | 8 + .../Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs | 217 ++ .../XmlRpc/Plugins/XmlRpcParserPlugin.cs.meta | 11 + .../HandDriver/_3rd/TouchSocket/Sockets.meta | 8 + .../_3rd/TouchSocket/Sockets/BaseSocket.cs | 58 + .../TouchSocket/Sockets/BaseSocket.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Common.meta | 8 + .../TouchSocket/Sockets/Common/DelaySender.cs | 204 ++ .../Sockets/Common/DelaySender.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Common/IPHost.cs | 214 ++ .../TouchSocket/Sockets/Common/IPHost.cs.meta | 11 + .../Sockets/Common/KeepAliveValue.cs | 54 + .../Sockets/Common/KeepAliveValue.cs.meta | 11 + .../Sockets/Common/NetworkMonitor.cs | 48 + .../Sockets/Common/NetworkMonitor.cs.meta | 11 + .../TouchSocket/Sockets/Common/Options.meta | 8 + .../Sockets/Common/Options/ClientSslOption.cs | 49 + .../Common/Options/ClientSslOption.cs.meta | 11 + .../Common/Options/DelaySenderOption.cs | 31 + .../Common/Options/DelaySenderOption.cs.meta | 11 + .../Common/Options/ServiceSslOption.cs | 44 + .../Common/Options/ServiceSslOption.cs.meta | 11 + .../Sockets/Common/Options/SslOption.cs | 54 + .../Sockets/Common/Options/SslOption.cs.meta | 11 + .../TouchSocket/Sockets/Common/Protocol.cs | 132 + .../Sockets/Common/Protocol.cs.meta | 11 + .../Sockets/Common/SocketCliectCollection.cs | 156 + .../Common/SocketCliectCollection.cs.meta | 11 + .../Sockets/Common/TouchSocketUtility.cs | 105 + .../Sockets/Common/TouchSocketUtility.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Components.meta | 8 + .../Sockets/Components/Factory.meta | 8 + .../Components/Factory/ClientFactory.cs | 182 ++ .../Components/Factory/ClientFactory.cs.meta | 11 + .../Components/Factory/TcpClientFactory.cs | 273 ++ .../Factory/TcpClientFactory.cs.meta | 11 + .../TouchSocket/Sockets/Components/NAT.meta | 8 + .../Sockets/Components/NAT/NATService.cs | 84 + .../Sockets/Components/NAT/NATService.cs.meta | 11 + .../Sockets/Components/NAT/NATSocketClient.cs | 134 + .../Components/NAT/NATSocketClient.cs.meta | 11 + .../TouchSocket/Sockets/Components/TCP.meta | 8 + .../Sockets/Components/TCP/SocketClient.cs | 964 +++++++ .../Components/TCP/SocketClient.cs.meta | 11 + .../Sockets/Components/TCP/TcpClient.cs | 1086 +++++++ .../Sockets/Components/TCP/TcpClient.cs.meta | 11 + .../Sockets/Components/TCP/TcpService.cs | 723 +++++ .../Sockets/Components/TCP/TcpService.cs.meta | 11 + .../Sockets/Components/TCP/TcpServiceBase.cs | 289 ++ .../Components/TCP/TcpServiceBase.cs.meta | 11 + .../TouchSocket/Sockets/Components/UDP.meta | 8 + .../Sockets/Components/UDP/UdpSession.cs | 885 ++++++ .../Sockets/Components/UDP/UdpSession.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Config.meta | 8 + .../Config/TouchSocketConfigExtension.cs | 623 ++++ .../Config/TouchSocketConfigExtension.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/DataAdapter.meta | 8 + .../DataAdapter/CacheDataHandlingAdapter.cs | 103 + .../CacheDataHandlingAdapter.cs.meta | 11 + .../Sockets/DataAdapter/Custom.meta | 8 + .../CustomBetweenAndDataHandlingAdapter.cs | 172 ++ ...ustomBetweenAndDataHandlingAdapter.cs.meta | 11 + ...CustomBigFixedHeaderDataHandlingAdapter.cs | 169 ++ ...mBigFixedHeaderDataHandlingAdapter.cs.meta | 11 + .../Custom/CustomDataHandlingAdapter.cs | 201 ++ .../Custom/CustomDataHandlingAdapter.cs.meta | 11 + .../CustomFixedHeaderDataHandlingAdapter.cs | 127 + ...stomFixedHeaderDataHandlingAdapter.cs.meta | 11 + .../CustomUnfixedHeaderDataHandlingAdapter.cs | 117 + ...omUnfixedHeaderDataHandlingAdapter.cs.meta | 11 + .../DataAdapter/DataHandlingAdapter.cs | 221 ++ .../DataAdapter/DataHandlingAdapter.cs.meta | 11 + .../JsonStringDataHandlingAdapter.cs | 154 + .../JsonStringDataHandlingAdapter.cs.meta | 11 + .../DataAdapter/NormalDataHandlingAdapter.cs | 80 + .../NormalDataHandlingAdapter.cs.meta | 11 + .../Sockets/DataAdapter/Package.meta | 8 + .../Package/FixedHeaderPackageAdapter.cs | 348 +++ .../Package/FixedHeaderPackageAdapter.cs.meta | 11 + .../Package/FixedSizePackageAdapter.cs | 225 ++ .../Package/FixedSizePackageAdapter.cs.meta | 11 + .../Package/TerminatorPackageAdapter.cs | 243 ++ .../Package/TerminatorPackageAdapter.cs.meta | 11 + .../PipelineDataHandlingAdapter.cs | 159 + .../PipelineDataHandlingAdapter.cs.meta | 11 + .../TouchSocket/Sockets/DataAdapter/Test.meta | 8 + .../DataAdapter/Test/DataAdapterTester.cs | 368 +++ .../Test/DataAdapterTester.cs.meta | 11 + .../TouchSocket/Sockets/DataAdapter/Udp.meta | 8 + .../Udp/NormalUdpDataHandlingAdapter.cs | 101 + .../Udp/NormalUdpDataHandlingAdapter.cs.meta | 11 + .../DataAdapter/Udp/UdpDataHandlingAdapter.cs | 182 ++ .../Udp/UdpDataHandlingAdapter.cs.meta | 11 + .../DataAdapter/Udp/UdpKcpPackageAdapter.cs | 29 + .../Udp/UdpKcpPackageAdapter.cs.meta | 11 + .../DataAdapter/Udp/UdpPackageAdapter.cs | 388 +++ .../DataAdapter/Udp/UdpPackageAdapter.cs.meta | 11 + .../TouchSocket/Sockets/DelegateCollection.cs | 85 + .../Sockets/DelegateCollection.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Enum.meta | 8 + .../Sockets/Enum/CheckClearType.cs | 36 + .../Sockets/Enum/CheckClearType.cs.meta | 11 + .../TouchSocket/Sockets/Enum/FilterResult.cs | 38 + .../Sockets/Enum/FilterResult.cs.meta | 11 + .../Sockets/Enum/FixedHeaderType.cs | 35 + .../Sockets/Enum/FixedHeaderType.cs.meta | 11 + .../TouchSocket/Sockets/Enum/ReceiveType.cs | 31 + .../Sockets/Enum/ReceiveType.cs.meta | 11 + .../TouchSocket/Sockets/Enum/ServerState.cs | 45 + .../Sockets/Enum/ServerState.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/EventArgs.meta | 8 + .../Sockets/EventArgs/ByteBlockEventArgs.cs | 35 + .../EventArgs/ByteBlockEventArgs.cs.meta | 11 + .../Sockets/EventArgs/BytesEventArgs.cs | 37 + .../Sockets/EventArgs/BytesEventArgs.cs.meta | 11 + .../Sockets/EventArgs/ConfigEventArgs.cs | 36 + .../Sockets/EventArgs/ConfigEventArgs.cs.meta | 11 + .../Sockets/EventArgs/ConnectingEventArgs.cs | 48 + .../EventArgs/ConnectingEventArgs.cs.meta | 11 + .../Sockets/EventArgs/DisconnectEventArgs.cs | 47 + .../EventArgs/DisconnectEventArgs.cs.meta | 11 + .../Sockets/EventArgs/IDChangedEventArgs.cs | 43 + .../EventArgs/IDChangedEventArgs.cs.meta | 11 + .../Sockets/EventArgs/MsgEventArgs.cs | 44 + .../Sockets/EventArgs/MsgEventArgs.cs.meta | 11 + .../Sockets/EventArgs/OperationEventArgs.cs | 44 + .../EventArgs/OperationEventArgs.cs.meta | 11 + .../EventArgs/ReceivedDataEventArgs.cs | 37 + .../EventArgs/ReceivedDataEventArgs.cs.meta | 11 + .../Sockets/EventArgs/SendingEventArgs.cs | 51 + .../EventArgs/SendingEventArgs.cs.meta | 11 + .../EventArgs/ServiceStateEventArgs.cs | 36 + .../EventArgs/ServiceStateEventArgs.cs.meta | 11 + .../EventArgs/UdpReceivedDataEventArgs.cs | 39 + .../UdpReceivedDataEventArgs.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Exceptions.meta | 8 + .../Exceptions/ClientNotFindException.cs | 52 + .../Exceptions/ClientNotFindException.cs.meta | 11 + .../Exceptions/NotConnectedException.cs | 52 + .../Exceptions/NotConnectedException.cs.meta | 11 + .../Sockets/Exceptions/OverlengthException.cs | 52 + .../Exceptions/OverlengthException.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Extensions.meta | 8 + .../Sockets/Extensions/ClientExtension.cs | 157 + .../Extensions/ClientExtension.cs.meta | 11 + .../Sockets/Extensions/SenderExtension.cs | 353 +++ .../Extensions/SenderExtension.cs.meta | 11 + .../Sockets/Extensions/SocketExtension.cs | 47 + .../Extensions/SocketExtension.cs.meta | 11 + .../SocketPluginsManagerExtension.cs | 138 + .../SocketPluginsManagerExtension.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Interface.meta | 8 + .../TouchSocket/Sockets/Interface/IClient.cs | 58 + .../Sockets/Interface/IClient.cs.meta | 11 + .../Sockets/Interface/INATSocketClient.cs | 42 + .../Interface/INATSocketClient.cs.meta | 11 + .../Sockets/Interface/IRequestInfo.cs | 22 + .../Sockets/Interface/IRequestInfo.cs.meta | 11 + .../Sockets/Interface/ISender.meta | 8 + .../Interface/ISender/IClientSender.cs | 45 + .../Interface/ISender/IClientSender.cs.meta | 11 + .../Interface/ISender/IDefaultSender.cs | 45 + .../Interface/ISender/IDefaultSender.cs.meta | 11 + .../Interface/ISender/IIDRequsetInfoSender.cs | 49 + .../ISender/IIDRequsetInfoSender.cs.meta | 11 + .../Sockets/Interface/ISender/IIDSender.cs | 67 + .../Interface/ISender/IIDSender.cs.meta | 11 + .../Interface/ISender/IRequsetInfoSender.cs | 45 + .../ISender/IRequsetInfoSender.cs.meta | 11 + .../Sockets/Interface/ISender/ISender.cs | 51 + .../Sockets/Interface/ISender/ISender.cs.meta | 11 + .../Sockets/Interface/ISender/ISenderBase.cs | 26 + .../Interface/ISender/ISenderBase.cs.meta | 11 + .../Interface/ISender/IUdpClientSender.cs | 78 + .../ISender/IUdpClientSender.cs.meta | 11 + .../Interface/ISender/IUdpDefaultSender.cs | 48 + .../ISender/IUdpDefaultSender.cs.meta | 11 + .../Sockets/Interface/ISender/IWaitSender.cs | 101 + .../Interface/ISender/IWaitSender.cs.meta | 11 + .../TouchSocket/Sockets/Interface/IService.cs | 71 + .../Sockets/Interface/IService.cs.meta | 11 + .../TouchSocket/Sockets/Interface/ISocket.cs | 33 + .../Sockets/Interface/ISocket.cs.meta | 11 + .../Sockets/Interface/ISocketClient.cs | 47 + .../Sockets/Interface/ISocketClient.cs.meta | 11 + .../Sockets/Interface/ITcpClient.cs | 68 + .../Sockets/Interface/ITcpClient.cs.meta | 11 + .../Sockets/Interface/ITcpClientBase.cs | 120 + .../Sockets/Interface/ITcpClientBase.cs.meta | 11 + .../Sockets/Interface/ITcpService.cs | 110 + .../Sockets/Interface/ITcpService.cs.meta | 11 + .../Sockets/Interface/IUdpSession.cs | 49 + .../Sockets/Interface/IUdpSession.cs.meta | 11 + .../Sockets/Interface/Plugins.meta | 8 + .../Interface/Plugins/IConfigPlugin.cs | 54 + .../Interface/Plugins/IConfigPlugin.cs.meta | 11 + .../Interface/Plugins/IConnectedPlugin.cs | 31 + .../Plugins/IConnectedPlugin.cs.meta | 11 + .../Interface/Plugins/IConnectingPlugin.cs | 31 + .../Plugins/IConnectingPlugin.cs.meta | 11 + .../Interface/Plugins/IDisconnectedPlguin.cs | 31 + .../Plugins/IDisconnectedPlguin.cs.meta | 11 + .../Interface/Plugins/IDisconnectingPlugin.cs | 37 + .../Plugins/IDisconnectingPlugin.cs.meta | 11 + .../Interface/Plugins/IServicePlugin.cs | 48 + .../Interface/Plugins/IServicePlugin.cs.meta | 11 + .../Sockets/Interface/Plugins/ITcpPlugin.cs | 87 + .../Interface/Plugins/ITcpPlugin.cs.meta | 11 + .../Interface/Plugins/IUdpSessionPlugin.cs | 39 + .../Plugins/IUdpSessionPlugin.cs.meta | 11 + .../_3rd/TouchSocket/Sockets/Plugins.meta | 8 + .../Sockets/Plugins/CheckClearPlugin.cs | 116 + .../Sockets/Plugins/CheckClearPlugin.cs.meta | 11 + .../Sockets/Plugins/ReconnectionPlugin.cs | 70 + .../Plugins/ReconnectionPlugin.cs.meta | 11 + .../Sockets/Plugins/ServicePlugin.cs | 75 + .../Sockets/Plugins/ServicePlugin.cs.meta | 11 + .../Sockets/Plugins/TcpCommandLinePlugin.cs | 118 + .../Plugins/TcpCommandLinePlugin.cs.meta | 11 + .../Sockets/Plugins/TcpPluginBase.cs | 325 +++ .../Sockets/Plugins/TcpPluginBase.cs.meta | 11 + .../Sockets/Plugins/UdpSessionPluginBase.cs | 80 + .../Plugins/UdpSessionPluginBase.cs.meta | 11 + .../TouchSocket/Sockets/WaitingClient.meta | 8 + .../Sockets/WaitingClient/IWaitingClient.cs | 111 + .../WaitingClient/IWaitingClient.cs.meta | 11 + .../Sockets/WaitingClient/ResponsedData.cs | 45 + .../WaitingClient/ResponsedData.cs.meta | 11 + .../Sockets/WaitingClient/WaitingClient.cs | 382 +++ .../WaitingClient/WaitingClient.cs.meta | 11 + .../WaitingClient/WaitingClientExtension.cs | 36 + .../WaitingClientExtension.cs.meta | 11 + .../Sockets/WaitingClient/WaitingOptions.cs | 66 + .../WaitingClient/WaitingOptions.cs.meta | 11 + Assets/HandDriverUPM/HandDriver/package.json | 10 + .../HandDriver/package.json.meta | 7 + Assets/HandDriverUPM/NaughtyAttributes.meta | 8 + .../HandDriverUPM/NaughtyAttributes/Core.meta | 8 + .../Core/DrawerAttributes.meta | 8 + .../DrawerAttributes/AllowNestingAttribute.cs | 9 + .../AllowNestingAttribute.cs.meta | 11 + .../AnimatorParamAttribute.cs | 24 + .../AnimatorParamAttribute.cs.meta | 11 + .../DrawerAttributes/CurveRangeAttribute.cs | 30 + .../CurveRangeAttribute.cs.meta | 11 + .../Core/DrawerAttributes/DrawerAttribute.cs | 11 + .../DrawerAttributes/DrawerAttribute.cs.meta | 11 + .../DrawerAttributes/DropdownAttribute.cs | 57 + .../DropdownAttribute.cs.meta | 11 + .../DrawerAttributes/EnumFlagsAttribute.cs | 9 + .../EnumFlagsAttribute.cs.meta | 11 + .../Core/DrawerAttributes/Expandable.cs | 9 + .../Core/DrawerAttributes/Expandable.cs.meta | 11 + .../HorizontalLineAttribute.cs | 20 + .../HorizontalLineAttribute.cs.meta | 11 + .../Core/DrawerAttributes/InfoBoxAttribute.cs | 24 + .../DrawerAttributes/InfoBoxAttribute.cs.meta | 11 + .../DrawerAttributes/InputAxisAttribute.cs | 9 + .../InputAxisAttribute.cs.meta | 11 + .../Core/DrawerAttributes/LayerAttribute.cs | 9 + .../DrawerAttributes/LayerAttribute.cs.meta | 11 + .../DrawerAttributes/MinMaxSliderAttribute.cs | 17 + .../MinMaxSliderAttribute.cs.meta | 11 + .../DrawerAttributes/ProgressBarAttribute.cs | 37 + .../ProgressBarAttribute.cs.meta | 11 + .../ResizableTextAreaAttribute.cs | 9 + .../ResizableTextAreaAttribute.cs.meta | 11 + .../Core/DrawerAttributes/SceneAttribute.cs | 9 + .../DrawerAttributes/SceneAttribute.cs.meta | 11 + .../ShowAssetPreviewAttribute.cs | 20 + .../ShowAssetPreviewAttribute.cs.meta | 11 + .../Core/DrawerAttributes/TagAttribute.cs | 9 + .../DrawerAttributes/TagAttribute.cs.meta | 11 + .../Core/DrawerAttributes_SpecialCase.meta | 8 + .../ButtonAttribute.cs | 33 + .../ButtonAttribute.cs.meta | 11 + .../ReorderableListAttribute.cs | 9 + .../ReorderableListAttribute.cs.meta | 11 + .../ShowNativePropertyAttribute.cs | 9 + .../ShowNativePropertyAttribute.cs.meta | 11 + .../ShowNonSerializedFieldAttribute.cs | 9 + .../ShowNonSerializedFieldAttribute.cs.meta | 11 + .../SpecialCaseDrawerAttribute.cs | 8 + .../SpecialCaseDrawerAttribute.cs.meta | 11 + .../Core/INaughtyAttribute.cs | 8 + .../Core/INaughtyAttribute.cs.meta | 11 + .../Core/MetaAttributes.meta | 8 + .../Core/MetaAttributes/BoxGroupAttribute.cs | 15 + .../MetaAttributes/BoxGroupAttribute.cs.meta | 11 + .../Core/MetaAttributes/DisableIfAttribute.cs | 26 + .../MetaAttributes/DisableIfAttribute.cs.meta | 11 + .../Core/MetaAttributes/EnableIfAttribute.cs | 26 + .../MetaAttributes/EnableIfAttribute.cs.meta | 11 + .../MetaAttributes/EnableIfAttributeBase.cs | 39 + .../EnableIfAttributeBase.cs.meta | 11 + .../Core/MetaAttributes/FoldoutAttribute.cs | 15 + .../MetaAttributes/FoldoutAttribute.cs.meta | 11 + .../Core/MetaAttributes/HideIfAttribute.cs | 26 + .../MetaAttributes/HideIfAttribute.cs.meta | 11 + .../Core/MetaAttributes/IGroupAttribute.cs | 8 + .../MetaAttributes/IGroupAttribute.cs.meta | 11 + .../Core/MetaAttributes/LabelAttribute.cs | 15 + .../MetaAttributes/LabelAttribute.cs.meta | 11 + .../Core/MetaAttributes/MetaAttribute.cs | 8 + .../Core/MetaAttributes/MetaAttribute.cs.meta | 11 + .../MetaAttributes/OnValueChangedAttribute.cs | 15 + .../OnValueChangedAttribute.cs.meta | 11 + .../Core/MetaAttributes/ReadOnlyAttribute.cs | 10 + .../MetaAttributes/ReadOnlyAttribute.cs.meta | 11 + .../Core/MetaAttributes/ShowIfAttribute.cs | 26 + .../MetaAttributes/ShowIfAttribute.cs.meta | 11 + .../MetaAttributes/ShowIfAttributeBase.cs | 39 + .../ShowIfAttributeBase.cs.meta | 11 + .../Core/NaughtyAttributes.Core.asmdef | 12 + .../Core/NaughtyAttributes.Core.asmdef.meta | 7 + .../NaughtyAttributes/Core/Utility.meta | 8 + .../NaughtyAttributes/Core/Utility/EColor.cs | 56 + .../Core/Utility/EColor.cs.meta | 11 + .../Core/Utility/EConditionOperator.cs | 10 + .../Core/Utility/EConditionOperator.cs.meta | 11 + .../Core/ValidatorAttributes.meta | 8 + .../ValidatorAttributes/MaxValueAttribute.cs | 20 + .../MaxValueAttribute.cs.meta | 11 + .../ValidatorAttributes/MinValueAttribute.cs | 20 + .../MinValueAttribute.cs.meta | 11 + .../ValidatorAttributes/RequiredAttribute.cs | 15 + .../RequiredAttribute.cs.meta | 11 + .../ValidateInputAttribute.cs | 17 + .../ValidateInputAttribute.cs.meta | 11 + .../ValidatorAttributes/ValidatorAttribute.cs | 8 + .../ValidatorAttribute.cs.meta | 11 + .../NaughtyAttributes/Editor.meta | 8 + .../Editor/DecoratorDrawers.meta | 8 + .../HorizontalLineDecoratorDrawer.cs | 23 + .../HorizontalLineDecoratorDrawer.cs.meta | 11 + .../InfoBoxDecoratorDrawer.cs | 59 + .../InfoBoxDecoratorDrawer.cs.meta | 11 + .../Editor/NaughtyAttributes.Editor.asmdef | 16 + .../NaughtyAttributes.Editor.asmdef.meta | 7 + .../Editor/NaughtyInspector.cs | 301 ++ .../Editor/NaughtyInspector.cs.meta | 11 + .../Editor/NaughtyProperty.cs | 21 + .../Editor/NaughtyProperty.cs.meta | 11 + .../Editor/PropertyDrawers.meta | 8 + .../AllowNestingPropertyDrawer.cs | 16 + .../AllowNestingPropertyDrawer.cs.meta | 11 + .../AnimatorParamPropertyDrawer.cs | 181 ++ .../AnimatorParamPropertyDrawer.cs.meta | 11 + .../CurveRangePropertyDrawer.cs | 47 + .../CurveRangePropertyDrawer.cs.meta | 11 + .../PropertyDrawers/DropdownPropertyDrawer.cs | 177 ++ .../DropdownPropertyDrawer.cs.meta | 11 + .../EnumFlagsPropertyDrawer.cs | 38 + .../EnumFlagsPropertyDrawer.cs.meta | 11 + .../ExpandablePropertyDrawer.cs | 197 ++ .../ExpandablePropertyDrawer.cs.meta | 11 + .../InputAxisPropertyDrawer.cs | 77 + .../InputAxisPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/LayerPropertyDrawer.cs | 88 + .../LayerPropertyDrawer.cs.meta | 11 + .../MinMaxSliderPropertyDrawer.cs | 108 + .../MinMaxSliderPropertyDrawer.cs.meta | 11 + .../ProgressBarPropertyDrawer.cs | 162 ++ .../ProgressBarPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/PropertyDrawerBase.cs | 99 + .../PropertyDrawerBase.cs.meta | 11 + .../ResizableTextAreaPropertyDrawer.cs | 80 + .../ResizableTextAreaPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/ScenePropertyDrawer.cs | 99 + .../ScenePropertyDrawer.cs.meta | 11 + .../ShowAssetPreviewPropertyDrawer.cs | 116 + .../ShowAssetPreviewPropertyDrawer.cs.meta | 11 + .../PropertyDrawers/TagPropertyDrawer.cs | 62 + .../PropertyDrawers/TagPropertyDrawer.cs.meta | 11 + .../Editor/PropertyDrawers_SpecialCase.meta | 8 + .../ReorderableListPropertyDrawer.cs | 205 ++ .../ReorderableListPropertyDrawer.cs.meta | 11 + .../SpecialCasePropertyDrawerBase.cs | 79 + .../SpecialCasePropertyDrawerBase.cs.meta | 11 + .../Editor/PropertyValidators.meta | 8 + .../MaxValuePropertyValidator.cs | 58 + .../MaxValuePropertyValidator.cs.meta | 11 + .../MinValuePropertyValidator.cs | 58 + .../MinValuePropertyValidator.cs.meta | 11 + .../PropertyValidatorBase.cs | 38 + .../PropertyValidatorBase.cs.meta | 11 + .../RequiredPropertyValidator.cs | 36 + .../RequiredPropertyValidator.cs.meta | 11 + .../ValidateInputPropertyValidator.cs | 80 + .../ValidateInputPropertyValidator.cs.meta | 11 + .../NaughtyAttributes/Editor/Utility.meta | 10 + .../Editor/Utility/ButtonUtility.cs | 55 + .../Editor/Utility/ButtonUtility.cs.meta | 11 + .../Editor/Utility/NaughtyEditorGUI.cs | 382 +++ .../Editor/Utility/NaughtyEditorGUI.cs.meta | 13 + .../Editor/Utility/PropertyUtility.cs | 413 +++ .../Editor/Utility/PropertyUtility.cs.meta | 11 + .../Editor/Utility/ReflectionUtility.cs | 128 + .../Editor/Utility/ReflectionUtility.cs.meta | 13 + .../Editor/Utility/SavedBool.cs | 34 + .../Editor/Utility/SavedBool.cs.meta | 11 + Packages/manifest.json | 45 + Packages/packages-lock.json | 393 +++ ProjectSettings/AudioManager.asset | 19 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 34 + ProjectSettings/EditorBuildSettings.asset | 8 + ProjectSettings/EditorSettings.asset | 30 + ProjectSettings/GraphicsSettings.asset | 63 + ProjectSettings/InputManager.asset | 295 ++ ProjectSettings/MemorySettings.asset | 35 + ProjectSettings/NavMeshAreas.asset | 91 + ProjectSettings/PackageManagerSettings.asset | 35 + .../Settings.json | 7 + ProjectSettings/Physics2DSettings.asset | 56 + ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 824 ++++++ ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | 234 ++ ProjectSettings/SceneTemplateSettings.json | 121 + ProjectSettings/TagManager.asset | 43 + ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 36 + ProjectSettings/VFXManager.asset | 12 + ProjectSettings/VersionControlSettings.asset | 8 + ProjectSettings/XRSettings.asset | 10 + ProjectSettings/boot.config | 0 1332 files changed, 88056 insertions(+) create mode 100644 .gitignore create mode 100644 .vsconfig create mode 100644 Assets/HandDriverUPM.meta create mode 100644 Assets/HandDriverUPM/HandDriver.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Model.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.jpg create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.jpg.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_new.fbx create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_new.fbx.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_normal.png create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_normal.png.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_right_model.fbx create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_glove_right_model.fbx.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_gloves_prototype.fbx create mode 100644 Assets/HandDriverUPM/HandDriver/Model/vr_gloves_prototype.fbx.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Plugins/Newtonsoft.Json.dll create mode 100644 Assets/HandDriverUPM/HandDriver/Plugins/Newtonsoft.Json.dll.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Scenes.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Scenes/Sample.unity create mode 100644 Assets/HandDriverUPM/HandDriver/Scenes/Sample.unity.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/HandDriver.cs create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/HandDriver.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/Network.cs create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/Network.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs create mode 100644 Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs create mode 100644 Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs.meta create mode 100644 Assets/HandDriverUPM/HandDriver/package.json create mode 100644 Assets/HandDriverUPM/HandDriver/package.json.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/Utility.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs.meta create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs create mode 100644 Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs.meta create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/SceneTemplateSettings.json create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/VersionControlSettings.asset create mode 100644 ProjectSettings/XRSettings.asset create mode 100644 ProjectSettings/boot.config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ee689d --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Unity generated folders +[Ll]ibrary/ +[Tt]emp/ +[Oo]bj/ +[Bb]uild/ +[Bb]uilds/ +[Ll]ogs/ +UserSettings/ + +# VS / Rider +.vs/ +*.csproj +*.sln +*.user + +# Crash / build / cache +*.pidb +*.suo +*.tmp +*.unityproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..d70cd98 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/HandDriverUPM.meta b/Assets/HandDriverUPM.meta new file mode 100644 index 0000000..bcb41ab --- /dev/null +++ b/Assets/HandDriverUPM.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0cf5924dd33309449b4706b05f73c87e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver.meta b/Assets/HandDriverUPM/HandDriver.meta new file mode 100644 index 0000000..8dc34ed --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bbd9404d74d63f642829c25989306635 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Model.meta b/Assets/HandDriverUPM/HandDriver/Model.meta new file mode 100644 index 0000000..80d0bb5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Model.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bdb07b9e9393c8040b9000470b1b9119 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.jpg b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c157dbbcfbac499b5f660774f56d1c909e7911a0 GIT binary patch literal 710197 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≪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
  • 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

    ;~uAVJ&W}2FZi`H)MW0RWx;BPD1mWH9&u z!c;8g5FsAJJ55$o9`yBpK6#|rU7_FAFMa;5>XS4MFuRuw9-RhQ;6aM6d|kj%Y0pvT zY&jnW0`ZnNQY9bXq$obyc~q7zyk9k)07VX{UA_&Pu@S2*GAv-1de2WS)|OzD`yWYC zWPR$0cdm^*Pky$HHR7N$gq;zTrWtoS&Z$Yv_dNe|O0U*Shz|=3z^6dU+>K?Kld)3o z**tqTwJNjY&jECi`JM5`$XUh3%$#rl>rW3J|XNVF&2dI;+^fqEEWmT{w6c9~{=qu#w{c0BUlGe>k6?FfyZe z%gj;DIRVoCGH3kVsSW1b^=DUDGDj_JfX`TE^tu+5l^a}!(@bnSa{A}gbzNtQ`@{fy zcSZZ4NJrdsL0@@NVd>&c+Pp9Ay4*jb;qKS=kQ}z=tc#WRCzjxS=LPN*`)!NcR`ELo zgZcQGMwg1QwyBRn9YpV;`zM%RpGC&g7*2~6=j8$b)cE+x$-eg=MfpA6I=pveajGfp zA)gBu&A~94XI_2w6REEJN9@!5po^x^WM?bW+s`Q^0sE@`)XnJZHW&Q4fQpABcNY5-k5U&o;W!&m zVAFS2UdFchuD?;hL%!nN4`#3YR6~BxpQPwt&e`u_MU@WL4d$qD$`Mygcwb^R{Ly!+ z@6W4$f4XNnxYdXF^(bf%_4X}CjylnzpszaBP4#C&!qKtE=qc6qdkN%it&>1UYK4(w zuhM1dfDKBkt6maHaa*%3oKV0p9ha;Pt#aQMBo;ZON7rn{XQTYd*-ZKpuF|nuWn@o( zHkbE8bC^W5Dey$}seXp_Ui2~p*WIy~TZ!DFxCnsa6&{cI@uB~c-JIlBrZ>qvU_tB{ z)g@?6-pza8E1oCjEs?vc*x?d9{NSR){&m>DZBoXmE}QSYl|G@i5ePEf!=y1$1^yt?J>=iCo;6=ze zGvjx1ACaf}ul%*Vy5xxECQ4wsyGWmi4%a!LzFwP@P+Ia*Vz9G>qS?K#?d7F;bR^ZwJ)|7upmk8cdw8Yw1O z6%2$QXPc>0zO2mC;RDLbid0R#$gwn@3)p8t{7%*3jOHOo0yjh{)vnkdv$#=W;wcgm zdq|;B$G}>mZHApvCJNJGtJ|cUnPt30sT$(2<(B}njx-Pg+BK7>MhTBxiH_fr_%;Iw zf0y(1_4`wvbp5|dE3n_RTX)#ch0ShyBv}lvOcsyrADVDLq!UNblzE_N=vPC-`fJ_D z3bh=R$MDSVi`2@J`YJ&DoFWIVPSTCccht1%D0OzYOi4nJLQ%|?NZ@*e&61nVbCsoj z2E{M0aCZ}?#LwgN+X#VGQ;_umwL<;h?ulEHL-2L`H0aOTF>-i)$imG z@X%bP%^B7 zxm0LQU1tUnqJ5hbtnY6Ml{ARn80b#po%bX_vn#H@T<&x0Vxvuc*ga?FGAl`skSXtC z|6Z^!9aV9s>+1Y4Pq8wI50m9oa1`Bfr6ZGV+gOsjPf9y_!hvh(E70XNSOqmyJyRp9 zrE}2u)_D6@DdIJ966})nqtg{ZX{Hr{YzH?cyt1V6ZB%ZThd;ty1S9^QxrW`J5{N9l zj|8jq4O8*yPc@uTUo~C|%}X37)(jo$Y67iqFcP9>DLGWIyKy zH}xM2a0!!C1=l;2&63|j@Q4DwMirnqW6Pox?z;@4l1$6sY9q%1x0SAw0~UTJdBj4t zp43rw@d(iKjq(8?<9DWu%18@}su$5>WD*WF$1;dWW_t4INs-OQwG*&!g?9 zd&(z_^r@4;20l}c6OOUC?;(dG!(#r`*%1ne%^~A2`N@|MmGJw?W#3McZp)It;ZC~Y z8+?AJzuNaLU-r$2@|7H8;>(cef$V2#uZ1^8cuq1*PK(^N;GW?`JNd8Zi$tTOeu|+W zwrLaY)U(du#VnMI>8t6An|Xi@l`EFN5Uw})Qy@c2!}>~_jV)b6*JF#MR_jALNqN__ z86HT1MtW!FVUx~_?IF1;_U{v>>^2T_#*>CKeqkPn%4F3(3(Zd&{8%LoEBjOSvhdF? zCbMGy8p0@Jo;i*;l19e|arq2>CZ`|WDk@0NHwYR++-A#O&eK+>F%64o@5V;gY9sPr zGBwL?or_6!KK+|#6hE4U8sXMj6$!fO-pBx8GBd}5nB=lLAh|v#dE!5(c4mo!RR;$- z`ghNJK?1(0*={J9tN*J!x`TQRL0_A8FYEyjWc0IEH#u|Z^oKkD!Ea|bb}Rff?THxXulD;}PofT;u9c7_APm5)NVMk|Cc&u%74 z$^#dME;o(dB$;hT{Hpx>y)ovPXTy_F1OCRQE8bRa;o;Fi?`)}C?y#=A}m!H|LBPfV+U1fEa zjKV1x(3!73F4nSVlLp}V#elcqw6y*AS<2fa^?>=FM>$fj#2Z-SDN-Cz>ek=fU$m7_ z$2;N)9uiRn1cqRXDAN?6-JmN9x|&OOTY0oj0i`S{?vh~2+5Pm5vd&ndn_NF^xypOkM;S_^=hLXrbUvW|YLuGg(2hvt*UkN_wHt$;`r#`g(S`_jUkvx$ z=%6O46e*=@Oh8dVv;07*mr?lOxJtNs8Gg@onBo`ub}VN zC3-CK^vD0gHJP_gYr{5@J!_6B=uqfomS-l~a zS`~lt`aHF(x0>BH%nirqZbLu6dN#k)HH6i$pW&7a@W$?Q+OB{oxmQ(yG2QF}t59?0$= z$Y}(@$X!dfNH?C>kgxhqF?bu3ItP#NgrS6-9_#;^hWY6ZS$@6<_3JiqK zd>&3I$ItnbdPlDb8^)x|zaQ?A`!BZ!eZM_&p3;o$H6ju$Y?792JTxMSRJk;YdOBN&nL~Nyd?(z z>!n{-7GnHCEYV~Qd=N~0RT^fa;rrR?!)KMg>+byTJ?6C<6(cb>_c>OnZNI*y2#hb= zZ*+J!BbZ-kERJ#fjyS5NSFw)q{GM=5%!fRlG%UjZY_Hh=k3{BL4G(hC!zW0S(ASE# zI{713`^r5EWo%;v9xlGZyEu90Ur92*7)E2N)(hf0VFD6}lB2<=K^ojw_}c}4ms0XN z-j9HR7S7>zFPT~XLZL&db%u4h4$LSKRO6EjD{?BS{t zfRqe!IMyQw=bKABa37~COjhoGX<%zjJe7I!hI10bde5Oio@Z(Zl*fh~HlS1&G+W8j zHwH6M{$vN^aMgb5@5clspKf^nj&OLD_AFp~PXF!qb*UhISvTI*zhUFX2vt;#Nh{4v zx}!^eN`5jXWgK}}qSb}i^GPRMB&?I@&=4*}tcIOkY{KmFrTCX2V|6g7>0o zE&Zb?;&H{+QhwS$b_&h=e|le%yGJ(mRCy&gg-2Bh{c9zy|5xDayhfdBT;N+HwGC8# zq3ZRmnn`XW=gaR#h6A?({>J0vys-|mWB<@`$%t#mjbCa(Rce91<^CfP`b3_a*cAD~ zFqwCPep7af$yewibgukB?eF&&1AcMRgcA+jxHP%jP2I0ncz+t6%svrlAm4+AW>GIh z?%O3EI{KYg!4YFCvMcbMOl8o(+DEJ-UXnEdY6m;-H}K#tZXP1gwx`%&)Ov+@67YyU zsX1eAW?=(*dTA)+G9@bkinuv#*_MhApT9SzS6yq6V~CejXNwjXPTsZAH`$K%4e#-DQjz{yZ?6cj6Qr z`1F9zx1fHN^l2~5h?W*yHb~p|rq@cnzma1Gp9U1u6YDF7cImw1O8`odHJfcAP^1u2 zv@F6~+Pl}u$-|Z95D2Kp4E0wcO?kSJ%EG_cPvgHHLknDW$8FcT^L-&R>3qf1Qr+UX zk!Bz-^~nuO^Ypf?%)iDq>`M{qwfUj9TG4Mu)8Xiq*B5w`9HT)bHU&L%pY;wAkNNf7 zQ~+2^yzb^|Boc*KawNev$uNl3hT%AOTmQo%hSB7U1=o5&Z0dc?!0CEz$odJJ6VC_u3R)q(=gI*r?JL(UT6#`k(Rc~R zk-wyfcdZ>R!Z!B;0^$kUzoAzPqWg|&ysB9V4?`1buiqA(PTu}BS1~WH7WMv)V7NKv zUT*D71Jx~yZ#9W)Gt!Gs{~c0q*G_UKK-)kD`vr| z9)a`MTugDk_8AGU)zzt8aulz=udk1MaeeO6gxX&yn)*e{X8kDYqvkjBlDZ!mM$*LZ z>C7%F`yAEdL~mDB3_FoQG}Dk{Lfw zhfa2*V4|}sKv8!cProlCOZBK;#Sz2&3toD_a$)L?X)75R_C zdl&qVX$@Qo<+!Qn{C=kd_Sa@dk*4Mff4h=j&><2YUUv7YBip$>i3}w^!d8BA+Hj zS{n^#H=3pY@wg|S2Q@I}g&vs3(&b;5{EjD$`1@KUCuCqpe(6b#6*_P$oQ-7G+-0QY5GlbS~In+9ppQR?W1KBo`;^2U)OkKzN{y0vU&WY*Vg`1oyg3UxnukVVN2AZ0zo4gr5Lsq}b78*Rf-p1Mk)ea%Ncje!% zZij#Fnz^~t+d1-m=j`Q&Alv)fnc!`~B7#=S^~j@acgv;FTT4;I-d=-m4q~d5t=sAW zad9MV!{Jx*M~SaLKfBa}ni}bun}&OK60|zCIQ?}Ma|SyDc$u@aVrV2D8Hr>xPbv-$ zXokM~oW1|{kuuE)7^~*vX7p~CC8sd;vY2n~kc&^()FMU4MchL!6LYuN2Pf}!ckH}9 zGveZgcIP(v&usQvK&6@LCdy@{)K#pwtCW=hn(9bTCIH>kOiK{V*ja)TuS?C0Jg9L@ zM>YT;20Lp<0Kwj#pdS3x%YR$Y?hc=}t!NXKGdoIYIlC^p%MQSL?Ox-O&+>tTe`L1ez zm=c<=2$(7q{8mRV(>ILfbfsZ$Vs~@0lu{rw>tyR=i4V;)t#nGSyb7$@c*R0VC&p`U zMOQO6rQ+)|P3qL%euO7{*mP!FPpD@X?ShZOaocZzEcq)3@M1ZeI^9ZXPr9iu#zm!6 zK{Hnw-Ze>dkA^90acQJ-?AA}L1#Q?z-Drx!El4n>d()(*2wi?Tyrm@{X(FZ<-fG`h zbkn?NTo--_j&RM57n8^-XU#biGx7O3bJy{QtF6kHMkdedl}z(Z1?vj&ipauS^I2ea z0IwbU1=gwqiNF~tA?8UoeN?rCK$ZS%Qq0En1h=n=A2cwV*?UB*7j)4E?uD2=8do%x$JT@s#(kYZLc7r!# zs_odo!ho+$Xst3Cv+{IbI_m-(0IIQS{k^kNyOD0yDCU*zh!>ZeaZVHG;vjq`dupvW{%eOgQ7l-@)b{ZkpTV-v~gmx3t&pYcX2bHZmQc@5(*39Zk&w!+Y9#R#E7TuCb9*|;GRt*yj?4?&A@b58O41y&ad=0TK-Zn)bVXjoXq-9YHzzK zy>Geb<@ExzRXSyogeaUwBu;+7u&HInZa(jgvG-rX(X;4Km93G)!ZIGP=zO9LLjz7+ zr}MB=MF5|#O-0M?1bj_BL;a~~da0lol-;x-Z5wMx zN{5B6=RZ?M*ESKSCA%ENGg?X67!Rf4*VRF@bb51y9%=qB?G@>~=5k{$(yyS4xY}9| zxVb8=67Wz6foQ%_`7}PkoQP}#>QDxmUx|aFf6OJjH>#9$cC=Bn^p^*gi1zbsYs8!Gk=g74BAX%7 zJ#ry~l>vBybdS1H&pWkyXqz~z4UZ4CFZ)$1VIDrq1!-%JkC%CN{XRXuT!ut$<~gT9 z%DRCzwY3StXJn6!9^Mj_4Lix-Arbd&|0SfnM)I{vf+^s%ES7?>{sWWoMIh0!Dm6Pw zkTGuVKKM}s^+hnS6^;WRBSsnGrg3@2n53q^Z zIh1Ob(fiiO*{$^{$aaJW|5V|Z&Cld0>!xAqei)No3lTErU`U~)j7DSc7Y?iZ-A zd%Ayx4Bk&?y7}BL>U>E=u zk;ubT_MwlqqtP|d@=Zi4XPG=0^%O7Mwyr+@h6}@Cq}XIGHtYEqWW$+~ohV|n&XO8D z%`Rr-vpYo|W!>T;c*<8S>wU!Zktff-9`~jl3B3%M6K|K^xzSy{AwW-M$?WC}eM{V# z(-HVNgij09`%t*Fc9UranE(`RLF&+%Kjx|9v0qZ~fKL%}5M=vPkb;bGQOxzxk|MP% zui6e52i9@DzVc4wmacBG&?7MQ0WCK5JaW~@@ShiDh8pD9BA3m`BsXZwV7PFtYLr% zO9~_lbfLWI<5EL)^F4&-+=a4Eg-TPxxYd4y!zFFq=p@^*(XVtX1gi*J7 zNSFnB>|y%G;N}9lO-Q%k^?42rET{fKW6&_Xxyh9~vui5%k8Qi6Yjq$;B+)4l!)F?`*-h#}`vRcWdk z7B4Px64|DYu&@&rUb}izrKg3G|bBdX((`15>N2jg zX3VhM(F&bpW5I4@A-OnF^mQ({O}3}i^C*6ogUkY-Nold^h7t%7)4((j_fUFP8;G%G zc!5a8YzbAkNGE%xW-$mmpq|cDDL-a_XVlp;QiEes_Z#{Z#c--=oqER{P^lm-h_R=2VRb*jzI;9Injp}CSbcb{{@h;4x|@yn=vclly~v|VRQS|OC(=L~ z{$Y(e!grH3X=G;1q@dB#Gai?LG|r$O**yzQ@ydm47uh)2>jSKvsTc1Gs=p(q%U@*u z<>TA}_-3Aaz|uFoEz_6w4@*t|GLfe@I?4+{D^H;{pq;fk zV+pmZ$&qSHB?qj6KJ3o=bX!{j$0yfnIt{D9r#qo2D}rY0p6GT1_h~}HY;m%UHc(d| zh_cHLVcokgCV3#|m8+m@LBi1oGWb#0k>CWJa$0a@56Tt@BDfF~NpO-+-Pb4w#{rhO z%@(As=hLHS85``X?xt+0ZU8-2OPnXg(6hOe#j+bq+FOlH*-%)w7_MKvmE-em0Z2g%-44u6@~K z_1Uu$IR2s2m-uBxQg7@`$G10Wl4jPPVQO+S?Dd9pEa7RG{^f!(OY>dfQr`H{++&DBTw@V>Xr2@BRWL$EJGNNIFidK$5_(m@&JY}5DE z+ML8z5I+*tkWP@5i6Nv^TkV)NUe*z~8_k>wVo@QvjI0GQS&`%C4dwRFsG zhEq78+Tmx1+wPu8erpb+keC{B7J)LF#Out5gxaNZj5-~F3^o+}AUv@+wCh6!G%}|N zVZ8%HAs)}lDzo2~#LR^oU$Fh~eQ1E4*?5M4u9&0i5dxf2lT27LJd6rP-d&RKplQy7 zcluN67kG9K-Gday+bw7mThU}mBWwzho>pGEZZPmDt_-Tl2H>c)Kd&{ysI@w2=M~p0 z9_3oIv-TWMtKM#sjr!SlX5iDveWQ5%X<_epkMWJyxT&+%z|6w=4fE>tkO|d)Bn(z} z`^rmLd1H=^(g&_8heJEK5Atth)Fuk66U~CKikdEe7f(=E%}_+RW^cVaim;xQ$(&vI zt_UWxS{gSr-C*>0u{)(q@X77PDyhQ+Q5W>!Gq)$14Qs$*_Kjd|Yi9y^T&Tpw0mqW! zyvlsG)!VN$UkJRbf9REzp7I}4h_axKb7#QXc0D9NdD|Uth);m@P_{!M_qDzU>OHFo z^sl%aqV`tnG8ehU11sw?{a%Sv zChH>ADcgY>$zMOTE#zWpw$`;xYL*ug#b#mG<#i`gq4pu;vN9#7uO<)Z@_3_3kPW_E z#p}5gpId+u4#=@AI6@T7YK0D)^*4b^AoA1uKJ?f3Y32-a0uXV?nY~5jpBMM~UFQtXFG{+5`wRmd(_0CerbppWbX&MGiJA*VSPdQpY7cL;H0ZoAN`r1L zU-7lSG+x%41Yg=hJ)?HyH#>RmK8Mi>(ba}ZqI58RmoRN>w5PIYEbLV$0$pGx$m`DA zWW6c%0V@x(zY3IFcH2d~9!IWKdFJbG3YHD^tZ|&Tkri!Iy{|IAq1V!Jk;G}M*vpY*;_P_9c{JKK7}bEg9jTSZXvCo;umBs+ReO&-?RtFP?G4w1ZM)W4@{^pi z7kMLM1Z6P~SC!MH@97$!Z%pSe!rR5UveHMOIc&et{yJdaNxcn)*C4i(%_7!f>A=Mi zcdW3}nzXw4m&H7k0AvhS1Qs&)PacK3#Buk$*145por3sNc2_rqnfabwiur3HK_3o( zDrB7jTbpd?<$-xjx!^6n^$t*qpm_H~ds?1W)CZA^n>$yMR}EAAh4B3y8n#Ia4E|IJgc>eY3) z)~>m$`EfTnVk$J1I=J<6wGIEn;-IwxXs!LDp%2v0W(&l%C?c zYAqvV{zk%w6+GKqGc_ThmN3n)M-Wkj6=C!w*_$s@tavjy>W@ zE-IC73(Dr^78VrZ9AdxpXMt;RiJtD+$!`g4epBx_B_!RtrnVsvm9}0dmydUu?)cO4 zYPR*Au}6*nKL9L2)4t(%w0&0Xc=e49+f|@U-a9-7BNF+oRUuP!)W8IiCDU@-)mlEU zR`phZGoiEfspmq5u|N$LUmqf+tpeH z)w{@VJ)!Ps@v6|4+8S1b*|+wpqWpuok0_~%n+BmudPUhbfH&2%ZRHm$uHF&rZgFku zt>FVRLvY@z(D&SLwOza*%=F9HU6KRLuHF#)>Q)=c3HCr20yP1{R z=ahQJkHuBIBiB1W$5p%_PEOFwz)VEsx39eI7)*GOh0Uch=BO1tXd8-OWE@G8=|bq~ z8cM0EwtNJUcDn~e*h)G1Xp(@3#b2bF^iXXgFmZ z_V|eXVVjB1-yF2}wWC+fyxFwBe-zIb=M_XxSFXBc8BQyQJsO zfd(exgZfrN89FBG?>^{M#$8ehRt-L*vd6|Rr^H8B?_ZFFy_}w?cy7$9_V$`Hbw6yIANti~L0p2D|T+|aTQj;oL_NHRi zyClmJhGFX7Eee>*uuUY?l1~K)scNAjWhz)e+96)CLIXd1D4o=xlUJ;CO(Tp{ud0#2 zLtnV(!V41Y3R~9VmoT6{aU#l9iQvzkvA!LB5-D;rY$)>PiXRZ zUOx$nUNJbO8F)NItV%GZMDI5VojOvKDlGKr&H)d&EpWtp5SI$B=Pa$f${Zl1o(7!s zwqM9fc$ALw3=pC97C`R2GUe?Qp{T2L?L1qD6JCQ2AU zqFPyLN|f$gA5=k>iAiMuRa5U&nwj9r5|Kr#cXc>;GK943?O406&MzKsvPqX!CElWa zr-O#sCug(?)}<-hr;j$FJ20vm?)@6xHU?65TUtG8fqH6qmx7Tk6)tI)D>q9PDt>8t5i8t(YLpleTy+A5_-XVmI@LY>V%PLzfL%Bo0Bp()-p zwa=|pqg}?$uT`Us4a0h?MtuhDswX1*m{o5al~RF;O5gNY83vKiR?>Xb_l9_E=x!U; zS~WEI)o9moxNlWx!~Ev%B1$aAt+dUXpR1XSV(C(eIB8)h=^F6~NpE~1>NIM7a<9qY zW@vA;_Ki&)Th&@UW3z4>)!HQ>6|R}mkjZ1T^M&lUxd*&TMJis_ZW2{8!>EKZt=$Pu z`nF>=Ub_DPDD{rdt9rY5N33Y-y;ge*!ixii7-h;o(C>TK{8zVT&)~cS0>f`%(^HU)k9jTTE^-lEHR1{2=C}EHk63v~0fNoA4VuXI0*DQfjY+Rwm2Q8!U4@BT!EY9*xy>{&0^(K8E3GUrZ_h$niaFAXkg z0ZSeeRPO*;-ATxMR`6)UszxJiI%;N|M2&>Rd6`7&B_T6ZNL^`VSX(Hiz|W?jgoYIx zp6I}NR}+I=zbAQFGgpAc%Tgxc=Fn)FF1ck?sU^We*-_j3v}P{a@s0<@jhZ#oSh2mc zgPnCHtXQS5z1?Pw+dsLqG1niT=?}}FX|w`?Q8wJYwNoc9*g#c&j8H15iC`#}O& z9dYoE9Z{9y*~4UgsJ-Id(R&ux@{Y(J{{VAFjP~p>3F8+^Ri&(W!@6%$nMFfbQPqis zD~-Dc$^MafN$`)Ffw^*CrpRRiZX|9Cp&QJi63MIqU{CLeRo5IPZb*?t0ZI#W=|M#X6x&FL#upOe95ersKUa)38_H=zV3bzEo9d*Hb`;N zt2F~?BczZ4btu$tcOA{b9^&^XRVTo=gd`OcW(g`?P7g#6bSWSKaBZ%(wwcEDoA;iu zP39*37r7^OyWo+PoDD3@(6N1)W+}->M+#^GMG0Pt+| zo0Uz$?b9tO8I>wl-5w$(?8Z9|u~l1na;75s1xhdYW6@$IE0T$nue&v)=4F3$kIFGJ z%%s~NF=2pD{$5p>Le(-_NtBmOxwCad*{hW;N|XUlH!L0|OkA|7a;a{0sfArox$BmK zxpel|#CAgGs#+B>D@aND*%CQIr|jkJQm}^|PgER1mW{5^OR2S@x}aiqa?>=-QXkbD zwH3nrqP#X8B0`n3oW`f6)>!ck;vrK=t7|oYNOqSkS^*n2SEFkdPe^N1LuW{LsWhqi zkAwzeLwi@KwxC5Wqfb@pwuym&RFDL;$wIL;I;Nop%!aYG%ygI`tXA(;x=svy;x}o& z)mof|N-#m6FLkbFB$Du75h~f;BpS{^#hN_sRwhE0lo@M6?1`wDN3p1E;drc0B1LSO zX_kalEK7R?iI3k30}_Kv7bprl-o?Gpro^R8)}?KGZUhnA1o_KQ)&gM)DzWJ){9!6i zFoj{(7J*8cN;(ktXqShYsZu3LnJ#SFO6Gaenvk1-$qwcz7^x&mqzbmKUx}-}2=lo{ zmgy`jq@G`Nikqj?J=O9S>c-MuL>js7s-n5R=I?-%e2@&vCPH z0|FXS9!gTW#V)kTYMLwn*|$YYE)}CGW(P>oLz3IiW0ZR8qMX3JS>^daG_9r6n`BNF3Y;_r#o3gx0J|QHV)hen!dBmHvZ<`})@C;t zIK7ml&Ds%DEf)rNxvN7vOGUS1qyMf zJoI=eR$!6c{DJ$)QHEUgQ6!m?W-PlU7^w=wD5zL)ik4X zo5Iyq(3;NkB&&l4egJ2}6sdxfr6Zy^5f|)Mh9m^!il(oFOAa6HG+tmFfDnlxOHrD- zh|+{#-q56xk%qmYS#|upxX16p4}XMPFiCxSgg$3pxFJA-GaNokXOuf!Wdq#`bcYhz z`Ht!W<|NcJdvW6xTnBUtR;}Godt5<8gwMJ4sZOrO z{DdU{;qc~}({`A-#$2UrWSPMQKpU)vNcNkI4a`480LXg=;(0}vG0P3aU%etdH=NR} z$x7Fdw(6Q4GA0qNm=5@~rC)VIxniwY-Wz6`$=#`GD5b7S!EvJsVM3fL5B92O)qoN6 zm{hrc;u>@4rrpWT`2yW@e<94|rAvO(e`x<)mh= znW|!s9b#n6O+`|`2$mDNUzvtR7Gi=ur6r5;XcWjmr`lrg080|nPax;6&<@;+U!swB z8o>0^)Zax)7aG71JoYcT0HSg4_`&{cwGs%rc*mo`Pgf+N+mu@dv|H9(v7@^@e9-Et z2S1xR^?2dP;J-L-pDRk@4;fiJMF-Q(BN!d36@* z?tv|6l8ilcY={*O3OwOhWJ^JnQj;qWEj!9$!eQap0~?B@ z*1zh~Dp-9;PD7b!b#4ZI<7jyc3n>jUo{Q)~*ZCB^nSG2wgq0&`kU>-OCrLS&p3UV3M18PYp!v#lA@GKCBByNF5ESWX4zUV zj5Uf*ni#}Pl>4%hi=jk?7^qkx0#5rUBz)@F)3Jivj!6 zKVOschKoloEeTF`e(0t8N@nW380;S-WcGfz`P6$|`bY8B>-l zSt_Y9RHaOtGcbhV%23L&T*&l^`(^M-f|R*w?^F$tnz_|(nYeiv zd35wuQAQ$e_Dz&;NyI8^y3&dAWXleHQn_4-UwzY~>4XNlJvU+A;j#2Eoe!nL781y^g0=HW6lKanII2loMd@m%am`!`Nr{p_d|&?IHUjnON*( zlnPiPeDrk!5JV+Q#j1Lxf)I-ZQmpdo5XQ%<5%sTVDx^O5R4QQzT;wPvE1*5~ zg1dJRo_(XBm?M3WUl2jDJ}((WiH*&nVp(Y(-NNozaa}%q#ec+Q|+F z(R0cZu`*OEN=-OyYG_CCCvV9X8jRvuLglWd(6XF9F$tECK5)7()R7XAv~;cOm?h%h z4&4pFLh?Yv-!V4RXVN(3(3AswPn@Ofz&8A^Aq?ZkQ zLn{ypQiV(tu+ryGN{Wl@shA}fxpR~Rk2+kDEyT%qP?c?JYIZA_%-*$Kkf4t~66gRd z;AKr+U&T!xa*)6_^-suZQMQ^Sgn)_uVw#HBI9!$Dg(F9(^+d!?#DvRAP`PtX9}&Op ziX~Q4PZIgW#3L1hrdB~@~3)#+} zC1RcDMI6eK-slss{!vu9(%hu%_}PzKB^ZoM!-%L}NUCJlwJCQuKFms!=IUI@&T$Em zHcZ@b2@cbyD5#{V$4?=qkuqtPoH~?*Buhb=F(^u0U2_idxT`J=3`Sq#Y~jNyYL!AI z-Ik`Nt|Lc+W~i!S^;g4}2tJi^&^kpXn)r&&U64_QK$^W&o`dl-J#M(FdiFAS5K^DB zD>L?@iFFfB`jm4yMz!DmOoB4j&3il5H|( zRs9qW5$uQ~#QX>60^r<&H3V@GeojZ^F?Q+(I-{yTeg6P0iQ?KkDNOotJ}`uPDSN)X zan3#8B?uKv;i7q}1>LMovxKsM+4@W5C&1f(P!grKJIgR}x-*@EXSYwoC>Zxbn( zDF{YQEM_mH6pjP4Tc$H7hvf{-xNQ8if^J2Up}>rx`Zl=HE!Pf_VZD)co|0H_jPvYv z>x!0oC5_AE@UMRt4)=?0^}X!bMG97I6k6xi3?Mb{yl(dw8@@0Nu33o8a0WUWo*h)Q zDC=$BIM@gy}tJt-`!vJgZ}Xn(ydfVNa&~mr^#BK(c9hFn1%L>G&XGveSnft?;(hwIj2B5Xlt&MXGv}&~krMj6<62dl&c;1o|6v-gcT$^0`|D!76Cxhb`>};{;*P{?v&o39;}NrQWOl$>z7I17~t#Db(?_bXj8@a9q`?$PN)m8I#-F%c+(CQS>h96XKLtUzhV#42D|wnRckBNaMw zP@<$u6iAene^?}8!V>)9NJ3?#Cpto<)SesM;C}KM!n3E|dZ81h%R4_vnJKX)gFA6} zQlEWCPgklFB0v(Pdgb?(^l1>4QB>b;S3hTjaari6;$h9nB%hJV0C6$6UA1FRVzP;$ z*+PN~KUa)iCt-yulRZ+VC@4KMB$G_ZTniGCctVo2%$7|%Noop0!==)qgTx;16`9K+ z+ho9*dEBa-<;pNC!R*w9NnLb&;!7vz24Ty!P_-nD;GzPmsOX>o>(U*Rb9&Jmrkui->k#!7o((71M+u|ntSG>QRHuL2%!l=KsieRpD6T` z0ww0^)}K_JAu{EhF&!r=l#-Lu4v?2@?-QoZmX*1sGbNTZpiq(_@bdxx0EWHQb{M5; zDLf1~H~z1TD6M5O)j3CGle<+QJuzWVGn{)z_pE2#`NvS$#4oljgQP`!OF6341f zS+q@7_0|(%z(2+vN?MNg>XcY&{{XWAl8pUedYJzJtXp4GfXc!XYZKBLea#`B&wgRy z#_8IK^6R`4naR&1n1Huq)aBpvv`}4$-{s2DyO6lj{cux#({t?9 zIrD*H8rf;5z6)QO1naJ_?W+(R7wRxAr|pDQH9}ekthEHBeWgL!PM0vJq?9VF8+Sz~ zAXxrj#VG)dU)CM5VCnUxD>3zdD0CO)>n14aB3|zzeQ0!CaMVWr-F=`B2vr3#=qW9T zo+Z6c^K~9qiHRzaETK)%pD{CR&n;3Apu?O@bd;i6{SxJ2HrsTC6q3`XN~C0NVqo)P zK`RobDsp6`OE#3HVdW(6YJDqd*RoP1TyML$3#%#pOZHPcpf(k{G zw3dr2EnX6k0%M1@;tgqh8D25#KmNWw(uOESm|e$f%_rp zV&OKm;hZsM1CJ97$A?|Di#q@YuJL_x<80v7VM}&(!*%$>WtO&Nn?P`0qh@=%jG!7= zyLLWMq*Id;=Ejp5Yizk#_eE6hxwpfNRY)M;sB~I6w@XkCaQ^^EsBr^GAhD|^dknRT zRsym;;o2M(6O$+AvSa!mNw??-P&LFJ1+TCTc?1!hK?W1em#sXij^@6f`BY3^7 zouEz^Or-(=%8*`^w!BPjB+1z!c_*Gm!W`!m%HBTKiR$AHqU7pfz;YhhJ+i!ANtQS# zeP4N2@QvbUOyTpZeyoHgTQtj-GYT&;N#SS=!mY(VS1@KxLsWA|LzVCHY;kgY;c}&f zVKG5_JVb=1>6I}|c9QrdS01W>v>aT4K8b%hvnZUYYfnhbl`82R6tEvipDJ{Lh}z35 z!q1m9VU~%h8H>&i_8+j`M-%d=%LlIKp09n^+w*Q+>7Qx`Hny;E~-$ocsi z8;QJ-F_~B1E9748MZ@r%=0OBQGiQHX?u=SxUn7LDFA!Q4dGiJI=luQU% zE!0FTClM?yK~(w`Feb;>ynNb}k?UdAv<<~liz~pzDq==r=~(*6RBS+XHO#@#aq9Dm zl3%Rfz7b|Fy#BOt@Daz|4s4z#-@eGDA6ibM--vW)t<9y07qrN*c0{dk7qC{hGp-0Z~Zk z@j64jb0!*;uW0^5NSPt-SwQON0vM%LIDCPS&~I zigw9j?vqzoXe#rWXhkK1oyXC;i^ldcPZvbWvd_LcN>k+0rhAMsF!R)G%B3kw53F7a zQ-XeTCV`_}fsNG2k}d@(Qq~{q9&le1F;{CQS~a^;B9V-mI_R1HFkE?W33r#NsDUI&D@+9ZAS`LMF;ns!`nvy-C#yBS8=!ew0cz#iHP02hxs3cp}Wfn-bf9VRO5??(I^Tp~6 z8+3jiQfCVa*t_;lUx z(u-hJM;hg)!#HK&=cEkOmRo(;8^tb4R)vKE%+64I;WWC31j|{=ga(yAkrIwj+dN12 zN)T!WU6pmAVUJmj>BzdTn6b_Y6K)?Qthv)62BoT+y@h~zL+wC*E;2A$e3#)`0n11a zIWMAI-0_D@z?Lco-NoV5w1W5E{NW%?LXLeT`=EM6^;9b)h8ah$f90=Bzg%52ZgoQK zY~C#PxvHR|<@JEdU;!~IERTVKU(nx^en_JsQIz@=P-Nv!JumDkd)$Ktk zH4@LbwtSjB6s0KZQ%VDdckqH|DLXVO@@2nJDtK5QVYopUoRycfpQs^`X-B<7>3pgv z0ZVHGVZ!n0rjkFamAa0itznRmKCi`QGpFij_to%d9?9?{nTaB9`qq?M%BU6(1fcrt z+A$6zeI+__?}0K>mnLd@GbJrj)|133Hyx4ZD_U_g6r~lX6H=wjD@7#C0FJ!#yehvX z;VPI8&Sbn#ln@hUa+#CVOL8I>oJJqcW>(=|cBvAmqy{LKo3RG<_Ci-CM7b$QytLvm z6H_pPO6!=V1C_T3?}ec_EF`U}NZKJ@Qd-ecdT2O|M8F8@hf;9!+zLi0;#8Dz*``|1 zi|bf9S+5AM%w+8536#l{2Gy(+HFFm9{TGEHOTfuVP*qrbG?`0C8VQ{y<9JFX<0R6J z)V>qRa~0aTl8TR6Fyd|0r!BJ?hq4oH=-kAsxcnp2Y$t)1(Hq05KsfJ-hEZWt090ls z)^JyU#Tj=i;9)gqfAK})(W;4uH$S|g#(wb+Y}g0BTs}uN9&gKwd zZ*&s|iC{L9Crw-HlZaKMrrxSh+-&a~L7x}_<#D`;FXEU!m0d%0bz0G4drVWE+;;MS zXhZQS5uhOWa)+om-3Lx@4oLlVfuC5(p}Cy=A+tU({5a5DIg{CVN>1V%7snJ$0*KQo+<(u&z6za6#Tbh z>nkJJma*@PVb*v9N_FBMAI+QoW?zOFNkDy6r75-1p~lT0RRjL#k4rIRKSjs~utV{N zVQ37Zmi9|~pt{yi3d}!9o4LGhDQ)$S#w|9-icoLbA-0L;Hd0Og>~xX5ax&$1=@j{- zl6|DQd-H`S&5&FcJ55`IMdc;h&c2B5f+kTeU~R<^Lc`jH7&CThK8+%pP-!C1ZZWhJ zu?P$j%)&Hq>{;)qzHpPU2q|rlGCp z>(t~A&MdWL#*hV$Zr>OS+TVjG-wv`$zL9g|97H;D@gK^*QL`SA63tsbTuXbyu56Rn0Hjj>$>p0tDN|Bgc!%X-&nO8>!kZvZs^1s{s6Jqe+;N3^ zMH0?HNKUs8&IhGZvmGD+9CFqYDshsX@0+Yrd!wKjmTdGnInL2}Xv(jP#RghzEW;uO zP9Oy(^rp)oeAqdTxYOipzD5@@#Oh+%{_}eED$m*+xj`Ujan%_&=N#ZeLk|8i!2a@teQ$W-@+l`JB&WPXt2PhU8AamJc$O7) zY=I)@M`)yQ((z;y*9W2+F23OxQjMQDDGEBrNm0{ObfB~LU*tJ{&X7UPyN}6Yczk1` z`d=sOha?68UN?ZHZ{%-b?5e^D0iDNgVm`13v{=X4SHcHb5Pqot01Ox%zVGF3_Ne3` z`__HHKv9}5%nyr!6sBCs^H@7swWZ_H;pECoADz3{jD$4&Y{`DgWXTB6KS}yPROQrN zARJ7^kabbHfxRVqfhiBsxDKDr5)p(d2~yTVmJ%4afT7d%j-6dlr6!t^Y?`)nzyjq8*Rm6Lv{mK{$C2tw>NWafE1Au7RwnTZ62!TbsAsw}H_8Yp!p#8s z^3D4Jf=&klO0RUxw{e9`^E@TP*e=H`i^ES$ygIHPiqKyx=^xT06!Afl16akWp0b-J zTQ2RYx;ezPpll_rQ&5zm&9wnp{{YJn7D**S?{iqr60xuNhH&F0+;#r|CX=i%3?kj8 zDMx9FQJ$*&qKS7po)N^H%oRcIj*fQWq#eLy3_Fxp0Nw;g!aP!0D8iH zr^ESM#GbPL{{WM$v@7n8$Vz&j;}a%pI$-;$u=v8$!sD|40GuUy*!GO$>m(n$1Drnx z{06U#9(V7&C$HsKXTCnlp?|#~_C&t3?}c?Abaz5vM|ZkABeE0nE3ClkG4@mbFO&De zKFRk-V*SPkR3DKYUz`uE3+#@u1b+EJ9B=aSidS)>zc@W-eK%8$q0Y_-%q{>`$_o6G#BiT-oMG< zH88@-8JMLO8mo*^FSN%!On5-&`yVH0g?9e{iVxKu5V8HIxI%lrPEg}N-f?>>31M>o z0Lu78rSV99wC{GnZm_?T27Tth+Z zTp?Tt@U#)3W7&~}9xj8{BdW$fd5Ar4@r89j`ri0gWJ~&ocny~V0zwJWGC2x$7t$}^8W*8*q1*V3P%f9-A|6lU*Z%-LNgOx-0FmVVfqnD+ z`)A$3oTJXi-TwgbF@?XEj?}$Eez@on{BxZv-XFFh*W2%iZTnx_Cx`32uS}2p+|KNxHK*h%hkAoV>QfA$4fZI5v@ChstA=s_e9 zh;TE1Jz*U{g4XxB#ujuLy6yU4l1zQ-A@=ivRpl>Y#lzsm_*jU`-u!}T&&ay~(Q@_+j#0pStxkUEg3&3z~T0Di&x zJfb3b{LRig?lfF-^?q`lSpArPuAIM0NB71WJ};asUXT0?coq89($A`M4C0VJWPQvh zWCx(H*vK2l^m^d&Pl}N->ztVJ-U)qibRcO60q&2bWfckOk$t8j9}lx1gP>Zu9kcfV z*Tru*&!scvObt1`T^K_)z8HH~{{RQPNA@p_Hqr4nfMTE}eblAzUm-cT0!cGddESC{_) zkmLr+d>>bgiBu?WJvX%ZF0#99R!N7^Cl%yDBkTLYQmtH`x*P^=M}*<`$6x86f=KQ# z0)Qge4&?hw^0V)Q$(smHJ&D8qYn^S%Za#Hd%6Hd*Fgb8Z6WPtRHFiFf1E zKBPZqu7BNU{nmfoWTct=%`?I_7B*fQMK6$uJAj(K;mLp``ib5Uj)?W|Dd}YA*^=aE z(dQxQ_0*G(LVx`9~3RuY?oeI;H{qYuKx-8tzJ* z`y4;e=Zodf7t5dYIS20KsXI)wto{S{o~i8qGr&D^M?v&+(ZK%z#Jo67v7Y|`+;oj> z5LC9*#wv%B$t{8R$h2_~+9ByRjiCnu9|d!aq*-XS(77Jx_opHJ{_%(R`OUUrZ&?2T z<-^4N*aQ-8cg8QJM%eNA!w~>{ld+g|aBF_Px-x(A{{UI<{5$un>xxb-00gjFd}s1G z{EifZ&@Z+Nu_9(Kki3qe$h3Gt_sv6d>}cfSp~WKXxe1}VgoX`^#vww7%T#Bm{yb#+ z`F^-MPs5*wA$eb~-OrzqfL(h*foRBEYU^1BnrW2J4d9~Nh&0@0+{tfEr5v7FuPHsH z$_R(RmG{2fcKtCw9#6?r$FJQo8s0*jh`Q!Bcr#j9XL4T{_gDV_9Dxz#-p>L4yZ{hQ zjVJQ)?TlD;d!ZAqXBirsbHe)n0CR?l&BwgX)l1OEL77IZ zo5ZnSS&_6;L+IGJBWABGizLmxP!eNIU2j>`%{gx}( z%TemHzmfCFeB!VIMF< zv4|6P@dAv@8ae0#7B z!YobbN6sbB^z_Jhe|V4l!Oi@hbH|@Be_RLr4y>MiiFn0`fRKgK{@8N2WYv6LNzr=$0ESES$MtZr20xm>@I6oS zKY{*XY$*$)<*3zS^bmbd`;dxx*B0U!D0T>HEF(UWI4|KjKYZW8A54RBo={MgIU%>%o8808C_YPxpuWcfoTgWT2hQ+ZbT6;h1Y}=`f&H=vk)i2>^l(iNYu!FD8%m{ch5TiR z41;vCXCyR|a=|MT>@o*Du~dWPtairn_!5)@A<4t1FkVb_L~xW&2g0PRxej3sslH4hz|#e^$FOq++c8Q3n{8y>kl zjRObClA2%&Zgr3V%D+p(ZqhtWdT@afbjSoQ*sBnUc|S%BoyFasI`?;ZC#YmoJn4+#L0RP zAS_jgmgMjZ!7%fK%UGq3@vpQOTX3+vSx2M+QC6zKxbuNTbvP~wYw|Af(-7)VD|9%d z;1nAi`hdGk85Pi;C#fI#E`KlepTqrRJNa;#-MQD!8_S$H)Fh66XCn^VmC2o0X<^?) z_U53YrfJ0USgve5H#}ne{qh<2HYr_`rljHi;gY z!$S|;V{U6tLR?wfOG$N*EVoJg10Z=kCE^a=Z6{vofk#j^J%-1Ue@Crb&O2Y>^sp6( ziI={IoOQj$`)hH*#HLW(FTke&<8^Ed+E?6%+dPV9kL~lH_Ly@oWXbpRad-26 z6ABUMN3}p@)Qc#SXnvKE5+d|D^PB<$dpB9wr660%afr85s=Oy4$d;a;zpyX)t83p^%#}05d_yTd2mg~I>ICD?2&t>4qHZX<)ZT3B~(ruKO z-gig2{Acw!;QX;^zPX>a0+tifD~ri05i_laE>?l3d`E^vY{?%s*64;hOh3xt&x8l2 zEaEMC2b{m?N7=~g9*^a4mc1~aj4>4})Epm-lTvKKjXhOzhsGHEktdtM!aWoB!@9jm zeIo#>An`^xr{@6xgMr8X7g@kLz~Mh^U=d0hN)M#0L%Z!pI{x#Ls#W|M@AxnQEBa}- z;p5}HB`o@UHR!p)A#WR<K~lq1J%CRM+qQmW1{c^;I%PsI<|qX zvV4Tl0+1SJ>mr_|^HCZ900g<;{5;`oE7;E$$S@s057vKklj-$g*GB-sK`J)&{{V(9 zw)ejoFE{1*&Xjvk#(94q)_I>V)_MN`-%RZAJBPi*D+3Y;dh@B0bow8eiNDhQF+c9eAL*ah0mVAuu_Q@n@sc+{K<|j- zI8j3AsdxZU>jA0*CtbfaOkoHZTX@05n~mV?l=uGtg%&==f)i_juagrhOnVXG{{V1;bXoL$f484T zFXyj3ehfdnEk{7+PuDpKunH}Md+6+sIVUDjvjOyaNGEvAH^2Z86;bks4kKzk>~T_3 zm(&hL$mbY|Ld4#ab19?51DsJ4V6sV2fa40f3PS**AhjuNoRDw0kpPM%VAPj#0hI2k zfRt2;?JGRy$YzK%Q!zH+LCb*Atd#FWkX>!flwHtA#wXUalAUV>i&5DFwkBmfd0)mT z5{GWGNMf5PK-}IEQ>4KJah@pqRCR?EULt8|!DSvQ2*6NUI5`o+bBpg)z(<% zg$kZAigxq}9u_e$C?s~WnvjHwW?`MPIWl}!8$K?V(Ej;kGp0|_m{#cUKGbtiTJ_#T z9SN)f0bKxNc>ewVzDzQ_$q;ZtAk!EosK6zA)PNctx` z4D^13IB<`T-~JKP=rDDz59sIjZ@wN+qX1BfjXA#^4m!o--XClR1f#3f=}U&EyG6Djhm7flHZ2`ka4-`{(fg z0G$3~^NCa-tZ)vdT>aJ#U}~CsEb)opb!D*?$F33-#*EjNXT}nwq7%R%8F=p`iq6YU zQYUmzt_ZlEJ|pG%`eY!|6=?vMy6YJ}wBWPL<{{0VU&a{0>KF@OSo*kdqY=XHBODS< ztiDWf*_|+5@FRHGQB%-uk^!v}lNUmtgb zB=GasdLParLXjfEfhFh03BcfQq$M=+}Hr44Rz|x@%`Y@W#u`zBV0>P%KmxC@=R802x zF@Hc%M+;dzfd-Kw9BUynADcg%a3{gzK_l1K9DFu+m}0++I`~7jG74oE0-ZK82V~xI zQAR@VSq|46E*8upobf6_tCNZ%;x17fZZc~AHq%iBM4*c1T>9mYI0O1KZIzUCP7M~@ znBn=p*kD*m5v@5Sx|&Wh?C6$J6bXG;!=!b^G;T-UQ$1w=0H@yh+U{tmy%_M`pPL7F z{BfA}0ij#21i~X=x@}-`$oG(FW)6iMCL)_ATZ!iqNR(2DL@{~Ba^c=^2jD*V^q--I z7XYMC!+5_w(EDer<^AVGkz`N&$ckl$m<(feJwnoB2!vR<1e6D$tcPp#A7cl9oI~gR z=waA?e|i4^RA)f^ezV#2$@Y5>=OyFpKDgvXASgFY%aN9jpZ%{xH6$*nI>Yz4ppA{XS3rH9XhO%+5GIdG{D9B9tOt`1FC{Krvca^&bE z2L5lWjlbpbfZdpKL|Adg1Rqf|flqJkmmz}1pfnxeW&r6WU_`o0w81NCw`Y?}9_p7{ec^&pA2!p`=vJ<_JJm$%5MHtEc`>YAHVhFGsnOL0 z4gw|{5ItN^8X&B^1jCd$m+h3L=IUM6^^9QTI-#k5Mm1AEq|~x7-%J;B7&k>J28W+5QCBJciSc%^V>d&DXV zV$CJ=Z!G|4K$yRwusOYd(TTQzMh{r;yqwtI(+ZKy3I}mato|{0KySwI`&J>6E_dsE z|a5LItsQ0LFVLqNO%SfcNb>ddke3TxPyJ$T4PN&Ps=9^@CXD(KxXt5%s`f7Ro9hOohKeyxgEeoEM>4PPv>jWUcr7 zD461UDD3XV=yTJL3HV@mvA%4SvVHKl;mI+=XHV^Bg-{C!ymds?hD?&Hd>JA|BxJVB zJlbTJ@Qg$DhB5rub4AiZGR*HkoMZc+whGE7rG$bQhXiZXeDjZEA3AxwpNY9ySkOIK zqgRxi>YLe!(E6!|;0NWyuz!2toB0pm!}$-{!M8tO+Y_IE@Z|nI1G$6l$bT=+L;3!5 z`mfG^QTfm7zd!g0XZn6~x85vqVs2c8B?;aM9nnLgE;CkyTr2YC;6iPr?LT~HtYR-D zjF$`&d6Z+%A6L}!VZ5v3w8?NBo)eE`J=6sOTFNDG9zfiWe2x)7HHsRf zOuZJ-^s+xwmCL0;;;=^n7Gfqk(bjFHMe%&%i)k0L;FnltNS8v{`}o2r^b{Bgp_VTq zZGUiDk1*e?Ojxr-f<-;ecYz|ppovDJK5VVzL?e(y1U45Vo#bj!M8+jPT{w?8N9dN` zfFfyg*^_)0i$!8|6H~gy&NYPa>??=Y46tTaQ#z_{{pFH_}r>y?~ITnY(`M}@i#uG)lTV#M6d_mb=8{<2+szszGrRz_%voP}$A&GDW@co@8r zQwW-H85=zdH-paui}IQEa=)?uVfTam$2oexM>tFS#(t55{vXYc{1!L>b79)Fn6LYO zvJd)XANT!aV?yWp@sM}${{S<$?fqnb%>86_UdQVMq0ORdO9bH@B;gVm<}w1Dgdrt} zyjjTtgph6+$NGZsoDb{#fADM~eajx0^z!2`_kQ?9?7$?p5hkj)gcV?vXd_}dw-Xig zNvewbe$&vPlekwL&2RmX3cb{7lVs*VwvkD zDgy&(wzY!7j+D^%kG?{Ml3feghlauDj2Mm0%<6n-#M%HT%X=%0xe*~Qb&!SIJB;N) zz`tC2t#iJa37a_I4HluB^F0CcgL?k}7w3#wSEP=jwahXt_`i}*jLg=u#|}&%F)a#T zFCE0=8+0VKS!1&c@E6Yf40YZ>7(4>pBYVwMxu`qJDx{MBaG=0NYrPW)_QPP#13s1n zt|oc3sT?sEHyeOmuJPucJKMfYdXoH5 z5VCvW@BvsB16DpT9uva|X#hdGs6-HlULm0EWE(F4vvx$L%M6o6i0bmlXbf3Yyo7nF z^WQ3EL!=d>mK_B@v?&W$g;#DCKrs|hlClf)&JKvSTn1f^L%lf(kPUExNFrQ##%@v~ z60Zq(WZICg+Y3aCB)EsXK9~d)pDbOonAJ8@*^U<}U?;~o!DECh&9>qMJMx z-t0)(T3&D@HNAdkE8QjaWg?zB1U=q;Fb;7L4-iY*6>F0MMYz;F0eoTtBd_^**dbiL z;~b~_=vZ|gxe>yNW$o`oz)ZpiChqcVQ1VO>9FMjOk%Q;f2v=PXTgSkf*xoJ(Rz5eY z`pJH~&Om@$6JEH#>0`n3e|QfmgmB^c$uC=do-#=|eb3h&1(+uk+UBqV{NQhfK6)UI z?XNj#pHAx0bD%HeOlC;FKzncUWJ^y==JJJ0dPh>fdj>u252&N`GTaz781VX-T0jRo z7PmUQg3vpG`NREOzwG|`{{VY0``Lfr%lY5Vf7<=C`rpnAawJ)rb+67qlDe^x+~92* zDFS^A=R0mj%F1V|CtYLz0KG9>47ig8#ZK{E$?f=Jksr@|^+4kg44@8^UNeg$Z1(A+ z*C4uMKx|1(>i+=p+?X@vh20d?jlQ|1R*{f<<#d6tX-F(w32l{Jl&vb5^NmdY5*~2h zVr@tRa}0WNKG%3TtD$ElRb;N(kRxsVvtgnaV^*I`E2$wFqw4y}Q|{6EhYcRYW&%Fi zyV{AJR&Oj!r9Bsdkdt2AW4mZeA_bov@il20G;0an#+f+B(D@-L>zCUKi7SDHUh;~- zwD%gX6see2QD)?2($+9!BaYVxoTQ7v4g5I7Qh1(8CNgLA_?*~a7_$|VLjVrgmd6O# zJ6$gOW5zsDHV9>G)g$W5W9&gphJek*2?mNl;V#RzR@vpij9rUP&|sp2PqiAD#$yRO z;$dGr=4XWI?}p17ns`C{naPsc0GkBbF%m0qI-9~T zrW3p&4kGt!&TJ!5>s_uP0tWl#!wu>*eXvuxi!vcrK<6dNC`z$y+0Gk==(o7zBc5#C zdzjV9Z7veT!oG5+dzk^AOLdpU^$9Ie+~t}{iOQUoxyX?gGuF#ku3qqviRbb%5E`rS z;B9U(*%Z1fgxf-PE7AcWg<989{9GB4FK=XR2z`c53$x81Wo`30ll2Ky&lFd zV*41!bCC!gRzLBx{(dNP0K&;9wC6%bkZj)H#vM$3pG>D0Vhh<;<7qiqY+isqFiAzy zqt!-Df*s={Ho3B8>Ir+|Fj6di+RZ?8NCVOZeVm>30QC}ZeKulx&Bq`-jgMJAxHyoe zr9%*Uoae2R?)|WsmYKPJF|?T*khUj1dG(4yZ-bV=|)rGLhiX?eB)=Gj0pS~W={V>9>YVp^cgf8y2$1{Ki7Id7?22m9iLp+{&%Q^+$ zY-(I({_8#8OsNl1#MhTeP?H4IbpDJhW^zIR_+D5Xd|)2c-*`8~(!pkFDe~;NH)2Jz zI`M*%tv>h!BS?3g2?6NRaBS_pFjVTX(POYeJN88Z6hcleWo5EFLO0_eNoV2g#vH5T z{{SO{BdD1+cFH%DXqIIOt~_L$Hp)VYIcy5{(7E1RTna{m-`gf~gr>RA<;eIwuvSxJ zOGH&T<&e$1VaU?fsdxPt<%CI+cZfuCY8;k{i1r%B{9xf*o7{ewXi+e(`or)t0*8xy z1WEIpi8y0@mHK5zwx1|JOoKe?evG&|&_1i-ESt;u-a{BZgw)aJ8I4ywOeE-j`7Z~{ zo*%9bPu-qpBirLYsKfd&EhE$Z=IiV{CLxdc5^8>~R=czEQ& z63HJy>pWu_hdh3VCRg@3$3UG4Xb}vIai66A?p?NU+q>38hEk-cmxq3EtWZ+BXwlYH zfT&o&?F?3y@*RKx+(dFW#tFcR5=QF{(I-%w?EdRDq(PclrzeON6ZiutzjAnP4#qtmfPwNaq-ei>baaE}5|Hm3=V; zSUs}Dj9CH|<<0b5bHK(X5(Bkqyqu0TukPGxsbhX!<&mzVVSk*Ac7dzBhUxG~Y~*ez z1Lu0e%PWWLmJn09yU3Cdbi87;A?9q(R?v;Ja%AXYNMEe}F!obCUPs?9*a6B?NFu&R zFzwN?u<$#OVGJ!y3^#zq$cLEYBhCmhw16mt4zS-4Om-u+vM;$S3e+XwI_C(fQ}5#u zERm_>B4`NxA1oM%Q7PFA+2a~O;lvLXC|-+HW$XTCh(Ej- zJFsIG1Akv!ktx=a;DLfhsg4xrhzgQhGQq|LZjeX1 z3>^V9g1t|+0WA(Ex5wphNMl7EZl4T9=RBIBe{ONe_;kqnv4Xkce$Wr5DrSj7J*+tp zMj1PaD;(AWalz)07#qDGK;v3`XV~=nM46nN-)?uZ-}9X#LhO?fsqWOgVkB z`;K!0wM253m^51ga7f@fEaCBtxdRqax^fAIfvdw3au2X{%j<|YdJEd;6?k7E>lxts zugeuYAeXf=y!;R!IOIJo^t|o(Nrdv@Bm~4#_2Uwi5PRo%vg#uYCe8Tt!l4!0JBhbB z9*Dv@1_x7<1JnoK}fJ66G3s`4QPH>7WKJsN_J8W zQ~kFMFT1iRuQ>rI3e!sS;}F1Brapw^;rdue3y-aO7-CnJ5m3YS%9`0a42NWrYn+pf z;XdX`<90#qeoQ*mbgGRW*h&PdUD1-Ef=cM_DVnT7;v zmz&OV2))ZnG}o?5Bvg=u*C%gW3GzMS0a1;J;SRBfMPegIBvY(4q0u+teQUwX?!Q#5 zBCmZ4;5`|j4qYlj0R+ELiGKLvBG&%^ij3MF5facRo&&svB6vG3J&$=tGl?f=p@ax+ zl>A}wt|rYe_{ad1F-7?^LPEFUJY>TY>DE>G5cvlfz|^R^)HdX}L(o}wK;Y%9888-* zg(U`gDZode7?CCjBvP0Z%%FiBo*>uNBUtSZBwFwcx2le2sb(33X<@}rZDd~+YtRXl zQaG$ca)(vXCCPPdq(L4_<01qJ8RjUD8CDpMTq6Gfypx-TJFgg$QI1hkX0&Yk(oprro*0ISC+ z9|qE9DH$Fsn9dTx_j+PGp*m98vWAO?&(tyfe||h?sJ}V>y8Yac3*ClCC;8-KHjYmGS=M@%7K^7w4hC z=yn|DgZM3+LcDQL=gxTeg61Pj>4o*Z7Gw&UkA z(U=<{81x4$Wuay_uRYL=vPrNi~khnN<-{ z`7aSBEpMeW^T5@I_-P61u?3wId~Fz*>eZPIkaY(0hR&J!yofL+*oxi+zeYcNY@jxz zYmtstIS4AMN%YN0J~rZwuC-UQDKJvdyqS|G1v9MkST1ID(my6^(?9Ph-7><&mAca#n7LJ%L#eVYxNEMsVc%3=cRW0xTo1 z1D7`Orw81`(?*Ue=O>(kkhig~Uh#+CKs9;Id2(YsX9pm$n%zYyCM0MoH9NdkOay5} zmb65;AXGFhkeA@btD6W%*#nJSU^l|niWSB~tkRVtgJctc5Dz1}Nox-q{E6j>fcVHI zZP+(pR)ZlkNs8XF@*+#@i^}A{Z6?~oG6)b+ZmiEIV(!AsPs^hAhm6t=2E^eFVJ(Fr z^k#~rEZ+YBlZ%4I7`Rh@Jso5&EJl{N7^cFu4PoGLFqp%#m(1V_OvOTU69nQs*EbVgQ5)aeR2~Lm*P*TV%zsW@v+iV>k>a1dNFiC!&$+{ zS{08>VT5?W7Y-w%Ip3tiN&1=U{Zk?D?&OVom~|ZW{W1fT?2kk%bFA~r#QWjF{*SnE z`~G3yD?)Sm_%lWQrq~G!ZHf4BO+&}&oKNU>GD+x4Rul8)Nzh71sew~OTtj!+iw9#& zc;WGrP^07^o~Pp$m`BFJF6SjYy(GlBdyKyytBSTJIi+8QLH<0fa^&)HJYKrX%Y%az z)pt~TDrzX?dRgAx z-Y}5e$;Vakl5@(qPeUP~fF>{sU`m<1R^czueEMW$NUZ7LG6OT?d#TP&C3^UV0tN60 zdh3pG+hCl5DIVCK{qA+-sn>nW@r~ZW^B_(QWS&bNK_}A*r#6C9+i^K6CG-abc9QirORS;UYg8g85{#=6i!JRcbV794dckPx;&OeTV3!oVai@jkhr zE0+oHhzlYaHg}Z%+XICBsZsHIkGK1x}jDfKrOl zL1P#q2oTKAP>th=2uSUk-<*TZG;k^u!`f7(b$Agdf*+w=K!RN%myB-0=Q26N(1~?7 zJs649I#PP=_rp@@=sBOjzyf=cK2Bd;UO~Owncd+TA#8N|*XJ2?A$l9$u_6rit32S7 zD?$S!v6Ci{a;1gPuZ)#?&^ZV>N1qdeYzM(pPtzseQhWaZgNc&F0?O5*QoR(UWmJO9 z8~{I6yTUy{2;K@KRDMBo=t(#S)WhuHs5m3ag#mab@=%`y$bBybN=8vf^Z3d79(#J= z*fp-f5M?S`sv-%^?l7X0bt-h(I5d+$a9nH*!=n9 zE7qT+t|=q8JLY^c!GMqS41xq~1doW%J4YI?7;dT#IoIAp9gzZwMNo<7cq2k8fa}XX zTCqP&6ca|G56(4#ED1zcJd@`h+4Mho2LtxOqAI0{uY7@N?)~JO`Mw^YH z3%6tpKU@`r(XDfO$XHnG(y`mU^@sIjsrDKQ+~K<;_?+q?YJmwoepsd?3~5Viyb9PN z;ITC1B7CRj{&F(>+1+ZcnoE!^%@{Z_1FWJ-krD1On=rKzM!m5#6&$6Ig7(fXc!#g* zV@3%$s)jV2hxz`vgd14bKWx;@%7>b0IcUh_9adM78sQb&g&8xW1#FmTtKGJ zA06eAegGpMY}x_n`FmDR#E`8BrnkR1`cXk*=mZ%?xzlF2eu+T1%3gis3twH)Im0r= z{7k)Yj8#(wU|}JjhXwb7QuPd#Du$?_o-!tJnSu3Vt5M;5)={^EZQ`=LNqLm!%nWPn zy2Vi4i8u3z(1442>mXg1%k*(JQhNfuPAZ_5C4yA*gHaQhdFv$zAyHA|cqqQ7znRVB zdhtfVaZsng$oK7#AQREgrf#VeCmxv^E0Lf>h~7w^j43nb3{4A%+)0f6s}FAs=N%ef zWslARgg8_SLj?H6Ny-S=wAp-Qu-J)9CWnz3Mx89)0^T{m07eV6tSjLCawrhe2&qS+ z@wsEcN(`T}aLA>pxeRb0sJ}S>02%khxL-zRo#NL4f+&6&GD2KZr?{E(^!}WP1_tIn z#ylE`8?hf#1W9HLAZhc5ggX)hSQi9TdOodCso=Yl-vH(P`OE(R1^u!6Px{0+?ERQ# zG=imlmZ80JkOk;4}N|#W5xKE3~@Wj6uzYW8R(Hc&Ru1%pAOpk>F;a_ zzvg!1bZ+XtQzExW&^`8_Z2A75S8EeX<3T3qMGk5EVaUFj9=?y>FVGA9+^e#fzwX$r z?%@6SojB|5jMDc10GG-0PRTMhOcL^^tdW^c zu}Ez1MD7~)z#Py=GdtHf+obck=P#%sO(~vXtXBU3sGq~ea$Xla%kR}^YV`cLxo<4* z=MW7=(B!X4GnONv->_#Q{Xn{L1xXI}*ME#k(HC-dhA<*5(6jNJB~BsYm_mS(lCi2< zn8d+`6);+~+WEjTB!soVc2mX;{I6}oZCFJR$4b633AI@Ksc~2Zi^(R~Oa_Tu_`sBA zZeHpUppkhd5?N#+mQ?BXD>h4Z=mve#2mls)2J$3Eo`fMBlYE#+WL04RP@!!GnGS7^ zknZ$mw*gICR;G_76BBYbFpSpJKjeU=BwQjGfP+IP@U<)hgeES^+D6F~rHO{< z76t*uC@Q>)h<3b8hLJ>#Qdfg&{Xn5LA)(1{9&$ zGZ77jMLUCJPYePFB>m< zSGI`##sXw@_{qeJBs1WXoSw;YBZjr_j@pm!Y)FCb*fjTFOpqanTI5@$eDcaCe$J5 zGv;uE>e`PWXW5d!W)|?2rL?K3vl2^fry45y<0PqL;~A50&IkcXcfDy?7K#%y8ma4B z&MzWdkeNAR zGA7$Ik^p_+8?O7yfR>t*n8aW_ld>k|An{cBxKPs@vHlyy5vWPpaAI<)%1ac2cMr%6 z0eEw@?f`}4I>zD!!n*vB6RE6ZlzlpkBY@oPj8j$ul;a(brx`RQ3uII^X0{@1APG|7 zT}$Q=kd4Iyl2oA4Foa})6^pEe=&&sSN-(NIQw?ROM$#Au1orhgGP0iPGm4_bYbhce zheM+q=OV_c;uBM%6eh)xgzDNVdMi>z8ytt;8@UABxaLlhO6zfwm}n#d9EF-3aJci1 z?JbLAh{S&v<8!TXx0@C z;t4@efkX&l-gJU!UjAL#!G*t-j+%`T>5Q8tjI!4kh8<&)3T+2~Pk}w*$xP${0PA=) zEMVufiIBesSt5?GfZ3*(1hfvAfk1dtKg`jJfkGrJf)HUgSwoNytBZ0hcIY?m`{6(* zOVMN1z><`)R4hly1Kw8DHYtQ|B~Gyvh$s<6js+RL&TVlcs1->@i5KmQX1@iP6;`m) zG(tvV1Q=KZ@~lCQ5>83HnrnF-sbK~Rw1^Fn7&=LPJ}^5M!s(yO_h*^%&QH8d07{Mm z%%%6hv

    Th<|{0;C35-Fe1{k>-MJWFj4Bj0q3VCi2usrBy=xbJc&oG8u$Y zFY;%*3^<3FPoVwsCHhf*tN72o37@AVOr8}t&>y^Nh8Wd3rp%Fk$I)QEgVXaaDX&~t znmN_;JgEqO$x)qC^@rJG&mRx4vtQ}v7vV5R*;Tl~3jttjx*jJCT9QJ(4tsabLFeVm z4ImrK8>C!?DV`TMuRnZY@*xI!AG_NisG&hrv4@X`?-Ren{mKmqbc|8eH3~iCtMw$p z3*pl@^MfsK{{RkK9*2|ZG?Sfmsy=0a08J!|okt($K#HS56chgdRy!H2mCz&JR|5zK zs%xj;9T3*Lh-KnJV|pY;Em+ejii(BA6iXN5wsDBk&VHs>&Le1JTrkweyiRk^M31K= z{a`{XN7Q5z0iXJFBj4xkm=mFoaKLR^4$RXf%J3v9KntH=f4pK33zN$A4d_nt2mL> z<}w_vn}>tBFj9x^@FF@HZE zA6>E7{Ng4Q2v7IFj3U`&Ns)vmJw0n7&jciD-l3rfKKKY>c@m3>BPa9fJEg710@5bm}Ts9&w+k zm|x-J0F1UGi~|wk`Na)(M3}{BO%UlwBw~5S^2d}%=HLE>Q9)?@C zQyPzB>5}F>TjDaE3k2z|{NOr|mz|*rffIb-cn^%ia+^0&$4nlW%5Fo+ToWSVq-qB2Kb_77*w z#lyejtLcFB)9Swn#ddx4cl&Zn@ILLCCX&+x2$T5Xx`tq<=aLF~$N-4qLFvLddSOaX z1jLZ^B1rYee&>q}2duF%jz27JU|Z_S85*YN?#z@0%6Zge!{l8Ee)zT(3M81msLbZx z_r&7(8o6@=`t+oNA`FUnpS`O=yS>w{8(3`+)>Lra&buoxjI9&Q~|<`s5VnfzviW z7&+B5VD3{c)7$bn(;CCEBfI-f5QqM2BGOlYh!C=6S4N(=7Ofsr-a<(A#aVS2s|FBq zP-(>jC2Q1NzCw@$S zFbUA%(2KH>SmqBM^BbHwMB`r-XCoCQ0R>xY!#Bad@G z%KeiOYtT#YIU`oyK#?FePfTgs4W7^2C?$)~;Ow7XUhu0K1cW4s)&ns{NItCF!+;3| z8|-ls#e(TDWc&O_+a=2R$A0W^{{UkqR)rLE6%JUknJwGK3_Kwuy6Y62x!*NBdrmm& zVYi8SahSxyr~--t@+lKN89ph^1dxIBv(7~eB(IuikDO_lgKPIPEVh#|T0^y%62xVQMF{p#iIKjEJGXcNSUfw`W8lqYJ~`tKH9UPhFb+ssDy5Hy z8Og0HnrYhAERR0s7y&{%Z2*2UfSr^yrMOEPVr}Y2#u0n9%~@g? zfdzu-)d&g!7$5~4spxzmQ5}gACSWNf)7_E+lmyLG8?=Ku8F8X0t1TdWhXj-{1Pmz? zH{vr}FT`d5h7S~C8%?rRT(-@1V1$YgQM7v)5CjgbQzZlBZ+TJL70YVTJxeCh#?F+i zLE*HdFo1WG(y;i*w0DH!+?CkG3fS z%7(yE; zDV!qtn`az_vcl53p-#>-jmXCcqezr=DvN2CDjxwXfhoz@Hn3`z@Nfzzj>k(fYlwRQ zvR@@sqQg;k5x@$FlSFakpa%tc*pzJ-<}Vn?oJv%{aT{Nz98)1=^qk)pQ^Sk`6ZHj? z1#Wj>luJP)i2Y4^V<`1%c7C`20F2h!dgGOq-{zdJ zq;9ohLMV_)ypg)NarDWMNfI&bgaJ-CJ@XhL(1?e8Tx^rwg;+@mk%y*VOjKL>$%Sd8 zr7$sn<@d=|H(!9lV^JYM{{SXN$uE4&hHJRu@3?0r2^1ep(v;jsf=`?x^$a5tbxbSj zfA4a;KT-M4SG3=3MEgSf7>6(7++nqU$2tCX`z%1(OPA&|%6?ppZ!iA<7li^o`Jnrc z#syv=KKv5|gz{qBNIB%f|pQvkJ}&lFTQ^xjCG5;Fu{~rByY)_l3ze$Lx{#5MA0_3E+!u>9xGTh zQ``k-)swOn)@EhG?%+gXk7;A zl1Wi`$kRegso!4CXeqmrJWg1aQ-`Mz;n-jtN@Rrzbe5Go74ph{?W{&ty9F9%pAHoI z!|;L6Sq&Ph$gwi!>m{m62Pyy!#Q}myB^H<*1YccXB)SG<2TVL=mC{pZW7Xb6b!>ot zEI~bj1XxreGE&ri0>9j3y-BE3c|2Rfu$JG6zzHob6K1dmm)HHui^8s8@WXVDlyBSj z$r|xm?kiA8D0Lf&QWPib#|U!VJgt%%l~A&AXQqU{0~^4X1)iLz%-@v} zi3KFHLzpqzP}~X_E1ifH5Q5XTw$Ua)V&O;(zyeU$rXVbArp=kb5|G+B2$35i6atXZ zAVjn`hY_MwI|s0|f@y*`TS)cm0<#344!4kuT0$dqtzg*1=xHOHRIf$Zl4ew<<+r}@ zEW?*n;QApT14T%v!tqZm`Dj8~H&S5Qc1Tu4$hL)z8#y&4!bDCJ?guTI3N%bOSrA6z z=bNJX8bGx~6S5tkmNztvky_}~CQ_iPKpbV? z%v2<-LCYgTooNOlo(0~ooR|nJE0~bp`&>7Gh@21;Z`7MxXPR)?yvmm zjl@I_^1xJGheBJG5)58Zz^I2S4VlHNj6_O9^59<+aW^%NDL6q^pejlUsChCYM9@%e zrerK4L5)a=1IUDgTr{mrvn3%Cg5wHAS^&|2lNdo^=O?02^&f+dK}Kl0&$&HTu+-q9 zFd7{O4t-ri<}ips(QA@nn;dmrj^9(;H-&ZeI6kN3HG z240(tp2a#DJ=Y|lAzDaJE>H&E;r{@bh;B0EKbpn{@F8;fU#mW+1Mim5`w|5;Y#I^r zN%Mn9dLz#nlo3jko|Ya8ZkYEnPfm%~L4y&a)vtW}m=n0dexO3_ZzkF=HR5j=r zHk)i3yg3c&!0|Y~3cE+q;56#UpIXnn;`hw^0r$gzyBF<)>*SxtANFzlEOap?t zSJ;y>%wiRU1i^e~{5Sqx0<1g+^T=gpQR(?HI8D(=*NhYkLefINykfc`+?DKM=qBlz z#VSw)0T_X2Xur<#IAI9G2&_frG}-S2Mp+p*n=Hz&c$<(%pB81>lcF$VdA3^9q22W7 zBeh(?M+UOZgn_u@##3eJPkfm&+!f8S<0pU5Tma-ux(en9mNMG;huy|Apr~efL$S#K z;jrLF_l1xP4+%lva^WLUsZS2S3twEmMoCIXiDdc+B@(IuEmtx6$*vMYll4#QDGHm@zvEkkKfn z62#<>tFnBiUkmKT@Mh#XfF2ZLT7<^w#jvpifyK6ZWI8AU& z36el8(xy+oLG9lrIJhrDeRFXe0>CcvGU7~YkprOR9OAH~iYWjrK^HW#lB9_PC?TZ2 zg93O!NDu~UATV%dT_+}5CZW_f1AjgYMj+47;^bzbvjK2aMpR^uB;e4~P+LJMM0&+R z0L_G^N$eti*-IzPzqqMk6N3tPm1`8U;cf#_2xyrT?wC8CddGcz2stzmMwLx2b2$XI zt0lE^$kE^76i6TiFTC2a;er;1v?YWZXD7+LQ3Z#Prck|Fh+%-H$Al696bp!E%82Jm zu$^86V}m!9BoxhQ0ceon(gdTGK%K|~P!SkBfQYamVX+$b21)AQ!KJVQ64W+;2^Dlp ztOR+sO+2inWY9>L68T^-$=)EnOZGq#AYi{%DTQbS84(F-gcq&hj}N?4G6EC8ur#0n zz^&-=G*g?h52zN|OH7GF7HcGBlewHpmy=l&pZ@@QV(%?{2FLjY>@ZbNlkQnwO^Lu} zV8oCIp_iFGBNH=k6RYuq7Y?N6^OK-e1ST@PAR;UtcayY$c&pa2>~ZCC^*#RpNB%@) z#|;Z-qZ0+&a?uPDq$yuzC__wtaAV5~RXskWR2Rfds1=KNr?20KfvIn0wvfhe}xu-1_9m zrKKR3U4?$|)rtly{q7#<)fKp3njdCoB z003OJ#**^djHNHFYZERtu;TEIBuWQjOA^LHQ{l29a2^vBjG||GvsojN*>lSM@H7GD zEkZ5G6hIQaQS*Y-(w5A3q{txBqEgYp&LP6-PWfjI#5a5K5dQ#~G<)tx_jw{v$AdX6 zOEE0-I0;Yi9b_T)l%58`q#2Ea^X-62fFgS)o%il=P(!m}E}x|*IHZ9v zD-%p#9&ibpvnrH1I@ZSpU7e==rxJ8xnDt_VNz|IC`SXco2oi}WZZzbUf$q)};Lx!4 zvbbr-ffeu=2tyMM?1K8s(-F--6>f$BO!7}T1W=wyUAy-A!xeO~Hg#Zh8uxdW86yHI z6O>4T~G#q@P|-^ci{u!-rG4Sbqx}bvG8@vkn52E8=A!^gX1M+QqVsc z)S^Iu*7VEgR!(jqP+A7WlA1mh!AXW#+{I)F0_;*#kYaP<%C}5|xXLn0#|#fM*xgo1 zmm?sCl4o%UAU4wyhXq;$1T+{fSBO<$N%1qrm?h4fsVH?MRiSz#NKz~cuYgaN|dv~WsX zl!zLoF@(6JC4FTXbn&+&gan93weUdZFj6j-i(tp8vj8|YRYcjabW?psiZaX7GhvP| ztTw(7MJzg5E*swtBMFIPLp;X(6D>)Q5`r@1stF=PghcH4w2YR~7!YS!b%knb(M4qu zNn?`<8eY3BL{SRFr#Lb2kPO$hCsMP+ypj$Gjs;{0}aQ>p9zo@+JKLz{%ihk5Ab-B=PV`i z%IUA-pyL4#3lAQXpc zN=!Ql_l$U!g$b9d*q=B-X>g3uvNwsqBUJEmAO-M7T!=;v#mA;Mh$y=jola8GDZQ#9 z7{EhQ>%4_<+B+n@jtINzQmtRE1ETRkVlLpR$FCSl;V^tNqWC8g`VSbODFIAV#J_wX zmuQg#5JWnThSb3iK)xoNoaKA0BpSgRC$LtnoR3Bj#ka8LHBL1p9v;E_v0F%Y zEVi%RewZ5M05z5n(QN7}Oqc_sxg}EaQ)dX+$txm*n!b&i8Njlg_u6z1f2$LNHun0i z=JoZ_LUTZaE(8_f_&Rr~VYw28i!Df=f((gctR<_{6xbk^69y{eQx!1;T0>|tg!G7spN-h$T6+N0r7<03Z#};fsZFKhGpEY zd0|L(5-Ly(B8lm6U{}h7<5#?2A)h>8BKHbyDXFt#?=VO z!Kt9%TRm4+qTDQ-V3t1DiCnim27obQ5nWiD*Evo6W|UGlSdeaUKvZfwO_3*Alr8+v z{&4>Q)aFm?`2PURaBIl?BRGfKK8SvqYY^H4)QZdEQxJ|`KrmQG%K z$qJGBr-*W7mSuclcY?l^Fk?WI1RZY=y^akw-1x53J&#f&7}t2K6KoqqY}WatPQ^;bZv&X8im46CfaqY^u=d|Ly)$*G|9Ky2?TvZ6XP$^ zMWPV*`M_ouP>-xyYVE!%ZN5F_9t`WrnmyLc2{&o?f2WvOt7{%cmnGrAQ@O zwEVcB$Q5BKraw8hPO{6Y$r}l!-=Z)oS`Y#QXRDzWFSxkyGS}0I|eZ< zMXglJ(88vSn{1p&8NxO}ULaJNI)a6U>^&2N99p{6(jiMp!G@l2N+_8cUA4Y3LE=q_ z3n*lRt(g~NqU=H|Pg1fwZim`KQuWiE0dFXwSdfCmA4W+;CSiS}ygLBE!O40K#dhK# zstFD}umeE88jh=rDk%g^!$~lsIkj|Ci4q`0u!qC8{*bH#fR`f=2+7aqQg!spfpp-} zkoT2oBxyenI0%su&Cn83h;34u$be);4AB#=k+pE8t%sdp@QmxAGPEP!m2O;yYYmVX zuR+seO$h-dh?5YV!5r2gA>a$;G(`wUw9{g3i&_wZW`yL((6eH2;nC_i3`Z3>b`_ch zh`_K$)OE_lfvlw;OJ46+0-+kgng!j~4;|0L}&! zsS-1yFcVQHv-rU*cKCCE2@_9;$EHwX)RTMc{9pqLq_~8VUpPj@UXv3O$0N7|ATs(qBo-$PQovsJhnYSs`82!hFT%?)gKG zOc27b3~}EEu0$h%Qg*w5-FqBPf56%{juhh{NqFiKn!y+m!EGEX8!}lMJ^}rVfCMB=kx)Yh#93G)8UU3{ZID2lXu0D$ zCWMUxV-qs)9T#Gud!5D!7lOz%+4LAR@kE@DQ~ftXMtTf7CUm6zKa-*MgppJN0Wn?h3R)EaR& zTE7uFsErZWiOmploM7OjV{+LinYADoJBH?z15FVXii8F~Gq&3)b?-K6vgPoe%J7~U zC<+$n2$8CQ#8#VaV+cK-X$9u*2vtA?MI!bhM%f4>O38hMqArq<*iq0038ctMj6~U> z;Uxu(wu%He4yIFB>>Zj?oXdS=pvbI(4Q4=j$|Zvi4MlYn#m?-*LQg^1DIrlNx2!5# zJ&1xNk05nX0WTT(dZCj5185(Q=*5@aor;ik9>#~=kt23j%YXP0B7HBWO1hi)VG|N2 z76pn|R}U2{J!AzZs)jYceAa8?Uj!LdgHF#|oElFt1ePihK%WWe#ed0+ES;O&TwwbT zf6Zxl9J}Ntdg4qk)-z$eG3)wdAEEu{^PHbIyNGT3OYX-dO->O5vlvLT zN>7vK@=6QP z#VdFsbc&3e$uAQ@%Z5e2^|*!3k3WYl>z^OIzQ3ON5~BUGT(BEb`vY(D8R9J>*JOW6 zy@;pknLeAsqCp%txp3jCjc6GYmPvFQ#pbRw5b8rX6)L~bV@VUOlAK$k10ygZz#-G= z)QkvA-mIO*Cr>U^O$)+PI z5ryR@@?<2R>4<@ekt67QM+t0<2!SnMkp}Xcl4i{d(FPWjUR5F&GYf!iogKMIri^M8 znJ~d+bYO>R0R-7YSj0eUrHd7ZA=_msMd~V<*-99bL8x$^RfBFGjf-|l>l3h&M_96i zvn`RQHLbRf9vPD&QINPCMJ$7ipiYel!nkgT`b`|4=!A;)3)+npjhGF z%xPMmF40AHJ|)8gX+NIx@*nlX%=i7Xpnsk*;NdRrKw<2hw9U1$s^$5}QU$b2VqmuC zAr&C2-ER$p37MFkk@mns2E`Q;mj2jMrMcWp_{q&G4bRK}023L%-ZF6b{F%+Q*H2tU zsbiM!cnbVJFb9;!yEa>V!bffAqYOCNcT1*Ue4CNbsN?iA!qhTLv;Bt>P?!=ZeC2>4 zYwpCfzJEB>sSNYoG-6JJWD>`%<=_i2QhJzi1QPR0ipVq=e&v<$B=20~3x+0uudwUw zRBcrI3Gvk~C~?F&qQJtC_s3N@m?nz+g(kW&v6g8uZEyK}y{Z@r~PhffXhY zgimgfCT|l zF!m7=IJ`5E4VCZoK}$_NVdamUO9>dJI0oxP;-V7Lqe2tv;+>4k5%dH((P?rDCmb>m zRtla&WB~~CYY4jNGbuy^2=JFK?s{m=ywO2Hm$CJ%3>imYXbp*{HX$KECA1y#Vo_Tt zs?PFP1C$6cQv$`v+6|?o5rs(bF?^PqQY99eTv>`P_*qzCdbzo93n~Pg<4lTr*Kl(& zWZr#oB-}>Aq}M5s8l$v}6~M@+V?t5I0mJD94iX_H>}#O-<24iJ^yoea#PW8l>rllG z+3=oz1?YW#Dm<7VBX|K&s{xhpE7ha-m*)7A9Z{7(qau9M>6?(9eOnTkghuS($@3UP zOzO3Rc*LZJtvw?FDnOn{pZS(}fN$krY$u}H3yeXbGkwPLT+E@{mv6z7!2lr+Mae z`r;|Pr&65yau zq)g$+X+nta&3fg=AueXZpF95m)P@a2OECnPa*NOBY`Sh}5$wNLB#dI@@D zmfoaLuQ;%iv8;6qin<%^KTP!IrVJ%IV=Oa}=NNHBNZl6YUV)z%9EM_ zCr)al2oBbqwO@FTh)yK%ta_Q|&XesjR_ACbTuOjE#jFY6O*kV@OS5uCq-z#&)S zxX1)GaW~xJS)%8i5@bpvEn8RC5<_-r<&a82_ArVVMHIA6!|7O{N+_LxpiFm;7M%JX z*r(oaS$@x89%d4|7F)yMVkWT;+-hx+dQl=}1oF)&y=nNuu-DjnDn5>~_OMSvXM2t}?Oq~)8ug*xJ z6Mf+Ylu_C@yirxVQZGr0K`|36yptLXD&=V<2CTlX%&bO*q&5>abYjOu#ELEm7y}?g zyqJhW8cquimc$w{%HbkLvVu16xd~(hA|<`2GZdv1Q7i;1#b$$y0Ro~TRbx`|xSMD| z6Qqc0@S32aCxNg6X3*@6VkNLl0*IvnH`L>XP5~%c@~{d-cNu1qR3V7ak(X|a1V=y| zeZZ1R76BOxNkmI#P5>Y#DsixdV!#~;+E|XUA*G++#ci04m^p+w1~HUG#9T*s$ehbT zi-w6Qv>0&0xP_Y5+*hVy-b~+!odpmDwv}e^1mwP80QGDUX>T6uh)R_PpnYJMA{L`` zMJc>=23N$uWR?LD1tc+Uql_pMgLE@GE$YPZ!tCW`nC`)dLJp~YrS-vZ@#O60@Zd=* z)K2Edb8kHKG5o%Q#);Zqg??Fbg;*Nei~>RQ3A@pZxV;a{0%Qa5LQX|@6l@!)`s9N1 z_k84aRL+LqYz?8&v_`TiP(-l~CNe?|pC=vOOWWi8#F)tnYt9Itul8fp^vFV$378}H z`ORY|auL4qi=DemM)bH;Wa;+@oeFzB#}u99OSVm2giM1^9Nd_U4MZ4=df zr#wf`?*w2Tg8ndEVNg;|m3iZ_&IWV;0L7aAZa&eg&;tO?R;AJ+y%L?3knH~YXRjWk z`RS55#Rf*?if@_8z`}tLktN}2qG2PB)wuS>fDs--1*Kr;BvFYYWpn=Iuv29F3BNOp zXdzNzLWN6y+53;s;QRF-v5%M2zf4#536ehmJFlF8f@?x)v5^aX-aR7~?YLR1*4Y8t z7qK-t=slP6VD>+JuKu6AafS^r7Y(a$4|V#GFx89XzCyTC?kqrWjYU=(lF*-otE2lq3Y*PA`X|9dTJLQCCsw9869IiGZaf0%w!PF_Q5NFrvfG6gddf!70CP zFqKD37Wr~XfKaTr;g_FaeE-Uu0#L2uHO(Uo7{B zE+JfA2gWWA@PtqV6g(8iDg6@|*C-%@lKNu+5x@u!)4TzMZb^khd|^f__CjHL7q%1_ z<4uMK(5|wO4rC|+cL6>JW(9bnni>dh4U;vx4KCAo31=r0C{PmYzQ#<5 zhA31B?r$IsW=N7i^oU2*#MT&smx}D!;9gA(~Sm_Wi?`tTr5({yxVv9Nd^9f^_>ST>cmBGJ+b?1wm(&hYlYJRv?=Wdz^NBk_(@ zXrs`hBl!OSY>(mnv-S3#&up)#eQr0nsI2|X7x zri=)E!4T$b{{X@*b96<-^^pG1{qp2Tw-T+aBS)HXjfsRhgf!kJnb^Hg0f>=Ic(aAY z@*XwooA&fva=;Xf0STcv#5yuJKb8BV2WC5$+;B>dVEh@Nq>@zqC)**$?sfgF=QYFs z00t0B!LHto+B#Y5pZS_*@D)LnWYnTPv71G}%3|wXONb)0%z%k-UYeit1@ua~vEQ_O zVA;qCJ(4*&{{XqD(PWZTr<=$mI0Qog)pd+0#}i?Z$UC2$B8S(H(;&tC=^t!ci24s> zm$OI6^a%Q7l17#w`YhddbJl<`m82``cZjWFK!#kntz$;OPh#^V#?Lj<$Xz70Tq|=h zR_3EOqMYS7txpRsWEWLg9QVxlm@L*qG0D+->rL_Vm$N{Kz+{l2#oKrypiZ|BHfN_< z8>2B`+s;hZkD*nAU1q0hl(<_MQ z&CAryr?G3%!dCK^9=tCOR&`P2Pp%Z9b0b(jr1;-#iz>=@q!dlqPLpq3j03~{^~fWH z->f(>D7+DbJS^gP(eF_wj5T?iN=-Au1|(ZqsxT>t)?>~Mpa4)rW(k-vjixVMG%|q4 zVThX~nsT*ZcRQb|;dqMaNC-Zd5vGP`{*N6f9)@+%hG6Gy!eQZa5VQ$0m3$L_uJwkK z(foLtYq{tf_rMrJVDOjKF$_QQ4F1n7G2;4J88EL3hSt4IMRSltKZV4xl)0J%4?8uq zEjw_+n{t39GWBN1&Ik~|3};b6xV-U@Tb7!R^SqO-g92+Tl~Y3L5XylZ2FgpKYofKB zA0NgVczk$*dpSFCq#9I%5(m`YQ|v~`Es!xYCQ?q6 zOVIc(nAZ|YUIxu%N(0|~);Wq2U&*M%6QOA=jyCzp)=WGASTQ@t<>YQ0lvaTj*CQSk z^$)82VjfRN?T6ByW_B2jvXKB9Y{J9=j-+JQ88MJSu)Oqd_loYymRWlA*4z|IB<7we zjEg9}*dZdp;l-IBh<8c>ntHM3uRWnNXtLKx)g2n5VRBN#p}*%1G=#BhOZ{Y2 z6o?U~Eruf~T~1PbVM#U!0QE3Br=IK7BIigN*gy3l6F5ByU2l|CX3Om?uAPz6y8XeK#-CqDzfm>kc)b2 zt}|p5-hdMfW%9O2w0dUYal!n2U`2g6`N~lHI&uCgv_?uVsl7+j00f6ZEufTPBzZ<0 z)4>TXNZ?qZwq3BmCVTgk4AsQ+$H9(K`XOAc#`((cJm1Y@FEzRG-W6=~{TK9bpYj3t z$U0QdRZpgR2idRoz$D?lNq#X|L-!^1#H6j#V7|;6Aw4e4LQ!f`Fzl?5WQkxtVCe4` zDG2~lLc`N4uAkv^`ki5jzu4C$S0XKAZT6NRf?2wPSJPL7fl8f6k?t@vh19_;mYS=# z{rAZN8V_&#gNSs`+5Kjd%|~S6BZmH^iNyFHaf5|_cgA1Y7*9Yx$3K(npIpb67M_RJ zuqa0#LO#p@Lto_k=K;FJN2#A<`@i#5(O$PqcKrR{6EPl_USW%*M+}m%Ex|K;Mi`rj z#VWaEtrQXxO&#PR0z6U6j0%LL^5;X9BiVGX7?u#E2UbsH$$o-l?Pf21k_W(==Y#(M zOoUh!s=JOX8sK1V_`zf!S|{^>P-}^a;6=r1Jsx_+f$nHzs0dm>MAwWty_{jpQhhKL zyQ8hc&PN{~IA*xp>xcdX`WYxWclpBv8PO|6fchp*u^iw-q3MXyIW})ou8*6zOz#9p z8QNhiG1J6kWXb`Sh(bLWazK$}3PV^rSQbvEFbGO2koDnFhAE$6!GKMqx0{OKbEm)j zVz(MLJtndqe=czbrNrNcT1Sy{C!5s%g& ze{vl3A2W%zKn&$^suYh@)?Cvz;c1lY;}NM{h|w_q!OFHz0K!qU&7Y33k)stbRbghm z6Tf_Tr86?~cZjH9mS{Z=PCwuU8^{WHgT!~=+c=lEKR>LLkO;$KcvA|^s1ZO|`WR!^ z5+_JUtT}Ndy>y6CYf=EoUMcd3ozW`Io3)r%3P1wq)JG7f1HKXEsR)9}5) zykXHeByYzOgy1bdW`2Q!JrV?y$QWHoe5JR9SOyO>sl=n-5Mz?_uHVL^H(LHiDnmr9 z+~wITNyicy@Slsqe;;OU7Uz$hUPxAB+JvfhLZRlIy%u=nkID_`L98LU0(h9-nrSeO zRRxFzGpWp6F_ikHL32q;q#LsUD-;1@Q{rE2xx`PC)fi*pP&Co2q=@p?ut-31+U8gP01-jG z&}CAi-X(HG%`QyQMNQvpYy8A=I_$tZ?yPGu&<m*X`wI(kt@ zAdD8qN5sMHC%SrKo@bF!&EW9a5NQMi`engDq|BRi%R-Qc{m7`(EH?07JRN2(x2VDZ z%M);%F>?xZLFg;IGgl>QSVMDKFyEp?cs<>T;xU^7rNCU|)(JZvh6u&fg&GIf243*R z@t+Z+^=W|cm-SmRG_z=S`aZc6HXUqzG7vwUSd=AoUe$Gj{Ri=o_TK<~acC560VzJb z}AVXBBwwYzy`=5)cU{<7O+GVgbRU z?9cu#zE%gNe)F;HN&3zK(GC<`9A=efgl&6dd9GxCF_ea2xipS)Q(>o>`e1Y&q4mY2 zQvU#b{TvHz962RRCt_zFGtm5oEA|h`h(AZ^gDiqfK`o{R+AtVpf>>U(Qwp-~AKQ3lx(+{Bq(O*!GZS(hLd6H}s=8!}p}5OT71$ z&}A$GC??3m)hZt*lK%O|CzarY5~64T?%8pkm#Xoa;coZ=;LdEwK>)VK_l!>Qu_jsr z3|=zXtx*U7BLrxAYc9`0C;$UA0lqRxYQv?Y$YpcSh*&v7B+^7!&54QBK@fn{DnNu# z2pVV&Ml3Us5Rv6;SO^AyiXg#SGnN>c6P@XeV|%&YMvBgl1;X2ls-P+KKP#T2&JhOn zmJz)Zd-0N~(0a5PYq$M5EyNB+8^weg^#fVA3?J6=-%j>9Ph8FDWsU3l++J^5Q`t21 z#*pGQQt6iP4;?&wV(Qo`shgjpn?T+{l_{{R?^0OjBsa^R+vKOg3GPjfECI}@?l zmPnlx_;P(+&;BSAU0B5Ei9m&CC$4@l5CDWn6Fu(>w43P0*a8biN#!`Vn0V#mSXy3R zb(e}nikkAR<@%e65ml0Odr8GCf?QM*?;sqO+Nl2km|;o6tFN%1DgQ81^XAW^?xi5Uk!mDLm=Q_6{HdBxWa;a z8$3omeYOeBM49N80BMl_XtK@SC9cj__k; z@+9;&`xr5w4=sHV_TVQ$izf-mg)Sh4g9SBaZ4i!7ougZc)pvm@Y0LB-ukP?ru&O{^ zpRvwNunr>Ebp5b_7)8g_Ok;>uoux%eA6!L~4#Cw+o_~yW6j(MUHe%Qyrogj&f~e9Q z3BUv&&hZfO{k&D|#tJIxI3{{YN?F87X~3-IRNErm$3H>ZFm)J^E_Q{v1Pb-{`AF-|n8OO}@&E)`ZZ_zWBiH>@|u+@8Jh5M0t?j(D$ zeQeK>J$W8n+4wV=*{y%!zFJ(r=@aRkK@T5(@zn7?IUs#-R8=zEhREO381XicJ?qQs z%xJ+E{yAc9xCfM+k+@{D5dF(|BUjkuE#h*0I$CozNWo> zaEVLTi`Gf5@P~%X@K;7U6Q3$1}Cm8HN*HIJs#K36Rwst!Y9Dj`2=FiqRUPJGh zJ+*igkRI75Y}OBo<;UB5$ankwnCssyCdkJfgV0*yO2V^LbSrK zf029t05(W!+gEGvBFV-AFa=aNF4_~wPO&4Iso&R}lx$8&@B5sAJ`TAT8GEH91swy% zLI{RvbrY{|rYKPd1qXMm7upMQOGQd0$n33e%Z)Bpq4#_F#_YPB1I%^N&M+ds(i;1; zVl2%Zp<|^=JHu?Gi4<`dW@xy$d^pAs6wq36Cyw!`y*XzQP|4W@7uFk9FC&=n;;_@i zH2vfZp^%==@cW(^GAE}wya;QokHz89`ZJ)oOTjsYl)W{cUGu7Q;8CZ3a(!9yJ2C;XR&FfA zG6UK7XDazOL3m1i{%|5nA;l(>$<_=^kEG@2AqW0fugiP9V?KsV5UJ*O{{ZfY>k$Oo z)MDx8KUtbi5q)Cv7s*!xPJ0i);71KTOb1~r(T<0YvG&L%f3G=g{{X_tj-mSMFxldL z9r5E9dXL$ZClDU7ADj^<55dj<0022KEk^ayGi0HELRz}ZTVKsRVp)R(jqmk^dImJ;ilNqT$Uv6d%4Vl(0T=MfX_bitTfT5< zDNB?a`NTS-6RrA;-1kYZjzbWy%UbWlryOrRC&cvODflZ8DsT81B~ezZM(Vi~;OO}u zj642s>j>YjWABopbs}?`esIVZekya}r&X?}EXW(F`X5YrL(NE_$+)dg)mC9NlVWd=_HvW-G(RRT0qzb zM%=Wqfr;3!Yky2~^c&$fIaVvyK3P0`C*|M%8em%1okt?COumojZckwN{9>iPxV95B zI2PIu-7hWvF^ha;^|hOEpFOjSJhRBz_4zD7l{bgxHIYArV-}C`9OjF1 z->MfOc}?OETv?B&r_OEaA4X(d+`ro-y>Q`^-|-6N-0_n9aZD`q#y@Z?W)t?7xx|Yus=Qrx$5{B_-0_9f`s5Hbl&)P(dh0xO z`OoK!BtHHB0OTnLw=8p-l;N3W;yQfeOv=$FfN=RFz(gVe2tj7LfFs z`Z$V7NWP~m0l)tA=C=y$;+QKR$6og_Jq|K){{VXAxAC6V8$FOGcu=ILdckAZd4Z2XR#}+sH9 zo(oea1F)Dt^1M%M9*Ya}jbsXP_^skBITt4q96*X4NYw z10KEi87zRdrx^q>mT_K#z2`$O?QuR2SJd9OA51ytR8wo5^DXIU1)YtlY7f-piY za_L^F%8EjC^#Z3#M;W@C;q>P{2gvB-OV@sK+^T3pQ-eXu2J#)0j7+jOGsyLceLqYY zCK4N1NTbPvlOrL=W-jQ&RD~qejEZ3{ z#1TNDR*q3IOve`)yg21KS_QcA6-IQdcemjen%Hv8#O!WTeM5QbUz)&biPG*Ngasi}1 zG2#Hx10QG80kpnR^uUZP0HT=N0Hmj%&?nzEbD5dV_v6cO3GoIogC7dP+n?=I)Ywm$ zFrx`6E9yVLI7G?lcxAGh1bkfM4Evv;%uk=imxB;Fd%MxQpRzcJ^e67%i$`Y+ z@vgE?h}HGI_l5EI%D(>qeE0otIMu1dk~X!$$$G$EM^%8T2)}sFl77Sc#!(PlTdW1F zZxr&#@h79N_ZggUS1SGH;*PX)e%UNF6?XnI7?DGxtRdWR*CKI5!eS_~tV}{RevIMc zEfl4EVjMXK11Hb^k^cb7O}h=HqF=5~v!yLNWa%SEpAUx^StPFN;7h0r##@1;3`7^h zKCP8mo*$>S6T%$7k2s<$iGa8Z##_ygugh%B+X)zFsS-tg3Pj5mYQ)0DnQuT zQCT5KofN2qienJ-jSy6M5CYbsaaZYg9)z^xaqRAaT^EH*M59TG>)S>}6%s@=9ycY| z0Fp!!k-NJG!~X!A>dq?0EbzKIFy7WU9R>89q6(rA_7Bb)mYYMJbROx8H;b_!di0#G zLy_)@lgKO-ibYSe_Q{$xcvdS@lax;e;{4=VfcLtYz?ZX4T$nbhF~4&0NWL`C^6oIy zGHn;%?8aYiAH@A}AmUn(%@oFuVt_=z?fPNpK9YOIjU@)R^3Uspm`xxF(AQjKhQcP% zcuZuC7Jg{^V&ZO_Pf+0zB-KF}Grxl?{(bTA`ZLnWCQ{M@i@COK04w~b2HAVL%YH-l z%|cR52ae3p$xjH6b`i+g0K^na%)f}a#c}l&i>A zDnGz;84!Az^&H_doxKcMJo3xOnb2pFBlmg^B53q#c`}3r`MclKdv{G75DsP&F^&y)+#{8 zg`9*9p#HUxhC_WPNz0FPQdj_@>j4fzq5{ED=CFHJ$x2)3?;jF4HF+4a?VY>GOKcbp zPdu#g0yx-TYzBf{YhnIt458X99A?zOI51emA(s9GB@B2mm_)RxfZNwAE*%u5ms-M5 zPoe_nla1l9lgS#9{PT|7hT6$a64Gf9IYp$axIUp7un;jL_Xs_ojD`X*73k#n7*!Ao z`T)T8GjYEi_?!YL^#k|(CgH`KYV2Ba~${pJ|I#S{Xxj0b>XpOS_<&zQ1 zpFHA-SF|U};GZCUAZ1HshY~8%_I|j{8m*9XfPjPWzk!*R1dwP@8|x;N6;|QzAcc!? zoqpJeV2EhUj^N7(@iZRQk~*8)9^iW6{*#bAeKPW?l#=P_G2=V%;@nUYIsHG)XOHzC zwBQ7zzihg-Q303H3{@D!05{R=fHSC6_k#!(-G~D) zcbDi=QN#f)O~wJJ7-&J|%?wR3E(Td4_hgiDtdfusYbT&2hw>HFFvi${$xy@HbGy7x zRxhSC$dN=O3}eih{TeYgFHtFeu0&o_@cvEYx`u$=_MSHX0J(aw@tXz8>&t)FRvVoOYxBF6y*|6 zy7hc%4B_J797*!xtPrPu6Z4K2KaZvlr~2+O%jvI7p8WHikME2`pWI{g<9~R<>Xh7O z>fspw0Hz2BhSVtgpKLL!%27%3X-tTkJX7|_Q3MJlP=60S8u#@gaOg>I?a#~ z(N7zFF-ot&`Mx$E3H{d=rXE!fO&?4P=oR=d(2>kb^!?|FqBINX8E!|GKh0#ZJ!jjf$^j1NTE`%v31ME2H_oH77w zYQdn^i7GQjH*La`2<-{W4!RJs7q>aB3Sp%s@_8{}8Y5-~Pb2rNfUMr0b_?D0O@>`F zuyEn>`WU}?2ul*Xz5w~wP`uA%af+$`01~6;7$ws9=)zO;cH+J7@t8tXK|$AUSAPTl0GTmY z01443ka-+0#qB2fDcq(10LSH!`a>Yng-!r|p)R6I!%&SEA4dZGHTuH`wt2YJ?2@jko!hO)*;qp7wr9* zHV$zC8c*59ScFuajaMn8FdX#Mr7Ec7-C*Kk(7ogP~VN?K;|U~ z?>;d|muS5seVZdD%@8PAAk+KFSO!Ac8FMMZnS$|ZhWceM&OvNIPTMJ2F2My2(@Vb@ za0vnnE=Bb?CkdPiAtQX`mdSi+HN31RtV!$pF}FT~56SxCHVXRuvgC*558f}g&*6nv zE*or+CU>l4y&L+n=HNc`d!I}^_fZ7jbaf}jX-jMi!v2;a0VEqOO(gsGo&()8kh|xB zZPeE{0yH4efiuzzBk7E62AV`oMnZ-1NUqZ{^MgQTo9=whQ*2B}08XYk#wK`^qO1P7 z#&?t49N!+s-oZ>;V>GfTq|@U8B)FwL57!Y0H6!?(r$&us6FmJfL!BOGaCyjz58Ep$ zYgfeKj7sQsD&oKHEBVL&01l8_V$nQ6iS9Qa`&>j{tOcw(-;)e-Abn%b4L#2xR^&Qu zahDJD)lG9s^$rz*m@hA)+2bF8$@5I~$C3(5h=9mn3yb-3GzP8W`gk1FTl4B^Coq}RzpRUYX40mNG9J)FqAoZ$*dLv$N zQHE;1IM3_Gc+=&r!q1j`0mi`SJFjer;Ys56kcd(~Ik9Wd7O;YOUzM2)%=p;7DD}I| zK1bj8!9Q-yH1CfYr87qUu_2JBxBM9CaULPtAX7)NTg0>OSh){B_?A!pC`dl9jFfyF z2ao(%#_-P$+U<#NexIyl4^^L7<2N&07?_yran4JzI&Q+8a$jFLz>YtRfQIMe=O?8n zhcN3IV$5BhPOM`x28bAFi2clJ^3W1Z4yP0s7)%IziY>|HFoMMcLDbQ#i#=0$968Ai zW3JXK$C}2f;a7Xn*QO1n4B3r zM_!ma7o+y3YO7Q@>kyL5!=XAUKtDJZJ+Si9;f<2@aY?ehC}9MMwGhoj7s`?;ABBu% z9Z6gevFUJ2*rA!#5bM|19QJ9AgKkMfFs8vK{A37d*3#@j_QMFH9EhyGc6EvQLW4R{ zt&#i0q^D8@L2r%VMM!j$MoSy_#5Q}s8TX(+eD#%o^EHo2`WW7bcLU}>d}7QczOs-N4hcUKDdPKM8rKmQH&wH!R*1WW8Vm8USRRR%Ofen)bpd~Bl%te zpsG?J7+@h}4DK(SkvNh0U&c1kPUlCqMYs6Y0OTpR>CRXwv`i$)1L=WTML_+@oN_}d zUvNJ;PaQ=9P9t7n~0xXTC@J>jdW7 zZSN8LJ#w_`>~d~Bi}1r8>A?Gc$1CK&l7IM|oO7@kHQrHqbZtW=qwcE-=JQzg?#6va zhqfOjJ^tdulEs2VWNcD#!7ZltJ8@aZMGl5M&->0wMl^AgucxM5gr)mFxnp}oYt_K8 zOgy^!Vh7h)GF|;6w>z$upp^Co1PtSEN~>#`c1iA zkrB7}aD$d)@|KRab9mDI6JM>%rO?|+W63D8V` z4IaZ7kQ}+Yy)xnoAh*Z)U^zzAMD!K+mnu=6YbSv?h{SaO1-_P_Gm;4=reU{|vX#G8 z`sAX$VnC<5nZlx%ZVwG_Q*j6P=r>0gr~b%MS?RZ?penMX&+0->7u zcR@w_BKDv-=H0)3%zf{7%{zP`CgiVBSz<3l(wOVpOYPe#W z7_0~$**5dXrYKX20Y&q_d_wXt62_+zbfQHdG6%=GYZ-Xtr=}_lOOpYm^W_?O>bAwI6_J8YX zi@uc$KXJhllog{{NQ4K^Dz}^;OTN;ww%^_RLn?2(gY*~e$GCXYuyTqh8pVG*786uV9F0|*7H_S9T4@MW`b;(KgG}MA_j%D zws7lss93F*>-ujwuPA420uzGD8I^5FV0taUm=IsFhpZRxkm&jQ!akV~@jk@o)!@H;pSC*h z;)9h;NE}l^o~+uW`CJl0X(B%m`N>lDEQspItQY|&C0YKR=BN0nFXKD9aKA5)R}cfr zM6yXLJpmljTI-F@K_MPOP4_salDkvtWJ|&D#Ag!mCw!Ry0FjF8=VU=%JwOzTMURe<^R)qwk4Wc#lTWCM6exD1t=*@pFb8xv9Buk@fSFTLY-7_NXx^ zfTnp{1w8kOl-3ZBa}EICgbuP8#LVm`+H1xv!W7wNtIt>fq14~Ch{Mm^!dQj{lB3M7 zFbRe)mB32;@$0NTJD6;x9K+8&WP@`U^BgEt&T81J3g+O}0@!oKv3(Fv# zvLwx%qs`K;99$kN=f zTetCvKwq=;9=Xb}k_(0UtUM#J&5@8tKM(x4=5JWw`L;xRyIDUzvI^ydcvK5K6BapdCzb0=L}g7fhCgN zX5+?lz_fC`JNI&_5THlt8ONUq@PD~jz9B92WNYTG=GH1Qmf@cwVy8u^MGVl4WY*%= zeT}9E zB@K%n2z~Nk6`OeZVhyALVMm*OGm2qtR|i=DnhZ=AEV|#OCX%*XA|E*j`TkaT7k}E% zQ~T+NPQRYn6_SZH+s1c$QhxAUm*e=ugn9?>84lP`b_WFSOUDl4(R!x>dY(F(gC9*< zU0oOF5*^Vrx+Sj|85EkHBMk7?q{)!+3a}FaKBVKe(eOewXMnNVBuA;nNxKG$b@;|Y zHQLh*t_#2%FL4NbXW*kHSSEae1#d?X3z~_#`v7F#P|@Oo{Zo>I9l+p@8{NkdIuJ9* zjME|XBV_o+5HX@oTw@D*ODvnb;KMwY0Ps%(JVT0I9{0a~_kh4bDDWn@t@*`eJ4s5t z9eQLO5)@jQv(r1q$QI8R^6sK}m)!uP~HK{H#yBSoM^W`OOVY*3{qker|h!i(r~ zf4IO+@$3Gu^Fd!{BhqhHnM8CR^OScIem@`kCQ1JQhP^Y*@+=WO5A4WB0%RuI`TAKZ zAzIaIs7;y_@Q3N8lz&2Jp!$9spZGZPeg6QgUHoxIy|I1S&O6TTy?2o!XNxeNe~xi- zO=2m~h}!D~t~(G+BR#mthXDLh#@dkOU)88RcM4%``^OYhHXjmxmya!U9t9MSflv@ZEoxCo$f>9=> zHk0wU08O-)(X|?x#0AzCn?8(_-RMX!fxMw*2!_MK#@rnw9hrL$w&c23baPw7ZXqpV zv!fLltmO}t^!&Jo*o6Jr%_tI4cPeQy;~y6&onh+I%d9pt(C2v5y1wvUyg)`XN3L6O$l@xHxGlZmD}mjnZPp^B zpL9+W#{U51O*P;82j?qb6eCk3&O*%I38T=_g?aTbN4=muUyq!$EwYv9;|nT#hws}q z=r-57b&F@6D)l#wPnr#%Ye6Sb&Lj&BUvs+0;Ej>Qeev5yOV*%kC#HAtn!~U0Dt_)z zY7#A@Tgc%UCFz;ACs-Gjal(GgkuNmcC#D4lWK;l=1p8x%HVEplVYtv(jH>+QV~clh zO5#AB-r?%lb7uw%e((O)Ye*PAi1-G7Q=M!3*AMN&aWD6bObkO4%1mIyWhv0aTkXUT zAIHL}Sn@1A7k~nj%Xu&@g|Izzdgj6Ww7Ue!#fEn6EcM~xIBdYp#R-zw-ViPnW_#DVLN z8+eF44tk(HZ~J4b#q!}wE&^^@WmPdM-Ser!-IXM0?VOavN^+W?xBmcDP+rzm;Cjc7 zL|#Ru**sf&f8p1=o6`Cyb!Cu}2mm1wkk|`Jzo%Hx zta6RqI^ANbsx{-T5a_z=3K|+nk5>(`I1(%X@VNvKvsZ6T)^aSH(>;#1=AEZBd``EQ zoJ_o_`f&=(sEEX=l)+p?V{hn`1h^e<2wBLM;>p(XCoaG*E4V;dpGjvKxdrkn5F|~@$%G?pnx+<$0A(yvLjLTw zGF?g#o&Nw|{t*8FtjGOkKkUEs!xEyHuZ3C<_{BvrT_NUlb@4f5k1qcJ2lLZELmd!0 z`{i5mcjK48#w2w@82SVYA$6 zMoF6?ZAh7l^BE5LWi0i+BVpvdvPe=Ck0|MZQu>kRN7oHPhFB6=A9B!*vk$&PK)IZn zNMDx~&7A1+)kitS_eOjrpE#7e;)J}jf&lQ5vzaQj-XSWJ_y%}B$LG(v54o((p!68U zZZq>q{S>s`K4G_4cp^_6fkAEfz_IrEa)* z8C={ig(D%uTa0|V%vf;;%EZFckV`tAe0dz@fc&t!d|(Lj+x_d4pKzhRNinRB-ipK_ zMvc5=SWV-nastNLOGpr~cVe1n8^sVI@vL}7wCN7UFL`1zAr-(;`ZB3RR1KBQ_Tv1U z!1FMA*kLG*xGpv^>5x+7ZHwd1PFCSzcv6fb6H{7R+o<)*IX}xHPqgDoq0vap&Z8_W zFj?ybJ2FxV$~g)?ddS3xSs+nUIT@2=(vdqdBU49WT9+Eoi3kHTRg;iU>4xXo!Qw{} z0zpJXf7c`{Zu|W)pp5U$&*LTAgrh!-F-{^6W&)B`LT>4ajFIt@{{Z6Q{_+0+k$_Gz zC*(h*_e8&A{D zvxdXoJ?D+%iiE|HKVG+jvP1%e!tD{Pa);~*#KKvl?*w{e${XoV!<>i-%2k))>wID> zoHs9H)&gN*a&g4?-h7$&!3j&jB*F}N3BLu0-I8RFCFZt>^5f$Kg#{HrjEahf~xVd^iTy!Nz zG3l8JUHjt5T+_(Bg^#mlN4m;%q-V_Yk%K_JwYT?WB=m?u4^%l-c4n@wsyEIl{UjzFb-Vj1z9BT@N};O z1bBZL3kWO%WHr@hg$NMubaIl1H3*F#sySp8mzh9VeK3exP538Y7@d7YW8^w=3?C%q zlGJAQFj--0(pvf@RvokX{e?uBaHxlHGN82(A zQ5SpydB9zzxoZ=4#g(*{4ZRt-Cn!poi!rO#NZHHbmq*YHN55HVGiHxmX|n+_4aG7s zLbl|A+5y*`{ul9{BAFRB40n~Op9k#VkVOTi;`x0tO!Iwa?=Rc1ZhGZYYzT)@%LZts z!z?<~elFvc_LF(G{VpEe%ZR3Y#DKYD`aU`z96EBXUgpLLzFv)yn`%NGv~M_C`DJBxTa z-cTf!nEwEWAxWfX`AzYUVSxH32c|MxP3~Qp2h>eT0LGCCse3#++mir`ZRoo4mmo~* z5*E$j;{;VY8k;!vGn4d6It54$+xt~#9XpWwIC>+C6385mcOO^vTtX2jSsh)VWsyz9 z)=6(!&Z+={110o_2RaBMQd~};6h_4$MEcHsDBL>`c*78=l#7bm_{5P2Nb#lRSt08g zDQQQ;!I07hr$CUNF|$MBmCn?kiPmwq+j_KP-Pp8$eluveSp2al&WI3=ynb+638b)S zF!s((y#vt51nR!}{^tod;I+rTKN{&btY}9a!$U^xHqYs?%P?@W{9ny@%Q2I{GmBm! zg^>~?eCYb#2iPG&%Wip9;irh$_b1(nAt1_A<>R0ODRV88{F;$OU{0{Laq6Zh6S9dv zneB~#gTG(HgxT`vvb8=V7nDLlwu_UF3hqCmon%8X1fjV)NiOm~zk;sP4d)4*hR(Hgz572DE!#ikY-W)2I2bWX{{-&7F$V7KUg;Bnv@qkRPAZT3*k09NnD zvOnm4vOnm4vLEh#vV5*uPjDQE2>^5U`on>fSi{>OgT!DGLx4tIAG~1({QYvk1ywd` zG-72c(Rs0Ym=s$UkdcJKrwGa#6J%mhZ1gxxrJ?~fJ7AhZ2Kpu}x~9;f z(Xy{#q3tt_{{Uz(_YaBYJNtU$MTbK{{N4aEA?LX~n=neZzkto2xz%|6RCpiR#z3$# zq}yLGdtuHUDG3%j5#%sV^BZgyi<8Um1 z=uN;otSJg-T;EO*bO6$2Uf{#uN^3M3@Xb0gav+pCZDaAagEQ_+5Mt32JhN$l<; zjBWi`jk5v`r1Onqb~wQZjh(&mEJb#&lwxg&g)1DBSAZvDgz#+i}wfPP;)jvtrb1V_QxW<4c`~qKeWdltuh5*QMzph9$)?Pyz zN_xo#Hp+C^U<|cJ=Yi5u4TOBhGE1FU!JlU9m*8m*sEppsPOE@!CNyDL~@QdqYU|)^Ym}<`N-+1_UkWd z4Hzi-*qr$=^(kO4XXN-|<^AJ4bQvbT2eaXj1Ryl6Df+K$gpS3@CF1#Fo^p>b@MUVL zzd^hT@skk=Nf@6}kNhb9&m)c>BX!!&xycqzuF@UADPmFvAT3Ap;I-WsZ>YA4ThUDZvQ8qj_FPosE+)4>a+Tib)n*f3~reBVOMU z;SgocrytWUJckt8;yIBogbAg%#7M(fmw-~tj$z-JKc`{OhZU_tKHnDvGkAY_h z*u{24rCnf1CAw96Ubf@Fw4nT$>u#}tXYM^OTX5PDEP(6-^~!DA>-))Fu)rhf7?1dV z@$C?2SS-TZuf8BdA;?TEKDCg_IYv$_>x@$DFy)R;+#^N!B0{{zpIqiVmY$&o8lQX%hzk=iCbcNnr>7gcGDPfDOgeX>HIxlGo9{{UDu zQ8hmkD?N{Vqv@B#dmrfg^OgSqxyy7S5uz+U?2Ghsvk3Rk?tXEGlj43bLq+5msVgK< zxamFqZzYP2LJ$(jPAfftzCb49p8o(D8O-SeV3#Ez3@lnLuGhbPm{0NP#=Ju9zlAm!fdVOB9xn*tFvi_)C-f>kDC zU2WD(bJunguXBPa4GkvJ&$*iDwEPKnjUF;o6u7icUTYF?1L7Fg>lnB>JTJx`$8Wkm zGl+7tE+w5~MOCQfe$17o4X~D7!Fj0;3hPdAm(vWP>=}4|n{bd;ieuvSw4K1G7chP5{GJjF*#3B&GB$-j%@wBT$m7QL@CN$V3B7DhToP#@Lb)`OQvANfm)trZI`7Y`P3TCPtVm;iyN(InGx=hJo*_np#4cpn`g= zgfA{jR24Zm!-#XnB>+MSWH2e|QjSuuc%=6I@k}4UK4&|@`x?o>NlI;S0?Ho^{{VrO z;(a&C^T-5$$5bq=NnYkq=#;^2$S)0ZlS(??0ZPK=V*u1m z2SQY16H`+C3`n*M5W)RSq3O==-@iCEK0}5eaCrgG>&`I2Ct+mR#OB-r-k}lifi17S z)*%Lnxk@7aYbe70ST?C{a1=dPSIaP{_ewu<{c)(Nk1}mMAy$JTwF44~DLRx!#e$e| zjh|2+R$f)eavbnKOcNpUzSzMAZE^9#2)9HUX+ZhST1Z4JB33%a11ly$5K95xBDQ0J z?27|Rl(vevx$6mD`hsV?kPx~YSTsW&@FKVj8k3)lD%wMaw|N-beP-XnxWI~&XOpZ( zn8Ho0B=fk|MU7-luv^uUvA6_oE9Jb73JtArA?eO{329h|Xvf{X`mdPcSW=-=xr12x11J(gFS`pwX z;c%OoJ)QX*#b(6hiv=tWBiUjugi9-3-k3+1q7Z@vRb{S>5uOM6g?iCnN`%s)%LI%} z%t9wCU#dqGxv$`ieF*>^`?!?Su(*nN!8pkbrV{(~bK@O*Btl@}SfkJsle6CS(& z0I|tAS!Ibu>{rGbWV=$+=7V`4Sl&P5WJm>&3KT=S+ZaY)8f`JJbF4uKz?DcLp* zU4;T*Anv0y9g4@K^vOLb?qB5IN}(c4FAvjr5J|#*!PZa!RAyeV_d3Z4=(rB4>5y39 zLFTRvxUi#Q^?%Ud2@b+u)2-zxvAj*fW3A#!GJ{huUb&2Ok{6=&$F?J%)??(yso=Q5 z7wR*Q>OW{Oz=D+mCuY=o;zELL^=LhDf(W2bhfjQ>NK~64e6sBW#6oO*1oElCOs|x=!9YO5fWMF_a1Qn1m zfh6t5C8#1paFHyfyq7N*{n?2c+g_W;_}5{M2KF40_MGwrw{wjr30c|>I1#JwSlip>*Jslq zPOEbw`07`f$p%D#0D>fSk^~$ELPT0ABG`7JsVGB4FW&+lCM^5lKlod29obFK?Wzi7f2}l(Ul1TlT63&2==62^G zMS@TH>y$+FRo9?PxeVoZxDo8U)V#6kgmi*+7wtX40CQ`2|?Z6kz8RfGlod0{AXs1@C9343f0Ay;qJd@|BQ7p(31* zh=+|1u%x8XmC@ULWC1~yV%6i@Ed*@Cawi3k3CME%xW%@D4&bK@hLV~I7k#jLh7k12 z^3Jl{*L%u}!Bms@`sBdlgpq4sI70wJ$;;v1I3|L5Ptv}emmC7h+0)F-Ms_z#SoT1D zUans3{{VA}J}q*50uWVg)3%Nv7f^YVS5P~>^I(Or*s7!I3WA@IZH zZB<+|jRxD=eqR_|>dWbsKR@W%S>zty?sfZf`@+A3{LXTHEvhc^)cTzaP6$qJna>q+l{yUH+8kCtx}`4P;pNbOiK+?VEJonz0S# zyy*3gPU07<7|911HesQfiB&ILuxy-ZcCqQaqn-#*ggK>Q0OJ)C1p2tikh8egaE(u# zRGJk|iFyA3ahpsLvIl2b#O>!GnwKN{$<&5rMFm$7E`qv1kRG>}PUs=f2&~gXrcrTZ zw!Se;JhxO}N%qFkI0bWh=fvf()QJQK9aa#C8IHn~$LPhF@XX}xW79HV76r+qg+tdl zN)kj(Mk#<~Jle?g)&yDI+{Dr5@Ih7EaPb`dutLIFYWdCUnq47+z()r1)4|T(akX`I z>rCJvkd6HMGB(@d51P%1xNq&Rwr()oAw#*uA+Z_oCF7i0DN}I|q05makiaq~?6=D~ z52z}-6Xzsp62P=j*Fg7ymI)9N>CcCpxh@Y;9P&xo$uitG)Jb~EMjhM&knbm zRw<&~J$tj%5qzYT*4%>Z8uTG&sMKYk1Q!5-rcG-YL9cno$5>P{u;J-C-bIw6*j#OO zw*e7~si&BAy2wC;1X)Ir?Yx+V`IO{iln`OAhm}mYkc62Y!pB?0;!?6U!}7o!k+&h? z*6>eq6ojTtt~ZV#U9W#b-yh}vaIG~&fea)zP7~-y=UEi;1~{+rI3`+KCj;Ve1SBdG z8`0KrFc5AV5zJ!E?t2kpC-0o7$%~EQiXC}Lu+8(2kn<5s-Bu?b0U;ml!SJgxTJeXtba zMM6c3s)k-pFmT10raBACv8-bXGd;s8w8)+oQ*`%vD1=fHr)Cf59}5tw#2AN{Ij=yr zI8aBi!-50`fICM|ECgcR2@$dv)c2ccNe%1<^J3ZpsDtOuv4>!|c7B){keTC3_l7gD z8rC ztZyR-Q`HFsoOEFX(SICed0|y%r;G?;vLWz$;~A2T?jvO9tVUKILw}}88f=fgY$p&> zMX&KVDK*il(7v5z!U4?`95{>C2!s`A1b2Dyh>9XeQ4u@lD=JuxtEg7vj&fskkuFDO zHy#8fv1j>!9q;?!RxWTeUO+(idhlfDEJ(#krlTP$=nQ>vXh{J=I}OgTscRE-D?lH- zS&0RLHORL(feD@sOu;hmrvey7Zc+Q4Y`{7Y$%dmMj&%X zTXU9M9huo4xd1X5qoPlh<;M13@Egh{Ihct$`?9J@UFG%eVlo?fh{=Y~F=!+sC)`M5 zcqAM;IO{Et2<__+bF3I9#ous_xyXS6Ga~;0B+g1DNj*TCd1E26LmNq^DUueXEBgqa z`++p2O5aj-yqPlv#$Lm%=Ou+_=-qRKv}9O3gUVQg*Bqk0x3F>OKaO!9#fLNowcFbn z`kG%8lnsfkOL%5;(Sd_$2zp`5UIs#E!lz6ruN!I^nA|1$xB*l!NxfR z(vD-ShM`d#DI#h!b(PHOK^*+!2taZONx*(GN;T*RXZ^@&dou`-%AZVIOox_RhT*S# zWfgPzmn0eKa6f#EWa=`5uu-DQwwrIH0|AHE2F#K!7)Hsl0!qzWl3 z*CAt9MU6UA6K4(_E$Sx;SO_X3*n@dnH zgDD9jwpjDiyh4*8l~$yNAwpTFpbyR?j2E6AflMLUb|stPF(VU=Jhsz=iC{wha^Y5_Zio*|lAFl|Y5xE+KcxM#AGsszSc#|rR1q_51m<;QQ*T$UdM{Tk=i zcU5PCI8~*^AQ2}U`gM^c3VX-+8*;dV28c4RhTM>*7Uf&Vt>qll5WrcLUbvGK2|Z zUw5MVILpL~7YzyFe^vxk871B#w~-^vYYmm4 z=s4g;u<$i#G?PXRG(Wy+B6-k(MOb|^mIYF_`Q5HMz*fd+%q%;CX_Is*n5fcHVvCcu@jfHflE#3OZtxU+-p_rRs6Xm2j@ zf>o}yC?&N{@^!WLfH{kg7^%_;AQwS#BNGgW;;yko+)7J4;wvGOh?ZE2N2hq=S%4Xf z!*ctxm|FxipFlI4L~Y!YrNPbP5Yhl3mjm^PGEhfs^MUM@YlRH%w~8&j4t+n~*#cHy z>1K+Agefw7l4jr688VwbBjnAc5W-$o3FirG1|VunGT19D6XJb5V#U77r7EkC1(ecp z?T-VZ_3c*4A_3qj>5C)?!+Z_kiQ1|Qi{2?80oTq-V(OgM?W+Tat{kr^300}%*Cp7+ z0#7nxV@-Nw$PFWCoyp&>9HNBESecMK;ccQDkOy61%k^Oobj=7h9mg3s?L|IvUO`9w zW9nGXRPQR++A9ds9mIxK+5tY`pRP2Mq|F&j*BxV*Cuatu!#HA%M27rK>m;;jdvAPl z(^1r2mmm|Q=e%{QAl`zg$UNx&%Ecf701(K53YY$51o6~ZeYwXXX0aj{l=;A0cP7c= zycj!=r13Zkk#Bnc01hiKu+$q-XHE=*1Z!vxv--I4eFiZwT6<3M5Q`M5K=sVImQ zQ{Hv~b97?zA~{yA7VT*MN!c&45Th=g99VuQ#K88Wt=s}E2 zuNXNKHqiWw7j0hIYMBd4W)|3088bO2l|M)rrXw`5JO`9b;MxK1_*(0DPc$=8tf!>-_``H4Dll4mF1j)I z&m7!wKABU)G(Jf)^skH(O}rucv-EIE(IMrj6YuQF&bVh(H0>kT84)aNX~GzMm@!Wn zg0Wr*pSu`9gy<8BqIU4sDX^BeddY|$bAGkuaAF4wdW^Va7a}6WoG4{7E;l3@>FtLo zf)oR29pP0VL52H$W_uP;d+cFjVg8_ z2K_M9=C(zxE#xdBV(ps#Cn9LAbVx)V)qqg3JPCo_;sq%0LQLoTSZ^c@E-_tr?DC2n&2C&5hNcKC7?vdoClF=K8vn2=vFa>F{1Kw*ZkVYh63_Ozw zH=WMWHLfAC0fQ>^PE0>#nVE3&<6jv8+7e@U4=r!wcnwVmc$T3& zV9_N{Vm6Ni=L8&(0?#T;6ViWx`ehkER=VHo6r>U)EwZp7B}yR~7>sQI_WA}mu}w-& zipus+hHkfr2eC?PuMA0r1h+=hEa@{mXrA1*rUqx;rNGoPla1FHY9$)&G6pJ&SviMX z%Y_)jNpnEWL)Ur22OD=+7{LXswi|oRH$Xb-iaBN?QA%a()*f}BV~Mr-=L-V@!9!@? z4Pz>}40v2=X{bi$<0c*c5s@VGxs9=jXlRQmI^IX_61EUg#P28s2J8Zo*D)Tr6}E|; zaIQRI>|q=x>}%g4G9q9#%sifQ!*Q)14R}QxlHOe;WtCP?)cD|{axQNgNEE+Z(aJQ4 zi2}GW01k-KE7zt$;?YoC$nSYq8zN~Ou`)u>HL(NeWQdEY!F3$ugf)%H$|eHYATs2n zWV|1Kd%lhw1R?STo2)`Hw`#Z{8^)mOJu78~ILiel%CH-cIj~qHh@+oeup~d(H9TZT zz=x&gn;cimpKOdC+A#7Mh$JSMS@UiM+6I2YM|rUw@s6@VWf40sA|UaW%qs?}DqK;N zMzgj6Em0DWCS%0w0+qn5ixQaiY2zFb$t0>UVe}?U)5xYm1d?tPU<$?8&dog$jW5qF z5mMXW$dOXy37DY-(+Hv&nUots38@!}ca0HDu*{woTf8MrIGL2;Z((T55!sQDk%HWx zqZspnn*2kjGcmj!;UEg!C@J5J91OiCfNgWuMW7&;=zDqkjc3?T( zutha4XW@d+`I8Q!py}6>Bw>}5NJ?X|iSx!T0jMmZGxwFOu=5s!eioD*UL4xN!46jE zmEi>|LIXam{Y+M{QPX~&mmcQ_$rl2a5J3VN)>nLE?SwB0eD5?xtXdl;>p`On3T?jv zFL)RwFs-TMI4ehqC3A=gB5kd(#h!4`>{dAnGl@}KvGN8al%qWDOTtV8wB{)16IBE) z$_mwSk(K7Po(X|Ia4toLXP{S;!;#*RDS3R7b(0HVlGS}iaj#qxHz0ll;bB`!4fM&U zh{_s~fGAHT-ADYuWXj}%B`~FB74^xTcG;q(f+S!0k#RtJK`l>@n94|yqyqJFJ>UXr zSTc>C4if;~j|3AcJZ~Ola0H|*N9AFXFoF~2V)gPe1Z z5Fk~IlTqgq7uaK|<2j%bUS9Dp*vj#Vpn9VH-%OU^gi4_Rlg=;xnRHPU#UUmsg4owO zn4Bz8q%?;XVQdr^68jk|;FV%;S)rqkNsJ;y>VZ$9xW*F(2W%j`b%?|c%UnD%qnSb% zXL%yG6!Q2x*!fOGK@F;mL?ZR>E`gXVrK=Oh`b!8o>i5MV8cq;|Gws zA(d73$cY4!g@X;=c!M-m1p2Y4K5ob$K6iw;GGwku4t?V`K8%p;H+Z25uFTvJa}&-a zLdlKZb*rpfPt1C_UczGQ*GFJa85puG0Tc+7H-x438Xq|-rhnsVbq#RqI^!Hn+5rGJ z>91UXg2I`k){p$aNM`}ncm{obGNXITk)WI&JaLuCG7^J>OaYT|j0wz4dDh6o-1U-r zp+>~@g;b$30w9N+el@3lI@`__(0PyUh*ih3a(w3#fLfX9Xx2agTC!A$j6wlJw2S@? zxpneiLF;Tr1c99#jy-L`lTJqa)r;))>4|B!WSzuCM#v<4{`XNCJ`4Cb0m;jDmutA?w6EC2pc8S40a-}W&^2+9ks)xAnIs#w_`;zm;qjJ(T%S1^ z3g{I|mW}1Yq!K9ew4=X_o{mN(b~^IlXxa?zgO1w5R40KkU?*Abmwi0p zlQ{+~>ciuk#t5`1!N&tNu{?RVjBws5D~C#$nC>wMcN)RMFvyhQQHhqpun97vzJ0Ls{z!+ zb&TaTU;^!57l1VpKv0EE4CPSg>bWW@Mi+ceO!6lAgKjJ2!BLYSf`g7tz}Z=YztyIOxUgnW>QRgo>Fc ztg)fSSR@^3+5!6DKvq}lFz?$72SUcKX0ZZRv+Azp!4nqHcjoYR%<4aP9aKn3p6z9~ zfNo>d`e6fUBqVSf!n_qcEa2t!%N41hSt(w8SR(wv+5 zD}2eXIV9eZ5)kBQb=eh{S=0BD$W8S}x%LrJ&`!R0GWb=uC6QRSqCRQff^W;j27p zU=d}Fgz=^crU?Mu~ni%{_!Vli-V0B@})*GYiB4i&|IhsVY z871MgAj@*es}B=i=UD(HYJJ}wbF5XBm{=Ahc}o$IXlZ00Ql>I=AGvg&wjq04MsV`I z@skps>ONQyBQp~|w93~I3lju6iHw8bRDM<9>&65_L@c5v8d|UcK@L@2I!xAf5;7Fb zEJXb$Aks=iAKrZ47d(k4=aZ%P=Q!BgdK|RV-U$;+Nk-Mtg9=7fq89IX-3_eOF7Zfb z9w%L}bz$AP=sZ?Spu)Jfsk}&w26&4sey1-|9ZNDioE0JwF|Z~HdFvKfWs@{^MhZZm z-WVLAAYkLcKby#so7GjZ`w@W40#`bgJtqp$qOvlWcms;aQ&6}NK39Y*HU>;a{o@GW zqPs4E7~JKroBZd|n4QD?qK4aKc&L8Q3%#S%F{T$wh@Hr?EK$vvSmIdMf4 zbW7q?hM49jpIjNJGUTZ@imA#PywSwyr4TzujQ6)lNLa6l=Txgopc zZvnQ^9fPyHb{bmJZr?ZpuA(PtK-F`cumiYcf}UnvJep|QVNl%al5$^!xgOiXA-8Ef0-a)#W=`vs@w@>tl#o04bzcW=a$P6uXB{9>+5kMVq-pqq<;8nDC#P>gUV*YcSG=G*MJlsVakoN&xU^GQ>aszUrHHa3 zab_bWCh=HP7p6opw3Cb4)5GT(q9pQIT-smfk-&~E2Q;tK9I9v71n&)K_!FS7zf6{u z2sB%frW5Us5u~w@I{_ISno7i!EF1a4Dhgt_5hx@l*Ll8ZQfWv`Mk!dl+mHY|>j6rQ zAt_4F0rQe52#M>Ku8h-Mf)XnTMDc|!2q%P;iaEfY?lIv<*u3EkXsT$`36B`7Rot?c zf*!SnGU!BR!MS8s0SeA)5y>kzY~?wk#H6LVy6-n;i5|p#&EWYu1Z@Xq-Z8GqS?MI{ zdYBN4ie6XragC9!<**#9B^3<+j2g?MX9vGKbDcLP#Sb61Y7tB_u$e zv!!AProorj=P&5%$})#(GRPUZtlrg-xt8k)#v_7}B!YqL4@D@)UMb1(_hk{5j2)Wu zOe$p8lZ!aV=RzZgfyr4s+X1rUgfKzadUV_|hQdKjQ+!N*vwTxwR3I3`Q3W<>$>Th# zYKiyAWh!}E>6a@BK?}g8Vu(lr&6D(Fge!|%OL?hzDzY^{jJBKUtC+?70Pahp_rt_A zOiGZ^l7-0ABXB`6kz+#;5_on_v4m`fXFw0mTnSBu67J4$LhZat+*6HSG{VFiRAmig z;61-AXZkXzP%(6&r28KEWNc`_W{sR5Y;eR1xDzEJ`*n^v5lOTN`c@?JS}Vx9@c7BV zKw<{cCyijk*jZxc_{IiVEwG6ts1@Dh5|tH=hwl`SkSEHrn2=8;3>L(zShkU|!{bHwYE79-HF<(+e4vPI8%iy{H}!W0TTJ2#Wv%4gp$(kJ#QQ$7r&vS+~ue` zaxgqRrPf~AR^c;Xq-c*3fi&O7)0Ost)ed&BnTT9M=S@4lQ|xeF;K-OUBpU>sV2NM= zO0d*^MskR|6hpLaopA)2)*)=REn1{j1PUgg>{8-@WFQQJ|r86 zUl^uP0DIfKRtJu&vW=@8>k!do9Y6_Bwmk@#SxJp#1W1y~8@ddpmqb&y3$&gcJYx)m zux?J4df@^Bmf-+`Ju&tR21R{@?+V1%=Kx_qp1;l^^yolxFbx`=3(BcUrruH{I5u!l%u>ODBQHUu9C|1kLt%J3TPUI+`AkSCFIKUR^762YOtVLv4)WFl$_ZXNkix9ym z9K`QAiSUvOr=$0f!Xgt%8KnOJYc7k=Q7DwZILimvIof?Pg~q1qHOmJca?J?R9^xue zV+^XQOCKkUaFV85Z4GsV7AmF}5bm-@lTus29d9hRdvp?4)q}>Fbiqf1%T)Gw-gBTV zcKz|U8e&Zqi3fYlYb1D#f&vEJ))I*=VytE>AhjZyJTFY7l=VhyuUzG!X%Rmw;}E7@ z?myz*DIr$DnJ1~d(fOpa5?8AP?xy=!o!+sm*fN=W4!4{MAzx#Uy9oqmB&m+N+mntc z+DFRe<295+CpxfM9ubK2^-sBiZ+;R8{N${KCy?qX_QqN&tsOGa9gu=&1>7BY(lf3< z7$|jZJh(Hjz}6FSY0YR7_^;C^XkMWk?r~Qz`Jj`7?l^Ohi2#yGj|Kt-6?l}fY|)UQ_L5waE3_$*ErZ_>t^;qA zPBOw_S74Tp&LYSL6~q}a2}Vfb{$O)j*)k()(fPotRLl3RAs`NR`o6C$<) zW&|#Vk?DHIMlC2nWp_VhG8~Ss5El(&2pB>DC~XK|EQDP$dBgy6*%papx3aGCdNRl< z#@~k&3Ijs6gMnC?7<7dXd{`h{Gh$&Y`&eY^Lu7=aoMbH1$^>1f4n(t%n=XKUaAa$s z6j|w=16=+LB^kG|G)!Pf=)QkgNJoOCx<)w#x`a?n%kh&5EEiigeeuD-a$pg(L}Vq} z2nx;w(2)eOwNQ+tW+QW=sBaXC3G}2l;`2!%;75dHiH6Z;H|(Ek#4?x&3kAYH7a{U5 zQ79mlDh>^hw|?o#@CY%4OIDt_k1wMa9ANhOB8eJ&ZzAGjeX>%ho@0zH!Bb97{xAt}qLH`Jj97E% zR1rDI0Ev`GUtC?z%7Co1i3C(tB=ZqIGn0zmh*~``Y|B5|vHt*(!b(C3Q4U-CK?JxWIW<_Dm7bTUT;V(C8IO(DUYSi?c$L>VCZPo-Cqdk9 zGmSA+?*Rw0K!Z%Qalvq*>94bHOsGNG_Won~vYm$jO;NQugCSOpgu!!HE^9CVWHKTQ zj{}{Wg&OOeBt)eP9NT!su!*HUldQ5yRJivZImVj6U{crzk8C4$MJyz}rtn4tstCE- zYr`lu4@a1 zYNVtW#zWS&9d-$lsV9jj3JNlNXBdN2Az))@zr0Bjci^Z@p7i|IFsKY%SVZ?Q{NorH zt{9ygo_WaF1J*{7jz^9;%j+X4B8Vuj99BviVXFB@hxvj@ILhjZJRaF0Z)Tkcjw`$s zLjposC|?;DjG;noP6ecZ+h*dNS^|_d4Z>)Q?p|LdBP>FlJ`pPPWGY6*jyh)!LJsHLC5=Z4@#HA8TAsk`j1~wASs>_su!;?a5z}G} za#A{i^&nrNfI{KfyJ>!70*{ zF_QoSO{09yRV}dmK;hl?A;*-EaG-K}9aj|^eX>Z1nHWu;CnSr9ZT3#@^IMaZUp*=0$4kzQS6bMV`RWD(9{i#R0&6DPt>V#8Z0Gm70d$cW+d z<-%qKITrA_=1J#z$TJiWlIKENc}|SJCh;MHmJ;LvltnnDQLrH;6P#yFFH&?Rx>T*; zG4~i0h)i9O-m$=W2zgocN$nY-*4T7OHctY^;T)5;F3j7Mo}oSF?y&$R-BsXRQC*e$ z%Grr6^SbowJgPzrLO}D#Yqu72*Dix3+>)m^;WSYN!^NQSj|R&R6ORSO^PZ2G`x)83MofZGVsGPx zgV0V~Y}0_+-Ut#V%Au0U_P|4Q6R@*9)kB_j2^L(C(S?9as&rGi>5QLN@}Y%cuCT!p zBATZH^*LZ35=#XAa1}42ymbZa5&qY|CZO^lNqhCign@E&W9iN)0zU%U>v&R$u-rkA zuNd5CK<=R&#Lf)r6i(tXF^ym&rXCPNs);y4#2h%RPs0*}N(xOolx|I?Y>*6nsv($0Y z@2)~32FdqY{)~yK4s%a1>msCGk@0%lktvrok^P&0SkFnSL7)w#F<4TRHqwxi&H_$p z!`ss*^JGgfrD_yj9EtO6Plg$$9u+i|K!>am2H_nEIg0$}MG&?ZZDY~r4TUI4lXv3) zB{IM@XP##zNHH_S^R{OH09gZywo=-hvxlAQKxv(MMhJIp*-wr4kywcL2f@*W zPnZLBzjMwUJJA$%4YtQ-7J@dHmU!zWQ)n7AJ23_7AOP>y%PRSkot}mufKG)kB}t5$ zQQA`35-xheR>>iRQ3VoF^Mi&LWdemy$(BuB27G+c5m?&*-fY7%DtRvgBZbml?YK77!&3mmwM7rUimo zk3oX*;C%9YGTRNJdmNXiOt{{UFzF)bP$%-Fezp#hoN~PQ)*iW84XhX~ zf?W(8}iJy_G#9wW^onw2*XiE-7R2A0SKZ3WOH3(A2F&NnLC0eO-1EC zaE;qmXAN*;B6}*mnMfkIZ=6o#CX`;`!XYCfCLcY#0wjjGXJdaNRfMSz&0etvMMM1=Ib&t?=EN>c$70nSbPT!YbpC`3Mj#A8PV zZ0S6gkicyrCBTa^A)|)u3pcG`OK~|+;|V05ykZ67h}cOshl|EeM+!(Q5|GlT9jC{b zR~g~s63Ee7%7f>HJvo=I=LwLt5mqGx+v(mQ1+u68aI{po7m)KDibP*rT*@BZgwwpU{&I@_$Fj!W1pwsqd}UK}ne_clOR@VqME0q1`3c! z6Dy)P$pfZxF+G_DQv_^1S9{_&EQM5Io>|Qepwe)ara!;V5{gn1kZX9R=9>~q%WqjES_IQJWZ8juodgj=Au!4u=sZf2vyh%>W7YV` z1#TtmLd9dHWlI`j*fdh8HD8=dLM^?+&JqnvxS6287~P)DJ9xw?Li3S?@aJwQZ6xLDq;y9FRyBvP*|qelUX_MroS zk{YBh5gTWth7g>fCogYRgeM^#*0jzA8qxztbL5RUDRZ)WWFSKv;_2mhO>ri)yZYqB z9wcu*qGlK2M3{u>H-LoPZhS`|6DwT_MUkL0}cu@G;J zh_QJu6eo<03JD2aDO9akO0Q^FJU2wG4P(=Yn1bto$%blP5*ag4M$Sx_t3?gQ4bgMJ zxkS)OHU`Tw;_wsfR@7o6cn=3(_{@NuVs*qX^8mT!_mMq*cn**eO~Es-K2Uz%JTOMAwrA@Grhg za_DIO(;$Rhk#0!q5LmSjmWN(4X+%*AIu$Y204j)EU@<;$K?}&1$-9JKrf>tA8{R)$ zofVlxyFQL`d||OY;k!$OUVY8po5Ca@C7i)?CIEsSiTZdTjsq;L`*(u24$Mc0b+;@c zV+9c>Bdi0)q)?Lh$y#Rl+`+svQoaIX>u<9RRJj!R9_JdGF@!+IY?VhzqL z_&*53a1qSC(LP2%T&~(skw5Mx?MI zoOrbqqYt5w`z}jxOF$;M!3ZsEA+dwk1(1`WF(w$Eb&xhQG#XYOFat)W$88?X3hmltb)s1b7zfneH*Sp_ z)9zLPib*sg_%JOg11nN2UpvJ*7`9x*O(by{VQLT|wxed;g_$Wt=97PeBSbK-%n5!l z1`}<{cNj+Z#&GjsVNn*x@rEP>+RzK@mauQEvPpJ2j6AT&luVWKr=6mIa{OKMW5M<>FauWj* z{NYW|x{Ee5xgR{x!5;A2lMp_sX>*sxPNsn_Oa-+pLoqhy@~E4Ywoq+w-K4@z2Nb0Y zwCjVA$%d{%qL8K&R9iJWA6z<>VQPi|!H^N1ig-O_&;SJz+adr9lh+}JRVi?xML9~| zEhE_Wv#KSb^9CK{N@GkB(4R*Y3{mEp1YimmZ){PD5F<^2fRWC<@pmkQAg;nKFEDdJ zIzSRKU^I#suQr610bJ<8$EN2DYTCi*yr>FH-9`k+qXAR~7wRzzAjU`}P}OmLV=ZE6 zuu?$ut}-4#1Q{v_u$I0Y4$+0>$Zb1qIc~9Umx%F5$!T*;X^@F59a@r99u=nVEwX6d zbq?n#1-F8#R`=>w85y=@3)qp=dKm0pBgAM#ta5f>m_YFxj(j8k05W(9Dq9#bCO{#& zG@xxkV4EP8`#Ui;WvH1o4?Dz!qF-YfFp{8;yk)x%hWD6`aWm?gNjegcB<7;WF;EvY z2mo9)lJhTrAJ*xl1TZzzCuO;^xp@2#C~*Q|K=~x=l68dAXO#HP14tCa3?xQ>Lz0H8BH@=%`eNlFP7cp|A&wH5lGwc%-89W=002)Bh)O8D47esQ zMpHS5UpPM52?>O*3XTfo$|cY!lJu}*1d(V%a%6Ri2xgdN#xYLNtG3npMhyTr5KCuH z;~5oz3^(Y{IR`+3V=AT3o!LZo9;Z%BE*@!=fg9%$T{{43S1Hg zNdv!}Ng|ry^eh=m35ZX*kM8h!0#ua`>&9>c(3U6Bmh!tp=I2D(qdHihXBMUPB`7NH z@d!pz3ZX2CuZi4cN4AXGNg`&yrT+j?r2u^c@l!-(`!1%4T9O>ALs&5ak`3UcY3iIc zfb#H^1HzN@yxig*Fs{cl*=~)JfTn3NVoh~Yb~Uw;5Nu7@QS*p);Q@BmQZDuBjAm~S zU>h$(A8auSL@K%g6JjR(^O9gvwiUD4E;Y_10A9vW zmv9^U;17r@DwFm2GngTU1@EZ$K3(%&YLbrw<&lRZJ6$@6|09?@mWTIeD`(!<|Bf%--FDIjf&|B3ScQA{o`wF$#WCIo*Kpw2Q`=_VbB@0E*urfIXesIS&Im1oyYM}8gapX5^xnC`jkDU2h;mHvf&rwd@0$cr zn*s#S*>o9Lr(OL6u5*z=F$o?%>=A^L4^gr1b&NMQ)X=mHf6Ua3*Ama4s}bim{{V!B ztaYCwXXxE+$blur?C^Dzi%!f(=xxKTG#yv#DCl~1Rze5-REzY6pEu`X3 z$Cf5yG|J*{agBhnA(T_f_vbmD4x@^i3I70bgazSeB8_n@KKWjhxyJ9&@MBmSm`qKG zFZvuxMJHSl8cFMt?3W-?c?NHfOm;=yLR2#t#i>S2E{mmei=5p!5vjn$6L zIgGOtZB)wKUqSDHF)bN{h1Z#-@dhCj_b{^iEBA#;NJN1%?B~Q80cIjbq)9j?I_m-q z4a>+FT(dZckrQE`A;s+#RRZXWcL!NC!ytE(Z*?4hzDqWZgGxDLFUPP3q@86*=Xaa$ zxT_cqi~Tq@rZGv;yAxy6A|8N)&~R%J8vxYb)W?;lVWp~bTK>L{@Q1rRJep$$vkek` zrN>3oYOjjO5kAARDfGb*C^2QrP`GDA5Gm7IPp(Y%(h-7GAda%&0udSw4O`9(dmN`p zc{E`#vt^Z?1E|GJ1VPv{>ycD@POpKXTBS%afT9o>iC8%Vt`{>RLvbLD3Q~t2xmtCL zX-q+@Q$_cHI9#hbXpTF2KA! znr1Z34i2&OBS9$;#pu<>LUK}!GGMfZkBIWY06T3tgd4gVK5<68p_zxc3uB4E9N~zAnhO{0^v*ssmH^$!KUyO4P55^~rkxb#y^Z8o+2|=Rk15 zg1l>F6ORq#>(^csZc&`=a_Ctj7nWB z$E=I3x#csv%JHsoMG}#rW$DJ2#*4J3z zv`v|GYpvvb!MA6xQ!X=c*CV$0+kiPp9iaGm!6p|~gba^KIiM13VngNAZVs9VSbd*d z;4YyuC|gHc$zNNP3$TZ(_P~}0gnWn5g_>{AAsB&FVZ;_GSd<5GP6jl-gabx|4|%#l zgm_n;{V=FXC54CD{&Fj)-McZ}@7gng&p?#txf?mC#Xyh4=toe0X}2H7ux@y9IO0}& zLhblW;t4%&4*Vy*W6b(FxQ`G0#&NakXzYUVoSrr?(avErG@{t^&!$Fm*4k`)$^0FV z%|S^LE_99jV0HsiZw9_2fsG=eDLc1Nwi;u=G{hHF60|rmGKAez3or=rykRc^0Z1A! zCyz$)RQ7bmZMlhvfX9}jc{kf6H6Y#t+zPTjikFpakf?|zd@f+}P7i!PU{fN{%W_x- zqmpm|7b_xywUM1x^AvL$>zFMvGxQJGSmizk1|JE(=)H!BvMh#w_HG-2Ou-VCE+l{? z5n7a5M+XpctYS78#uq@dA@hf51NjSrQOLYDHUZ$GfSAh1G43d>SOw2&(~TStkWLHE z#o}D3JZ9#xfI>cc+R;?+r0yl^|Zibs})uZ3&pNtq}QK@jmJsL8iT zF$D%@h+4-WCQ(tPlRk$&aT13lQ6hE=bxU31Y)}%1WIz&%R`|e1xp342<8$J1YJkXv z#6y9ps|;L&v9$c!^l?rhXp~V3N$oxJ&I%=n7RN$Z-lfxX1NcutF$k8@T6g%aU23K_y4M z4A{3d6b`8qM3kAM?~sHN0MUekCU6QQeswiOlSDX{938s$WD8dvK8ev^CFQn4~ZaHJ6@an?Yzp`BMb*4rPAW39wI)Kjx^XLL_}*VJ@hM=v!M<>SxZCPnHZI{D zq5l9AZVrerx79tjglZL0{K=@rti0hiYvXTOeMZxD0o$^mw|+Vp>*YpU1Z; zbfGMdM};1c(tQ=l)bE^8ENiU|sQAdzD~6m=C5mE1Sb*FCBgL=&uG(0LvoHZEa2FQXXvUukzsNW+& z^sp5qq_7eYlGwds0|*r}5L`E;!Dx81Ymg+!w57q2$qX!$4TGw)!BJZFuV8D>1OuV1 z5cgOx(WzeYXUj&}M1h@9t2!yG?%@DhtA$1=+0ZZ~w~e-47m}c+WLD~=cF5B~PjX8m zGe>8>0V@$vQVxzT%t|yTju(W8adMhEGd*FQEe3^R;x2JaK@`w;`^AK#b|NI7R#hrg zBgk^eB0$7))J0<=E_P|+++3tdrR*T45(_8mAY#Ju9|qw1Vh#a1q?GUNkV`-%DOyK6 z%T)0$jW}@;Hl>7aF@F3xm_SPv6UHu7cmwN7fLcJx8WWb}-x~N!yRS@tX<^S4cQ8vEr5FDIbL2a6C{nlj7=T$OCS24AZLLq6=v12~c2j|_q<}w?ZmK9BCnt%;Xk{Kg7fE@&1E>BFaz%oWewD}l;hE2jHL^JGB zCc&q8-K`{f=u7NGSs5+q5a}{>%rDuZuu6)_0_`9enb$+(6R0wqlFDoU07^l5P}Y-$ zJ5QG{+P^3V(ie&KG2jbJ(t3k)KN&Gq_{|HkTIOQpem(6T{{TQB0u1Z;%A$G1H7p>) z14&X)h>+Wf@tXY#G82!f3O16`;MA7$3u)H_5L3=2h2V~L#pefWEeWYfq|mJ>cAKLD za9YHrvyoyN05K=KCZ!l-Rd2pigZrl(6*B~>?XVH=9=62wi)28SbCtfo?mXo6(G0no zeLir7$8$~F+>fVQ$>UZ?C_%S#ckzUfLJi)(H+ZvASkO+F&HC>m*O|_r;bXIgGqEAB zONr5{P=I7|QqX2_q6;QO;%)7^Tg>ljnAcKG#?HiJFa9=C$TY)0sV z)Er5M;~DE9^Fq8{Kor}SL{($0;5Rbnz7t(ypg}voBjcQlLi;hzvDY{%FCi>@j~EMW zxntvXwK8}vBFFx`$!He zCWO)7dyibk3za)Xw~t=f$RLro-A=atvYjys7)l%+A9&4<;cOI$JG_AvJsxOqH%hza zRzMKE4D1s9uUvmn$RsRzE=8$HEJVfP<9QPyTh8cH#`p1vYiCJvTo+2ZO{{V4x?hIQAi1h2{4X>ub+fC!SUv?2F%p=&%@Mva6)2a(3J5*a@rPDOSV@UtB$$s}x3)nc2a1FT zbC4lZK4Zl6qCT;NXn{QkE9%WvTb^@=ctQ}+L97n8Ahr@7BpBgI$O4rxpP$YWbnSwn%aA|>;f0~@1}YJ? zJCORExiUbqE}e_k@-w5N#d$aQ+{&xROA`;v{J% zBMe0)D%%r0`N;5zv@O)ZAYIYG_fVohEayG& zgg~OOf;kgplxvCMj6z&cHWcbzHXYA-!J;8aB`vg<$F6CB*g^=lxw7LdW06YiEiqK0BpHLtIvpL%pmwdYB%oli(?a=>ZiGsY4k=zmbz?H$wW}p z8^o*uKpEIVQ*FOEg{s)gUooT|&g%ny`3TVtS;h@-|TSJ@`;=S>j6$uhd_6L4?oJdho zXxU*->T_1iCX6Wu60~=^!VGM~1Y(mGRbM7IAP`WiF5ymIs@Q2}`Fpo7d1;wx>@x z=t4Ufu#1W3C2=@1EKKzO060o6Nv8lpfXGDW*SP&K5OP->Eh-r@iI#+Cfpv;*WJ%!+ z9+?9WGqvAlZf^cb+ecXtfzh~Zc=gO?k?SnjoW%f`*77at0;`2a+y^;Nc@cO$I?Dtk z_a1|-xS*xZ$HeQMWT+V&1MD@tmL$EA{#HO?k<|DdZNML6nQq@4;O}nHwYSQ!QI_}q zQ=BQJJ(d1l@tcWkS?}TQV;Qh6UcuK}b&?3Pe%I*dDXbJBdk&{I=QLB|b+;nX1gQ0* z^*woFTV&8d=T39%_}>E+XOEV`;C-5?KSAj=h4NC&qY46Odap10#U*viPX7Qn3v$|H zE&B86%;O0fz%Q1t_xZ^qyo@6)F%t3Xk5o^On~p!nARo6SXAvY(VUY%jixeqVx>(5- ziRc7Uf!sya{0Uejua=UG2V2$U2!nA2=uk+JgJBfxM8#|fW~aBt0!$kOQwdW=6Z}*D zQ~?K{2}s<+SWmeRZ}u<^I5nt3OFpbvnhs}qZf!tTiL!E$8u!E^?rVIyC378B4Kyi< zhDq4seQ<{;=B5-H$Rlld;tu>dBFW%I8!yDqNtArf2AUJ{%aRJsxHwnS1{Eo}cI0QZ z3`;Eo0BE3lx*j@4546ubP=FRR7NWsN4E%AxPjzJ=HRkHc=1p~xHCa>v$R&?Z=LG>; zf@80fc@R$_W==JMVnrGr*|97OWV?f>rcLxviIY)?xgECVSrOOPp|JB6n6f~q*YiGaxsK!i^+g`xs?edJ&%prl%bL?S2J@l5EYW^OMj zSwIOVyx#;pU@`?j8;E|H5h)ZivQSdDiti?D!rB|yyFMe4sqm0SK7f{KQ2b?y8>=T4 zMVV&n59o?kZl}5_EJ=k!XU-B36xf&w$(S~T+bC$BJnLV^O2!CN0P%&TtL~~#)RA#-jggr z8eM^slydR&&BK0$gJKc6gsw`#5dca8iEUW)-%yebpvjwH^**}A$gv<5J5x*AqWPgJ zC^G`5WvXnM=5e`|vBkh5l@U|tg95=SF<_KywD^um7!-GDO}(0%eB^k@jT0y`wN2n5 zQX)({@ZpOy#GA=aPTc7zdqy>HsQFT4N#dg8=(7VodNM8ya=Zx=t& zkXV2)NJ4LLyY$TxCBYOvMJEL1I0i!ueOto#M=9!_E*gD$oe>Z*RZ3&Oz7wKq4hJn@ zoZc;O1c@pJ&pDNt28C8qJ6vJ*jxJ(AmmIZ_aT63eeKKG>59d}E1Qtv?$*!|T+VFPU z)7u3cv~ln{-cojL1-m?Cf>L}PU#jqIFsoCEeL zXX_&!fND!cNZv*)ni13r7Tr4JB&`%sf;Sib<-d~PhN=GmPI<;kfie}Wn5aJa6k}1A zg9AKO9=)z0ipuE}=`pXFt(9veTJvtTvvMsk zv(P?z0trl}j<~TTDuAFtAG{|Kv{_vO9pG6cGZsH0FwP_|HXK6m%2+-4!hO#Z-U307 zoFO1kdLdy+TC)`JaBPZ4MOUx3GD)mG95zxLy*0AuAW(-F z!b4Y!RtzZ>1;tunHnkRtGp2%r8z6}Ke(~Mf3PR#-Hp|bZRDmSD!+DVquS+n}t|gRB zFm?%Sl+Yerk(3b_=LCaHjSR$rFrwF!S9pn>HS9-GBMP7yAg-Cv>1&hmfrwAM9Vf<3 zT}lF4QhwM`6PyLrt6bx;0KF&Y3DBMXa97mTUGE+ik>SrDOe-rx)SpahULNTM0#$>N zj6`om3pAWOtDKY@K@e+NmyJ9|K;vSEHqp%EUcunW9YZkIOo`9{9V7IzpEZz?*NP}o zN&t+UWvNu1yF(dJ+r_tMFo@g)N`d_3!Fr^G;XTXWIASb^ zOz@#}gloYVa+|U;)k(=sHNAC&y=@TCl+R7+izVqG0Ru-+jHdD~j!xP#lYG4uiz1fL z$09|b5;kNuE49$gT;!T(j3{2Zk8*ehuZby10?7+V+e9x`5ev>uF3}DR9AT1N#FBgj zsS-H%!hq#)W+b+^8h4u!4+KbF;#o-c$Z8Q%aZm?UHcjnvHdjLBcI0I*~@|5YvUkwsB$>s$MLzHfX0= z;2$m^ETD9fz+)nxF)yyemX7amo4pw{XNpL|HgAlE9t7ke4rp8Z!731@h~T5qoA|&% zC6LS@J#xGcB1q_+(}#QgX3UUT(s6ZoNh_b&@*Ieh2nZDV6nal(?6Z%`pL8E+hIO`T=fg~VF%=CO=Q5qJM zqX@bYo~yb(H(cWitR+}o!>zch5>y_|Wb2%LP24`X>v(WqGjB-i5;pEtKL$jTLdyRD ziMJGqA#*<;`e2mf5EhKwRQqDBU~Q8FmVQeQQRIC*50pD{ImIT=zhyoq>}U+*n*oN_MJ@Lzto?2}V^ z0pa~PQI@nVO75d4EL*&SeF0%pAPtkGd)RS!24Z4$RMq=1#E^lglzmO%DAcqGUr+Z4 zl!FX|v`z*?JRf)vs`b2xodRGDa4^hC1pp$Ua;x!^bXHZ`{55j$X5u2CtjC%1f$KB8 z74}91kydae(z`LnSZ^j6RDvb0*6(*x5X3S|Vxu8Hl4t~pU7=-LSc(EG6BKKj_^GU) zqvT97l;8s0c)(|hl<6c!2{KPcIeC4nD2C#Sqj|7(aApLYcLouV36{cUL?>x@Mi6I8 zy4xKH!xoTC#D_wCCOK+qHbBnGkCAPXwJIQ7=JV$0G#6E|cypT&ShZ6AO2pBejY)h<@4QQRjo`%?e z^S5d6$bPFMfW=MD2~!&aIO{4{OG_82PNv3ijhZBo^SLpC@u$UJP7=rl3oFZ);*4gds)bMxCSt2 z0bLtnSz+jaOpy>|&`p;Wh($ysl4ZHRFdmdc*^xUA{0_2vpa>x$sjbb!;~7XbPZ(-N z#8qF!(5P)fh(N%ewsDt~W?7eFC?tBj$$?=Kc2zavTJSZ1_f$)fwO!Ib7%Y;?8VEhy zpR6tu#E&E{jymyK4Z8eN5tFwvarDYKY(?$1kmrr#23scLUFedc{c?e{q>NZesf9Fm zhs-xFnI$E@C(?Y8KsZ&@geBi`gD)*ON3FYQG$S4OYKM)*0k4b~Dq2w5RfM#i5;xiO zW8l4E^u;YUQgRtc$+YDl#MxXhgil1zO83qsk)Wm!tHZC>aLGc*>7+4iRN9ylFJhPd z&K(etBf%4X`^NHSAQdW_vGU>_cn4749wRl_hW-)~!HZB|(C+rW7;5{(q+=4};K^8K zD3!iD4MVA>Kmw&Q^CPZsAtOfPpNCt6w3X#VKr-xMHs3p1&`L^V=c$6OpT;vm+ zhmqiQ&Ph_~^1h9@BnC)P(wOUYl1iZ&42ZUsId+ns6a5n|5_Y1!x4FZJb~1fG*@Ai~ zHQ9*kZcKqnDU(rk@!wfQKvo>gKA0~3kN3sB>pawesEpQK{$Zp=7JNER%i61^}J;s@}Sz`f-B<*nOca_>C(E^IDwf92$6?yrGB!; z6+oD*x`*+XX|iloi}I|#;v%!=hGmg~Q-q;9eB{>?f^Z3vaZ&|LgnYjSL6HbI>nJa5 zNM>yk5?pA_0Kbh+VoA2Lqzf4*iC@UPSy1DW%7KJStb~f72$6OrXWIz^ zQUoatv&N^>AYL>PWyoN}&sR|A5&2UM8c)VSGKj)Z#FEyrDz2<_x8oN=SSja#!viEr zFgqesL&gTr^)snG5fLePmQ)GoN=mWG5;o${!b!q*Jd@AoC2hkC*3x+1HDp2{6U%RT z2f^vdD=Qpx-cu5_UH? zd*mNB>zIGk^N?9~uC8g|r_qt$v%hrmkwM=>Sg_7Z~z&JT@JDXXOSqS zd~Y5CHbQ~e>v%FZAnAXbonx0M>5@a+ZV@0H1A1urWK-QJ(Y%ZyqALklIXhcvK-Ys9 z*F6cY`|Xwzy37)D$Q;3GuEPp=q1b%h))bL)Ur92{lYMb0267!pghU2oG3WYdhD_c1f= zf`>^>#%^XzZU%9{-Ls_F_MR~-9Qh9AV z7t@0di75{AU-P^dvWc6>jyrwEQ|y9Xmsmpcbfn-e)E-YRNF!V-loDhH zW``{SlF6j`Lh1TJ;`IZH4oaGiq>$t{63~c3b!N^)o0+(2voLNOo|_Ur!$K*vfv%XB z1z9OXxN*#TVj{aDD9u|cKW?GAh_Fi#aNsG~90)MbfF=%(-^m_dr6fp3g(@}UB^ono zG9tbOvVE~$0SLV;N6*u|R28^GN6|7(866=SIIKMriE}kLbxDHAB2b*_{N&J3nh+~U z>3~U)iEK<8)WRlMBt{+J&PFz!;a)y^i0cAMF3zE1xa|>m2=@VUCV?z@Z zo49Te(ctll3BS0;rbrUW;->|K0SKm3BEtfM5s|zrbwUCFF=P@lFpznA_AjT5oMN|* zbX4+VNGmze#EK-Fx5>+sf&xm~Mk^G7;k-m7rt2~T2pw_8F=;hOUPB7)Ik44^B#5Ls zD~|P+d3cwtR4DMTc#f>o1L}!v zR2YW^7Qlox$#4g3T$DR-h(#dkt(ZCQAqLw3dq9N0$UFh1gl||}W7_ErtFSl-VlEHOvDbYTi8 zbzGjfy#D|LIRk;(c*P@-_aZ_^FCO`L(a#2kiTBHg6iPuVp{N9yLPy1fxvZoHCnSWC zyYdc%p3()m3 z*6}C{W&IP}=S6DGKHsi!;2!AcpBu#2gQ8*Pb%2T@QU};?mOo|gcjuQ!tb5qE2QLC= zz{sJy%$!2^Y>Q`ZqT03Y;xb)gM66fE?s0}~OfqFIC1{3t#mZ{OBBmtt$G-JHk;h`e z3$VIp&iXZxfMmLag7o-Ik&7l!;1a@KP8D9r>JE?NF0e(w+ae>6PBA9Po=I{J1M!fK zi11-LgmdYJc5(;-Q2uPcpJafbe0=!8Eyhr4UiY`#CAz*%(mChm@lmd8z^^`ia@8;a zGU*A%x{=m2S8R_^0i&hs;&C)}Q;qx=s+iOa@)n>3%cuRozWr1N0%J>L668*T3-S_sy9DM{bu)PSo^4KnkcZ0F%MTrUWpt5me19bPQ&o z2*k4uiPk_O%1b(->wdW~VQ2KjEaET`^r^fxa!6*xp*dIG}+boGE zRx)EDKs0ENR~W7Lq?zvM${bR%fNUFdF3;>xn0lrYH6)y)xBN>e^eX4Mh21$qqABPBE)1an zsMz)=XGFFSgLmE_s!2Vm0EiZMI-E2_6@gGm+<4nJc!ehsCP6%}~=CDRv|rGHjWDscr?o{X_00S|JzihlAWj0eQ#IE{G4w4$2Zv(QcLG@S$;cne&`DfF*eQYw zhJaCg11|~BRGJH{p6%_PKv~$~uhSBQ6eYI*08_RG2tE*m@2sViS!K)8Ya)X>D833| z@R}?k1@#$S{{U}XGSOc_;mq*o2=iBx5+6-Q@H;c+3I6~njr`{;4lo~Bn2qGgjOGSJ zb`SFvbuw3>Zf2{VGLI>5%9n(P@snzLN?N|=@BU&|luErtnP&e0=3A$jAzX9T{9!aP zRzL}#guDXMO~A+ys7IN~Y$CH{NPgMcSsFG2Rv)~tV3-!N4<1kZP?kWeNQmRB$i^PC zA`IdMBFY&}rkchLK9%&tFX5mCBa@q4N0|F1WsONfukCONcSl$a_i7`6FOthS#(f z2)OROIG1S%=#hfNeF(`0oD66glGdT#2&REg@*Kd_5xhy(C=?GKApF)C24S~%xH1EY zAq_4BAx|ET12hh(nh<<}(RdLV8Ur$FaBC0~nV74nmAi7bO8OvvZJ z&Y(JB!HdEpeF{PV1B?gK%tauCD!JmBFv_P)poB1Ygi3+(IVKGeLgd~Db&!tG-If8Ux z3ZkTnL(Ho@jB$s!^pmO10?zA+*@i!DyN!yy%JoxigtQA48N%nXjZ$6kZ1 zrw-*Fo{WMLqSF}`4Ld`*@r`>0TD5R|5O5O&=tClJ0ijIX zZ158XMuHzW#s__)KWqXfGF+&$W9aq?$TplHU}OVhH*=>E1Q3XMPg2En>hW^S0il@& ze0LpVof>OM*u5v3;~afo2+<2}7=A|!Lm)~JPn}2O0J5-=I%eV-=CU3&(Bp6V$d>w# zAl7VZ=3`rYh8HG9D(`ORBpQSr63j=2T_A)a7A*75F7%~sbiqsHO_3zHtQ%iR=}qL~ zKn4jc3s!{dg9e#^i7r79*Erxasj*N7qoiPhGSVb^r{13X$oS>RhzDr3Jysx)q=t#P zj(<3@+@RBAvL7a}oYl+@$f_cv-wyMD69Eu%D5;4t(E!$^1eWH0`PSprk|G13mBU3A z5kt1%MBXEbVD1c^ymOE0xy@6|PJRJT7@3i@b%KEd2^+zzn+8iHOif`_ zv4%~c9w1_fL}P9Yo~Hw50eD+DZomyNGjxknTqU}P&$7#rU7KG;Fj82t2yXyzjJfVzA zH(9F`6&RkTF)P0>ew%n4el$A-$u^_%1`DK~jPmpI?TYc0Qd5tivOHyJ%srP4#@y0? z@k2|Dc~BO_e*=n=-{B>@xMcB{)2oL$Y?N61kjf^>7rrB1Zz3+g2iIVG#jkjEw*d$s zy+m<;h7juVS$NyLI zt@<^DojslY>_9FQ4oK|F*QO%MOaVWaLih86pz2NKZo@W!e2Gd3GS z*oqh<3V2W!wJ5~$k*Le`;K4vk$hn)*&DS z%_SO>(BLXhCTv)g6h;P!o`Y1Re9l27vh&+*fz#!}9u&$OS|DH_cxEtSdm;kh6Utx0 zZbd*U5K#@tkEg6+{{RwDo<%*~k?)WR87YGDBDRVD0J(ZWRfH#!wtex?5)euzAa>tf zdNznAX5@k8svnF86%n8eNASewOL!g7QnZl?AajiGB#z?u*M*H)T-u#E00YXY7 zzPA||xYf@1F9E^~)J4**22rlDg7EYR>v!xEpfqb1WGtYySKyJAlOc;Obbkgy(5Pr# z26*Z6?lWZ2Y(ry>&i??&wg>?4n)1JYTqIJR~tcNQZv3dAc)L6(R~wetgpMNoyy4E=G_Y>CR8a4w(x7KwPXn7VZDI{2l&aMLbG z4#nf&(>$oMaaG`8$X$}Dj7NlNyop~KnV@Y^H8YlFMQ)SGalA1lu|4t6Sd5b;g2WL9 zc5tMa8R7I42#FODr!1d1>_qW@uTtSHJaQ0h-*G@6;U&I25 zmN7**>v-HINJu@=);uJQ0@a-U*PjF$BCo zGFt`@s0i=0Ya|hbZElmWhp2mENxLqCK)Yf@^NNpg^v9mpX7>X;-USr^00x5z!Uy_S z>nv+F2{MQzRKIk|O+Zpoa5?^*=n$HhZu!*3PEb1nLpi%IymN%=(h^RNUUd2Fv=EwP z*|mJFFbPLsrV$$SF&&WpFFj8sKXpg@c2GD!`a ze2D8Ap&m^-u{fI6IrIQEJ*?5JCdm@)O6io%M{Z|m`eaw=gP3+VYj~w<#b9X&0(E}5 zHD>6QlL8G;Zx}@-Nz*Vaa}(AH6&orbW@)_DpGm@uN?skNS;!t}G8HpUTVI@vyTcMF zDnu9OoPrtKf`sHlCDJHlOi?N9jWePyoH+;rMtHTocmW?-wGHO3?# z2~bNx5i%bbglbtCGupOv!DVu;X3?dDMO@3q$Hc!>5Vxv-=Ig%A8ZJmL>Q*1 zyWbvoz#bX}S(h!W?SLsuYzS=%FDH+An&Bj2PI9kv#!mLaTOvS!Wfkk*Q7K#`bb663 zo@QHp!iD7!We~s{nTo5m35k(mjn?pxMcmmUl@C~kJbUHF;wJjvIVss;e9N37J0(Cq z4zf-{GJudN6E5hEpN0th6Rd;{2u~o&-ii6hvrYy0;+(M zT+#CcoMfo)z9lMqxyQagY99DgP!fdjieFcZr)pMgLYdG7UevxSIi%QN|%vPWF?ErhM|;{~WB zgqET7IL66AJO>^kFpM9!KV~^L@_=;l$J()d!c5sH*cH22GXUC1{{T}h&shWs60N?n zqj_P)Guxf^Zy^&lSw5yF)AXzvYX*Wf-j;6tayBAbg*d(6&LhG@a5KC)Kb_{h^wGp( z1-JRYHX~C2!~~AnFGZyEL`bGY;<4HJI^~E5r6drhL!)^l5Kyq=Ji@r|Iz=Uo;21{K zaS&HuGR)ydBxQ9CVhCZ`#w%?U(oIF>$Ag=2+nVP{?O1L*I^JL{>K@v}^ho`qW3#j6>EiqITop54EmPJzg z)7J3C?J2v2AgfHYae~TR*~1SWm4M1CCW(|LCIUO}2+6dT-AOvAI{M?N6XntH{{VaEBUXma?bslmK5{|@0Sgi_PuCjIDl?%m%DA%t z6qHiCTg%oa@=8S@8qrZ%n)q;;EYbMH5)(oaMpEgst})5BvKP0Snp(qS9fgf7(f)bC zo8Xg%yN*fqgDf;c^&Pk{L26C}#~2O;VEl>v;eJ=A;23c}aJ%8ME-vws4uplmCvdZ% zjjsVtXjV1aJNgkyUAw$a(vg87m~6RZ!ND|&Zm$5+LPIG6FR=iQQvD{3hb1Cw99>fz zxWZ~1Nwn$hM+oMiD4dWfI)?xoNiapFmx#$ZC`Vy|HqAub-yWGHPI>|KVYvW7O~{Tk z0_iNt2C}?@kcpB;PZ<^hN_W(;mJ>0MNdS&A7C*2V&Cd=M5~ZlV0Sxah(#<1*5{tWl z_P`h00ADBme;N72N6qex2V`OzfPybN^^h_m$BPQM%R~eL0{P-7TG3_;`eY~~t^^7B zy7tKgg~CJD4on+3K@>>`qnN}|HQ*bg(NCwoC^%S_4kgYY8>IG6?7&G!Bs{6~$)5mj8zL*Ll65yDFcWZHqc3+XBJ-mr z#7C0=j&U9m_u%mu5^L-0hc+EfXi-^5gtKW5gkDV15A3)IH5 zLEDel#rKmW8UeA%j_A%)@*iwSB>_n(2$p?u`WysVSnu#VF*)Lqx*)~PPai=9dY{fo zOy^UE!M;`BIk^>9OYV1s`-p_uM|?H$f!l3$gnS{uuBBflX^3zExX*b61_B*dD5Oow zV-dLzFc3_A^vIS#10HcRUyLTtbNhwhI&hP*u%ZGD`1pzoFC4Zc# zvk@B^IBOv}GEY)as}-A^PZ3b*B)-`wob;##w7VQe7D19i#$bHo!FI)q z-Kj?5#3dMOt1WDpA(vH(6*L6PX;LnV_QX6{ey#vg7%ZViw3&pN{M<<06-JBmzYZvr&LKTLkGP>yyq&SV%+7Gu@t5>k4@y z^UQf9Y{3~944j&Xi6l$}SOG-B4+G%hOXtox2IYsiI~c8YVlZtsTk;vIaz*d5)&_So7DR4mEiWN7 z!t}Ufj0i$WK|YDZ3Ic{+7QS`o6~1z;H`NhN#Z2`06 zp%J`ga{=dzX-ya~oXR3C7);CIx&k~Q)TQ7`;*yVph#e`!<3xyoO#)m4wEk)6NS;tS z#_%jq0Bj~^BCvx35W*#$cXf`z8#^41N)ZdD!;*5u2mqfi7^GzN^5AjPBx_TJ6H4zW z>TYVAMdW}?%SQy>RJD`@z5-*Vxj$ijdC9p`QQOMz#z4T*5>NhL@&Ei+^ojPxhH-cG7c5W5p<%r@EaQ^_<&Li4MuDRueE!X}?7!or{R#owE4x zgi})h(&;S2>8w5+#%N+2^67&i!v@I=gP( zgB6qR9$8$2+Oe?MnyNNJm}+Ow6NTle$TdP@7LSvs7g})Q1ZIY-X6%eNzEpv0GnX1^ zz_g~K=Ha-+&hxMp&;ls|-*ZjmD5VwRrndYB*a{#4k`iEYjV9LLLX z+i;kr$WP~qC6m|3S!>KyVgP91;bQCr4$zz{+utpaGcC~+Si6jw3IY%#nIA(P*cD^6 z200v^7%W8Xs=;iL6KNEGn8aFb;5{&oAvK=K?xQQXN}s~#Z+8LfJ4kYSKawwg&bZd|wRmMTHAS+E=B9AJjb;^3CTMr-$g1gH^@uqCXp13D;Sf_xv0 z9B35;o4?E3CdSxJ6u~Z;+8TL`m=NWK%FuC@G8nP|@`49fX9Av)I73mDTFZU3A zKtqf(*G{B7uuQ*@2->g2C2#2mf5%{SU}xrNV${(#Ch-`hpFI<-VsB~eFkR&!?YZV% z&P!t2j{IU9F31uX+V8=FYfeGl@hNKZ(r>Esh+qha0+^bQ{BIRrUkOX14y7A@m_}#P zUPO3uQ}07UN34~FHB=BKVY^bX|I-jKc&K(k*7H|aKOWGT^xnw7Q7-7ip$G;emGLqCt z2#Qvfl|ZhcBp{kzbJ7{OeYOm5UUdHeWaT~x;uoDjl&Zod%LRl2(6I11VSRw=<97DO zjI!QQ?)hX(8a8s#W3Av&9);1r7;aqV)5FKhHE$ltBc537Fq?oXXC%gY#kha}03sR4 z&c<6CeiQcLN>ds?A#WKdPEe4TL&%L|e$(=?{O5Rk#!6&^O1lNP`k}9whB0FhDJc~5 zmeA$6Z0fLZL4YRFC$^WHJ+o_IVj)TC=@A2oUE> z36U8D)-`bk!=ub09z8dML&FpSGg@5N9Ys1( zN)uk}csU5W5=#fHYc$Ze*qiSL%mET&WIPUh-XslCK9}o|uP7YFeVCO1 zUlGq)0Lnl+p8|dG)D_SOJbYdZm_tpxcXZma?FqxSW6MX(_Ov#bJXt6S!JP;krNv)B zI1q(;_i+L?X{l??(tKnoMGzZ=!;8Lp^u@Y%k|X3rpJ>R#Su`ZLwDh&=aU_?R$6%tv zkj9F|YqecZ#7|#LZ4q2ZGA*5v#9}8H$s{&Yky^kcq>w!|&s#Y;K2uZnw-hQ@qcMlqUbC(t`mqdN>aLPFBxEJ8Tgb=s~F&4Q4%Oma0rMuT~ z(Lk<|KxASijvX*aJXV3X4~iUpSe+-Va7rnU8NB30kOd8r;FOx<3V}$H7>{DE9Qx$_ zl8(ewk&%>|^H{8ul`4qN`x90$&J3zL$xMPXTr-m)2x5wdYh@)HVs0|cL4yfZ(zJzp znoLEVi*3)5k8&t33`mGlHwF<@5kRvl0!@#$MI)v=tiw;c=g^WqXn`WspDtUeAqtCs z-HBl~$^?cbHC{BbDVbn6A0S1C9M{aD%aRh^YP%k7wD%KlwbvY0D=Yjn7 zhh{mIVY+g`5(cIR!dUT-7zBlZjdd zsns=;HFz&;G4lN3;~tD130-UJh6*G2B?0KR(DcIW%$H|zs(c((X16Q9apbHAA;`3e zxP-@udJK7Z4L&fINN_uKJZ~k7A{Zn@jK=wSJ4`02 zA6(>_3n&wA?8Z1k&nqnAaBH1J=NfrJEt`L4{5hk|2_S<|zGG2$2|gkOJ6< zr8EM!f^V;v6^;*N3O@lUp>;UxP`ZL2*ivtt9E4C&D?ze3940hM1xWhefvnL88z4u^ z*)O&V)Z}jt1BT!fvNG7<|V}-0Sd1oLJUZa$KW{#N+mv6xZXmD^2jX^#KjA;n9{7cW>7|t+4``#7KI06 zS)f3GD4#G`_w^oQEY|Jfc`$<*aZem700FVci8GMOyr9K_(zN41xeV#c!y8uL*uGBxa{NpFcH-ILRZXn7ms? z!4F0oYa@WF@H;)Z`+V)YsgQ zNIH>5KLdKQcR5u(cc6h6whwhW#Oh#y0+Ufs0$Yqvr1se-9|HZ^$v{a&O9F?4gila7 zQ+GlLf@cYZ<{QWnLm<(1s)l3M7*twMXUX_h$P+?N0Vy5!(lC>WFFT?DH=~GYF}bDq z5OtHyM?l0L>?2hn^)J-tB1qF_t5O*hy;xrcDMCeslpzk?PF0=0cv!MYkE4qTJ(X;e zLJ1i%Zb4)y8;g!2b8XP>tY69b<_Yl0^oXK)m)}?d_K8sKqpnk#>moBI~X$f4TcDUHsHJvfuLVo_`sE@Nl?65yd4Axb5LQ_PB)Vr2ZkqD zVn&d$5gk!S2ieJ01*?=kj`B2<6;?G(u@1fP+2nM8gZ;))HATlHqK@YgKOl$Bu_M@} z{TCqH=Xaq1vAV@bj{g9)PJ`rdU2L6y#k?dHJn8da7_VDH5-FfvRTF`1BJ#9-a(lKd zP{qoB8Q=;NE)!UnnBa2o>jMFXX}6d4VuvU4c)rhAO~8@(1ou8Ozq5W#wk|@ZsaOO$ zBItbLpf#>fZM#k>T+t?2u7HySv#Ni$r^i6mT2VQ40MqS z_f?9Lpiae0wpuI36|4g%4I(Z{zA=d^q|am{_})Ve#yU6+ZTjS>B|(ItMyTOJ7*Ny+ z6n$9d7q#3Gz_;&+rP3(qqB=voD28q)L?Y0L#6UqTQ~?C1!gA#-3!&78WQ_97Hq$>m`L?N)&25YbD!!rot6IIR5}J+(1Al%8lZ)7MeLP+XPA!S0W?BAowap zYC~QH@Xj;}#3_z6Mjd(IX;>YY&b#qocb7hSzI)5*|r34 z4HzhiNk`7HB*B-mE%d_NEtv|AZ`S}@o<^3qag(7$Mecbo$9PO6E%HQY#BoaBq>;wc zSId|qtw)K=<=;!dK?;*#O7svqmR->R(gTEQYYD~aF8n5HlvQDH!Q|3L@?v02v?q8( z!lRwIYlP-7cRL+XPEZ=>#9$I`I{IQT)d5+efSE6Gt>n5<%v({h&@9IopzEk96d?6A zUYK@(4xS7T2ew(JHCb;*-%(SOD7QH&Yt8UV5&}A#3TQiJefMJEs+J)t&`}n5Q-NX^ zdYv4>njVmtrA3{E^_7H4Nq8bstWEcMOZ`*fsL{TlVA9NsG>3-VZuf^kLQ3R-KL*If zmY@c`wz1_&+lGrK>KG-v?Y(n&WD2|+5Tq!wIa?zofqX=RwKt}KTY+rSu?VA>)bQoQ z1U3O!Q-I_{=R1vpi6E=v&alL@1s}w>Qtnv>B6zZ^h>2#;I&X1>h6+~Pf-ro+ zNLE!Q3o5V^btV)e(<@&tFd4xJll8P)3EJ$F? zQFtY!vB53pw!Y#E_-sxg+x(h%RDe{MC?=FnZ{o%L&04!kkabtkf(iap3DoKP*_r@Gb@ybtE z^5T=o69HqS5k@%09VFQ%SxTE;k&;6PG*m-fZwcyP@js!wlxe`I1P@bHfE9=PZO%>z z97^ZSGr}?b%^w#7o~^Oh$GaE@IF&TZ_F)FOAU`3?C<7ZwfZJ|3#-P?na*k3q<4E+N zngQTN>U`&^k>L2=Hk}TiZSuts0Dz;Y;3jdBX-1C0AQ(;dI0XbrK!~tjNF0+-A*jq& zft$myAqh1136v|*i71NDD(R!19o9NW<`JF}kv}}re^X1OOn#Zm(-y8q@J6oZEyAYxc$@q@&P)_3#X$KL(c7d0MUyLn#B$tEO@@W7kK2netg3R<{{Wc!%d&@| zG8E)WPPcZolLfMBBu3>Od8a-iELenCkQiu?(m5Km*>MraoaTT~+e=*pHH)FN3p?~5 zVaRhBX_(BjA!sm58CG!1HEWBY11ya10t{s-o4F?Y)(Epg))6aI6N>dvB5*p9680ty zgb28ao0qlSw&R_aC*+m+Ruv5jdOC=&oLk#OHnAqHoDHuC?t_FzDA6Sl^Pgk{UhN+lWuFud!}t|}I!sHIJc-qRVe)lJDkB!wkDGnhE$s6btW z1M3)x>>?1OKpQaj>Tz-O#8dhcVG^?WCl=U_YQ>?O$DK$v#+Iav(i}xUGK2<#<$I20 zh^#HVqw?Vi^r<-=I>D423%8-j0beM8V*dbK{{X)I;dDNkLxy?_EO|LPYa8Cj2^_77 zs(W11_QJ&qIZ{E2Zf0=7e1ef~o@K-&IDnU98cx>&^r2rAvBEas9;6lzb2^UM9vaVr zDN!8ch=GG3lMHGjNs+p&;J0{{Ku_}~KPhgDJKt;IbKO4n_c@Lp=IU_*jg+aG&BN6*jyX*c;rGudo zLEG08=O+UpW-C-6cNEIYmSmlqAFHGbr`7{YD^+1A&}F?>0oB;omHDltrI*FhCO zEOnj)2dit-))hkxA%h-H`Cy?v^{n|?a?iru`HCQdArDL^prONC9v+yr$JL)7&JLij z3xFoQqaau|c3TKj)EXPJ46~4lNC;<(IitK+wV3e# z0Ha1B0Mv{GyXnvVeHaMvcI`hVEGmTa0aF{qOsddD*uPAIz*+{up8lC@N)4jAMsW&2 zZSFAyAA+&0vOwCUwRtjIrPR1r=l)}Y`U^zMZIDa^DuyJ)I`J5kvr~};S&WhZNQjMN zkP@_7N|c?x-rQOdBrt@sbIkt$xQPW#$jJwX>U?C;#1K%_BM(UW-a-OO!*JOp)zxDJ z?BdcCIShwX=CtI$S5uJkWtwKY1`IRN3PtHFH`Ecs+Uqrh5*5Eh_scyJ@62en4lqc%2@lvZV2!e&PM(z<82DCvi^J@og~R0HP=M&*pyl?x+JmN;+`&!+j|Zt&jg z4sn47{xm~oW+wusg4reW2|GHTFxt?7Oax^VU$c1{#IS}Oh2{0aEHxqL+?)Zvw&wo; zdG}Jx+b&Kp)KME6@r*eQ!6@K%O}OhKk>K0R>v*;^0^|N2<$25aIR7)-LOlM zlF4u~B<%&Bu<0hw!N*x5BV91v({auQ)3PmU6E7QMCK{2nGde?uE{OKej002v>;n&$ zEHXt1a=VHbtkFD#9(S%0m1s1)s=vb=z-AJGA~yqOy|O2Mcq}JWJ{;5Se@6?|W7_Qy zjsaRcn3GM)8?h+hgqeEdy}?Z@>fm*h9@5DlW$ETJD7Mn{ROwIolTS)2$FsuvFu{QE zPgPS%pZSPYOCA$OlRru04CWuwj5<#IO~x!xRFT#bKF6G(Hl0$-d8AK1anPVB*&yAg zTjqJlBKQiDWeAsEGGeCu5@lhvd*cpPG?tEW0o})0t zCLQ>cYApLC0eN`v&9GGpL9%=otnh#m5JFJP-Qa-82%Q8xDx&}b_9fCFkx#QDQx3!u zK!Ewls?-piAdgS8B<)La=8CGF&M6age}sbf}iFXeo3;zRyZjJ5xIwjXWXJKa>P+vkl?gQk`0DxR{4h=f@uiE zSx#~yg_H|`k}-Vg?70)u99-QaqTt*lkUok=Rtd;!4p56S4F;ty39^X}(B|;rFGOw- z2rUeskQ`^5v~k`BGW_hdvA%LzeV_>(!H^_HhK(A&L6C8O03vgq!wwd*=|~Lqf*x4a^|n-VriYcO`V{k%{Nw5}=|*Fv5@B z#9lIlrl?l2HmULvk=i7RAs0y1!X4i5m>7gr1*-+w5xH%=wT1zSlxI%Sg051yHA;oj zSVvf>3v7^v(L4M90N`N2jl-?E4fU7R4{!qOMtOL|*~DvN*t9NXe%Ux?+eCpODRVRS z#j=D*#T21)Gl`Vy}F zHA8@z_c4?tv5=~ap-U^%0|^Wh1iVZ_I(WoBLe(27Z%Ova5z}wv%KEy-#d*S5Jm0f9 z$8pMlZE1DT#DE$YjhD_I?OZKM2ifbA;7+tRBcXAIiQMrBmsXr;3W#L8*j`buMZgWF zOnqYG<+fsp6+wOuoET#L#yH~bb4enB56qEARf#yTq+J9UqV!~WL#E^O9HrY$9}FG{ z_`}bDZ1;mlfp@$%npRWo7!Q?s!$Qm>qmx`ROq(U+!Cdpi3gtmZa&OAw4FVG!RW-jR zUd15~p^HLNnIUBMI$ez3qc1Nsw_H-OjSPwS;9i8}31t<5w@)A?Fv1y!g2m+cCV;3X z4bFLtk|MT)cn`UTm5#ph%;OK?%Pa@7Bv7>SqIHw+_RlZ29&U0=`iE`DkokJzs3?9x zA(Ab%0bO6dOu(SQfwFy!m?nU0b}KQQ2{vin#8wrJAt>f`IMfs{T)w{8g%|~zjTJqz zUN}ccl|%mk3{1CF3h2EV3fzk{5hUX4>xfc`0zpoHt?`j@p(T^mp4;=rRj&F@h$=P4 zYLjFQU|?gJ+z3s4a~<1@+%U9_z8&DxGZAlgZ1cizB1$aFOUcO{r$y}4VQubOwnEr1 zA!3rPNoMgZ2n3TIZS!{@RQ=aQfu9r0S-_EeeB5({Bd|nVf|5;(OqZt9xNjyTs7gas z%mqwun8?5#1oO<|Q&Il_R1C1<2q@L%ktM3xGgVsajdw&MEmN`K+Ko)&yxb#k7wRMA z$%G@h5GuYVzAGk8jJ!X=uN>ZJ!#>nhdyUj!P6i=E6R?5N)um>XNF+p>kplX8#jTj2 zlW}w*x3af66kVh(LzqsZbmEkRpF5C>j@Xx!oUl|VMYfoFHA}Y>)Qr^9TA4_{4k^Pg zG9%ES+`2c#PDxb|?9|>3pHCwgvktp+p1=3DGGn)q5ORwq51a|W)lx~KcWiOU7Nzl( zHYc2dC_>MntxwBYx(PeRA+l@N3jvKHbSlZJ=L&QJma?;9IFTxd-oOj5_+TP#@5e%B zKjDywDN`=vd*h6c3AKt#jq~Y?4Gl9Pxh#0rPaG*j&suFULe3g8>Olk2biZ78jsj#A zK5!@)B1zUj>x6a2L^$9U0UY?Y9{el2`5rr?z^6+&o|AvET@pO#++T^@quC$a79B2Mr#? zeF=hxn1lQijdQRt-M4+R0$Nsm6MV6`JpmR8n+wHZR<)r093;3p$*9FhyEV}r>4RFv z&N+x&L*d>)G?!Nr+7fK%4+NNyfB;Oxilo{yCu=cZt}+$?kSB(vF~8fAhn)W7NVnmD zSJDCzLo732!%0)9OHj-o9@%9dn)*uP;o~9YnT;?dj$C-ifY9&-QeX0NYBeIl)px6$85S~;D<$s%JPff5I~$I*iGd0U zW;!DPX+W00m#N4|Edd!zq^pF3fN8)+woNyS5N2{j1Ad;c2#JXVS`N==B|=c-1B;ZyBnwD_TpokL*X%DtC9Hx(~hu0hIfuK)7^}$q=lBRjY;t@5L?rp%V zHZD@lkmUM6GC*Ye=FMYW)QMmlh?7pLOx(#mQ>8dK2C$bjmMCrH%BOVWV2M7s zzLEjEW_=~-V@@h4lWNNYZN@Src-&S&KDyJ8IxwYO72=2K6xX9c7L*}syYr6^LrF?l zelnXYXLb4zVKN#lB;__qA5T^?0Flzhghh5=ZB7)7#A-qzSR!#|ppR%KeLiuYVA`WY z8Jguk$Ws=aCM8Jfa%4$>+)-PH)trl}a7%S36q{=rQg|^oMp6z9*PH?+LI8FkEYX%` za$ppiQc*nzqBrr%q^U7S1gCIbMD!dS&P{DwB z(^#w(Pz9lM1o>cu1FzOwe;j2C1ZB$=#+X|MOp&=3Zb&01ZG~X!=KV12mZ#>4dF2id z0uHLeTuH9SNm&JL9tM0loSU9eO}0#M%Z(vU!gGwRKoxHX4>@%H4Y*%nHN)+?=K%_^ zv_;=W+@Ugk#rmfsYAPh-Lue(e;A947Fmi$z5p7|L3QHU9l|kjHB~PaK#DHrHJt*9G z#A0kf6TrZ;EP*9(*iNXzD_+=b=SHR#^Vq^Ctfn+8hiB~L4jy8?gWZM@#R6FU?pWfZ zjjS`+`DE5pp8{v{6j`fNRZgU#GD0*NHAxz<3#hqrCsHyPA~a2oa!v#g0H&5y*EtMm zA;Hd$w8V(Iw<;TJ{J1Nm=?i!!bwljLV96y$g`46Ctnc)O0ff%XdU%XPBBMa*22_>( z@oN$t7846F^Mp8FBz@*>&rf_)xfwDr8D~;B08D};$!*`RXrXOtU}kxb22-lavtv3d zA!Vq)Ts1n{W z0wAb>BSZbpG-ZiL3CtT^&N31j01w$CMp&;b6T~1V!y#69U|#UoOt^w@GxYIR6Nh9% zNU`W6yi$;XUC&pe{sr zcDUvBNmtkp-t+tW#%kaD>59vyS5xWwpBU_ACaOB{jxfo{Q4%x{=JKKHu7uXI6w1Xs zliob5!OXS2WDNyVE)+C+=HtS8HCbkhSg9r2xO++=(PwyZCEzQMJ~4 zVYFP=&PWPHf#w?3L=FV3kz8&{;Xe6WB+8@_kOr zX(iaD$l=g*r`FZf14%?)lPA1*$F_mFm7Y@mGFt@%q*5sE9gZ`rJqpxUF~{E{G6bCi z>MMB3SveAB=@U2g%}N1l7DI;kxWJzR6mnvvpTuy~vm92#$f7*rj|Pce(ezK8sN%R8 zkX=lV^DeDU2|I&OgZ#zD`6dGbd64tY8E;t&K)5$gMMF^SxSY8j0|j{AwvWz3b3baM z)l+eky+ITOwfAx7Ale5CDSP7na$9y1gShbj05MaCa>eDlg&r{qBBmhth%W^exF|-U zP6(&q?+wI)6(s(WPo!bs7}~fV&GC?PX6{$pw;=R6XdB0_a!LXuC7PISJ+XGOp++xi z2UO=La=5r#3gkJ;AA*yQRj&X73uQah$6LvA#z<_RVKT-dGLn`j!F%f;nJooDXccVh z22z>yCj4ZDrT}3~Z$^lWfzs@VzXoAw%*c`bo-u*E!d0?7JoM0$j`SI3W z*>rR3d>EebAaOP7#dUyyTtPtL83Qv5Y&_j_h64qgqso18WyV!9meNb@lFlIj7+IFJ z&M5J^F&;t3u1zWEk!UBv&R~e4EEM!fKNxh|P$QDZoQDf6&tL-mSb@zXHmh!!Pyb$K=ni>s}&)b)|^WhkVgcAhiHBvty4*`G)yw$e0W zEaZfEA)TI>=5J3yM-sO)iDn?3ZU`Hj$TAE-k;Jgw9L5SLq$HY4f2?Dulg?!mFq-=0 zP)UIGRJr=((t62^xS;gbK+*g+hgp2TgEn@mkE+1X?-J&vd0t$1XK6l~!9eJ~v?NiIush)fLCNxiV(Na&_)IR`m3(1dWx5K{}wSB5!4edje^s(Si! zUtu5@HI+CVEJ82wGx+ z#F8UkCvy48gm@5vV5uLW?-@1-7%u8YVx)-6P4^;bTNb>T+lwrKSsAiy&0-`3OCw1) z?~%cFQ)&{)H`(~Zc)=0sh4R;~Ns$JOi*jbSF$@4IKV_2p@8?No_*zka+nmvmg`=8WI$|~RH0E@4J{sqSUk#tK!j*CMY^d93;`48 zOcY;=-bxY}^N~OrBV;#R7(*;XmMu$}z^aCgb0k%+9BHbfX{Vt%1)GLNFf#1wpn4}A z0}5oC>S6RAGYfY-(pIgne65BGZ@%|{SXajJ$gLi)Di7dIZmL-^Bf6EiFwuJtum|gZ$5JGHdhJmEZk%& zI3Pfy-5cvQk^^caa$h-mEM*P?z_8%FU1A|eF0Ilf`s6KHmz8Skd22{6iivoctbm9j zRDCMyB^(k;ncgxqZW8&tN@m{=Dn5be)wkza2Q5s zj-v_|N(JsbRAk)2gH-P^U3rXb(T&V&4^i;O5~+<_waK~tV=rY5481C--X)#LO7Jr( z%%7%cfK(XQt=wS#CGb-fxZVE%m~JRRYmw3>dBm5PB?X#D*v49uc~k1GKX{iILrhuM zSTY35u5hvG&Hxbr6o3b)RwSSz4*{;vY*VDEC}4=+>fufXl|7l!fAg-y*Av5MBv{kgaHU|DHoKw2@jO>{W3;Ov}R7CN-c-mCP|foX(GNKE(9h- zz$Yl$Lm9XTWa7T78A2fEPRn1uQPef)2%!C)~#I| zoJVq5F~;y8k|n3X`Wx++pZuH9evIL#rheEl0T@-rh~#D1`a9*CenzpDpNx0BypM)oemhJOI&D4eX_% zU3VDh2rfmt!>@c;_ETvOxJESl#F13`fF=_e3QS52cQssID?3MeJ!vvdCcAu)=9Vpd z@u26Pur(y^mZzVlIoNwDFb90~jCUch5%fjmr7Sd%u$b1F#Unfgiz#)caeWX<@H*j+ zGCsSCioIA$Bx3{<2XZTX7CJrfgccuG9+`G%;Xox1(7jGNMLuf;7_r-?CR7?Jt@T!sMHP#=5S1`0R z$prc2$am1?SVYsK*EZ*#6MiBm+aHU-DG2Tr9bQMkno{BA;wuFK=VCw|%sp1}D#Ep}?-)dB$oMH+aD$GwY6fMLSgcHImG8!6hiyGae@aN$nOJxC(M5%LQd> zPwdUB*KkSjMddn!P=wG*#Sn;W2(_Tds(Q7H7})NxCW$q7Sny!UH9(fD7d~!`)gVBc zV3@1z$ezYgRY|v|1gIE589?0lJmjcPP#LsVG^7I75qp=$AX_la>5_dA!YfoEI(L6CtYEq%?|J?`qkj3MV)IRj_8vmhK4H&Mq3y! zC%TtO73A;lmSL7uG+?9OK8S`If);Dj5RHzb=kKxlt!hzQzRV4AZ1A-Cx7@S z(tg>g^?YHT(hpY`>4Ph|e7QvAGyS$fJ>jM@fRU1Z*LD^^yrN3rQJfh;qJUO}_bEb72w5?~~`O z+7`_GUQAq3;6NP{3~JmX+aO>mK*ib!jAORAcZ`6XIubR6d5T!0L0a2|KH|}W8E=Mp z@0qMX)d`To>+2!lz?gz0+R8tdqiBuZ%Xfz-%l_GD5t=c~+@OX~9+J6xsRv zqXpfF1R#q|>igiFhq&p!mkferc4V}j$~YLfcaoIbAf~5GP9dUOg?m3}b=VLFac=%=OyKv$dxgxA*~Of>{iN7Njk@Fw=o!Q-7` z7#NM*f#Dbn3nOXNkcSTA00pRl zFT{YFboQK(C9=`pNK(ll9}0x9b9O=5 zHOZqZw#vg16YNX_sHxJOAy@yj+CXYrpduQ#8 zG`*D}I>Lk$)d&PPoJtr;5G{ztlrx=Cb;rg!?j3~mpL{0~Hg<9md}Km061QRz?D}EB zgFw^4esZvAWuUOiLwNF%91>DL<^&2*Ab3w5;5&skF|q*l$^bAbHv!500OgsYay_{1 z4e@+5y2!O^t2Bpz9HhI%jy10WU1}jh5yV%JO`RivPc0N?iYOfWq=8QIg(`dS>6&fm;jm) z3e}k?Ad2D>s3p>M5t9j%EQ>#Pby0_b7GyPvkOoo6xyCZ27G#4of9NBCCh3=km%EAnomO!{TOB%=;$7uD;e}qXh;UU7|pNn9suQ^wo2K2VH3*H++_X)T+|Gv z3Rq7@Zct_KP!Fz2704QqkYj{NVFVP2?ra1Y=WnKuJoShO&6TrEaVqmN@4p zv>Bn7kGaW4Ky+K8E%eK31Q9cG-tttlmIyA<+m6;06I-B2>T*yC7I29g9QW&jDxiRy z@~}*ldXzRucm1^TZIQtS-hZnZl*fF#ZkOX1#5Ddot79zX8{@`$9O z@eom)`eK4kb0mb5ThAAT=)g%5CTgkgABZAnlpt)SoN8lICP?s+Dll*quZjdWB*kL# zw}x1acNpgAIRcUu^tr)1W{=V)Ihb0JQtn*x-v0orCQ3ndl_`lgI1Fs)3*_4Ei(l=L#isLSQBy zDmCZMPBQ}dO>Kw->Gj2wC;&(WC?oCr!{wvk2!x4?y8G`E4yhv*3Nss6iQcibM8rEq zWjbN6)-eL!$(-ATzJsgYWBM3=j0~a!%fR!NDp53J6p5u!W%7@l)F+^V!&eooW`igh zV0-fukBDw z)QN;VCH|)3Q_NEmRAQY)43!ZiQ<8D`5NrS@3?e64c)Ns;=;O{DPxu1>G=urg%q=kx zXd89+%V5Goiw-{$O9XudrU|g|l`%H` zIPQ)=I9IHk#%K%yw|5g*f;sORYbGLrCR+>YQ!aUAu2v*d&rDykyYZ#hHn($y9Vp--#i+M%KIJ9QiHRiERya5{pJWUx^ zHb{qHf%BTeO`?jO-x!LaK`XiJ^;?mO9WWv}?n}UU04;!)#+~7)C!;9Rc7`M6k;pUv zvw)P&jeKIzfsutizRo~I%ngx!2fpzHA#|zkCbxM67bE11q49Hs(Yy8w0@ebxP{546 zI{dhC-=Zx2aGMaE91+4P!Om3k3Ab-mo@lrd%26s>KJEt$p2L?BX_0DiIDH04Z$3}9 zTTA$BhslU$OV}a!#4@9xBfma!Bsth%1zV0pj?P|KfmsL5(=07ENiSINSVW-^Z6nt% zf;3G>E7G&@K76k{zvgYDP2ZY-pRogqaKu$$`*1;~HTI*k~Z?kLM!?sQ|!-zetXAj`Cq8Ay=k#=Pc+7f-M4eKNwM= ztfk-~#MgSf^3VP`lPskY(}5hOLSh;y=?yW@&O>()9O{XVesVIlVOCkk)%D3=%!0<4 zO^-PrIzYDKb3Ek;mXvub!-<1VzDUA-EyWTtz_(^rh$Q8gZUT_)1TSdA!3c1nJuJe( zLs6I`d4zJodYqfEfEN($B(tbCIU51N8Wl-#N~#4jiiELex$zVJ;{||%P>7Wh%MfjH zI}flJeJ~2TOfpLKMG=Q-!gpp=HcA`9*OGw;SYS=iCU)U?-ZYF-`__A$=V*6Y`3pYN zCyQV?BqqsX-T5+jd$M6b%SZb!GzqIiZ`-#itqd(dYHGtrtUwlyt59(?Qf&+<$U(yr z^NriaMX;qS{{SaB2{no(#RJ)lS{9-yc$+j>E|t>(G-EexBooo`GUbCzyi%Ljn@*fb zMKoZ-mb4BS29MW<|$|z(N#lQuB%R$1s%$NQ1Q!BgQ-Z zbtNB6M4n1`A5P=GvLz8PLD8g^E!2ay(SF#VO-OcaBcgSH5`i$By+xA-+^P)`GG~@K zFm@?5cg9VkoAZhpP$4530cQ;O#~B4zCL4b@ zH~|MFJy}yb^rCS@D4x2id&spLb-VoMwoOf}P)5f1Zll94L zYGeHMz+j;Y*QO~~-<)5O^~27LJo>om_S$0-`x%}Mag0>(*i!-c9PTwCAtlOrcNrl> z0yNvk-nkKIh7TP{g)~4BEVCkba+i`mWrX9haET_#C~7h~WE@K&>kv6sWARJCVE%T&Ijd1p~+}Bu|+8WCQ9$MA;5h zTFKWUEZJa3_Z7TxS<=%mVN@DGB9WHxG>bLEU7eafnC>UIq1reYV9D%~nO}eW6pIv^ zGK}=va)6NDM^B0-L8+g<9+0U33_F;wIR{?RE}&DTSK9=%CBY-;Rea_2O;VHY-uQzU z5k8W&dFZS{N(h%!W#?0Ie=&`Z$pk`w$a9czz#?TM>JAc!WC$W~P_Q4UF~=^7ibFIL z5$U{05IhKpgzJM5)t^-58c2!soR(eqiC`*EB!EMcnsbnm@Q& z`5zmtxX>#gT?y!!Y74|bLg46VelQl4^m&(?dtm{|nS-B?T;oI_xu*EPOyFqtbp363 zqGM}@4(2e`V0V)SOmbZL3^-BDoon@G$G*p~ewhe-0Q#fcg6qxn2@sh2tC&gh} zR&OzlWX$`Af@c`f@oOwLu?TbVkegFhkqy=V0J$~eh_3CcUnzMrR1eKs8?_INGa5>o zvUxFCHidK?Wcr!pFnNr(&az;nd9hr+Cm}5x#)NX5-gg*h6eh*UNiB8pia@DTrNqQP zxWG9DtJz86=QzQsAqcZ(qJT%Gq+k`=sZE;A1SCZiJx-rP8Dhv84TD6!Tfu}HC`dvd zb0yNjK}p6b1ff}3rED}}q;5flwL@{nK$#qaT_2hKWUAPmgKh_Z=18#Rt*Y`x?aHi0 zqtQnS11Z@gLNq?uoFJTnjYRj!wP+xogOTSW(13f1EpH6QM4Fc0>_#*<0nN^$S*)1i zaI`%TAlBT|8yGRKsbC-rRY;V6tm7ez7L(E7agk{ika{;}fds~z@V_VXfVq((8RN}l z4R9%@Pw!*ASi&7zKaT$VV1*>HI!tC)b22qTiu=`RfK1(@1qY`fZPYL*tnt1& z#tNWs#erJ_L7m8=*un7ifTJKVpZ)`?f{}t8uxB1n0bclwfIit?L|OqF2AareBQq?Q z#8idKDPfT2SdqlkKszrV&o~D95LDfU0#_!cNGp8VAcLlAIaLcDDP3KoyqKu*tg!K6 zhNRXBKUNH#fGNEI&!8;5%fSj19x^zC)g`D^El2=law1{|t~NjUFl3-Rzufv_=K>8& z7WdXxf%>2+pSR9Jbzj`Eo&Nw%31H|P!Bf^;{A8sH^AfAiKDZ^NA60%v7|?9P--SGp zqgOq94lR%gy?V2c7`4sL2>KdaXyfk3QR4R$?m;?Vhz+g;8K4Cj3D8<$88NBXUpP2K zO1JR(zUfgRNfBw| z-O8j9N*SZkk>U5qC?{zk0{I@9X#y%82$8IaT?<{I+quo)#+{x52<|egsThMdBWHM~ zErqh8Wqw?)3=IH_v8l`Oij?id3=)vJsl1AtkyDI#iUcBF9`eR`MCjy$fyM+#k|jqp z957Y`<^smf7R1fUR9`uwR)niECc1O&k()5IsYvTR;j`y_h=$#cut2E{X>fPjKA9lO zf(wIei-^Ek1v>)6AE(YBLKCp2DYJ{~5m;^P2ArPHTcAptGtM9{He9ERKYWx1de}D- z-&Kv^jA#u@&L9W|Gq6-{rz2o$#7bzc*ba89sW!gM<7asrCV!@;pV zGTY4;@8>JP6H0(JfK7G!=N`Xo{Qa@l)7$;Y@##6jWxHPI z*QYoUloqmQ$*wOT*Mb=~vl^0wn^hBxuJmSJ2rS?>)hD?UU3l`)JX{p6wm1BS?b?*otl0t`c> zP5uH05CE7bEOu;q)yYq*ErBj_H#FLLj1rM@qUIB5oH_8y@!#aKGxJ9c)snPl_M8D0 zl)+Efj0yx~>qUp1KWupiD`TuVgAvV>1R{&z=O^dvx{4m3+&VxJfT%iq+sXzo604J@ z*YWR>F&3Sn;^9H{&OYB>aiU_Vu<~%Eb+=|~P>Lvhm4}x@fQS@yvC2H{>L$|_5LkWE ze7{(3f8a@zMNDz&h$IkfeY#RXqmg6w5#u;ft%3P-BgpU>I*i^TMyP1#4BJ{*=*!2OkFzofB@%=xdIkqO$uo zLoyDjP7{6xUV2D5h)IuJa1+NjVnh0ImjKm7NV*)}0Fw|fgwjJK{qjUif>A)H>9Vu7 z$tFYsPh1p}SOiU^nAug2!F^&9_Jo9@iTh_F4$ZwS%wnfzV}h7S;K>oXlLM0!cRb$SmvBqgIxg8`anZN)1-{=t+R~WFK=F8!D#bd}I)UWWYAO1#f#d zHCo2MLvT)uaR_h~h&N_8bvpRgY)6otPn>wvje=J9Z0(QnyybmS@YY1hLp9cZeug6P zluCzmM}MYMsoT%tEQCGQ_liemO0l(l~ylK)6%t>kLzxc@rT6fR3Y#m=VZoqV^|-eBw#@*9tzH z<0cps<~}>Eq@sSRs= z5|UAefVdN*7mKuOoO{~#KMbC27$IJuIi`Jg7_xE!sF)NX2%N|!AfJdQ&?`~^A1i^S z-Yg`Z(RCnj9>uy8190SUS#pN8#kO3?04N|Ky@ndV7ct2MAjCk?prJfkCA5@cI7}fh zgF)mwaUZhlD1t(SoTIrg<{FUk}p#4BLFrdR{5>?45mj;Nz!4jvE=uR1e(b$LX8pn#wMO%wIYej4Cyx4@H))`#Dq}d zkJ!MWW6hBTzBf2vm`OHrGv3FH6tcw%X);9O#BNfNgv;zvdap+k!jRO5)QnCXC;=LU zGWkM45U7adl3sr6&}YlU=-5U`?ekM6@J42hN-E|?@)$}0ut$OIfeQt&P2bDsCE7fi z!7z#BL*LsYIf7BYBu`9sH2XRX6S4M>zG|3vqWt63!zSM^>l0Zn4`bBl1DZZ(!OyNg zC|Uq#&9nF6;nIkVHBw3LVx8iW5i&Yrh;>K99H_;GCG|WstX(qbKMfE86p4kHeF!W8 zyJd|-8KCw=K!AM7!+&eY3|zCJJWdt#qk+^20T*}27`IM^sNH6fxQ}-!VL=E=O!r#& zn8Kc-MCv)f8kvbU&Kj?D2*|93OA?khc#Q1_16p6qVZNeELt-2`Fbx3N2+;87Z*zuU z3f3?=a&g#C7=(4CjkdIJcl5@gF)4w-JOE$LS3#>Ip1h??vbY3mOcB}P>wJ1fB$;+W z`+3|g^m;r2B?R`W(r92Bw}xQILLqAIDl^2+!Ds~!GNw&NLPogAOnOc|)Zi8Z^nGz| zl1f<7-BSIrsAs6JlawYZPEb*%y(~mnm@P*h4qkJxNQ2;%#BCI1kOZ6K4`Lb0LM`t@ z{Nv*8D0|dKL!=Oepodp4^F4h0h!fZ4WZq)!IxJE|nP%j@IS!^)B(<0O{osdMQ0khb zzM|Y>MpD3_8}N+iH-H#BAyciROZmv`qhPSg?6AMy1Jl|P44v9AZP|!!S>abC7>5h; zk$^+9?u?%LM3a%oRQ%z2sDjSgI_EfTBlH)`6l;=?K~A}hcUE=5O?qH>r#Z72j?zgl z4X!N(1i`)fFsQ#b$b5TcgaR!GWuvZfBo+(+ymQ@*RUu?iWJMYb6VNcolqZ`JsXL5@ z>g=C)#gL-7G(Oke#voZf2WR(Y@sDCDA*Z1gkYIpj8WYQ2alnKgaXEWxF($onW*k9Br2J3KbG~V*dacqC$%?83_dR7t@0>A;#B+$&CcwX)<4_@7i4d&Oewb_}vRlrpJ`UB1$OU6n zu2xdCm||pG0glQm5XaJTBp@k^Y6giE>Ph1%Y)leZD7ny6e$FUlV&)J8cfQB5h{7US z*&!t^j>*Iy?12$dKpZXw3%C0f8ZlpBrvx&y+1$L$;mq4*lo}LdWig-^B#umVMWy6T z!{6s1&X9{qXnq+1Wi1kCBQh8h6o{u*aQJ6rY5sQ{{S7}pMm`3f;|bJLmg|leF(=W_xH%xHi?Ng zmy=L#T6ttLK(PWsxUW~r+pnJhO#ry}mB7t11l+FWB$Gt|lULT>n2ut?FyqiPo`H*0*Rti$UlX3@$|`I|srRjP~J*nO5tUTR+UQot@$c$CDdr)n$N$q9=qh#%tAUkTFY?O(=xLq@KAaJ6fvT$`|W^ zg+N762Pj{MKko3dQM3R7z`-AP3Lf8&iTGYm)*`p4r%ONPFjZawqE4iLqZFu#wke-` z&zSHGN3i0mt zm{AW2<4y9xFh?RKR7Cl4kY#EWlaD}njOPXs7(X^2$%X(xSQt{%uWY{Jgz~!eyilsC zran0Gtde0rTgSBtpiZzLXHXKsWXpiXnBg}j*v8#s?iDF%HGQ%pJCLG4JzMLCt}%)> z2Z^6{@!{C^?R5vHGp772mcF+^ij+?dCD>B@kuc+78GuW;03xQOMpqXW!3ez5@rWgtX)K5=~@rfsyE1b71?2nahlP=1V&g5HR?c(j>-;o-yH zfT@c*B#%Cr=|Qxff$12agxN^&H}GNgVF@LJtP-1zWJru zZSOb11TCjQvaxjohy)PHuZ%@NF$rUlr`2+$9w}3~hPvKP%&BwZy<((6hj9_9)@mkaPen}RGN56@2*Hus9(u%-h;D^kMr}_IbZZ=8Nk?@I z<2K9IbL)$*Rx={luh9Ph#X<;ODV&$EIY96gYVCufB6}yqL<&A}M2-TR0qi3YJxCKK zY=f*wDD=GvhTHIbWkrNEhQx|BJXSB1kO&D26_t05&Hn)9p8KC!G9!9@qo47}5~v8N z2){+fPUNEAUlP~6W`k=kwb{3LCV>=D;1(qClxqb;XN6!&1o1E9BdW9Z6C&CQW0zXN zuz-VR+RJJ9#DY%%!xPEWYwGi5(S1uRagF6t00TR6-5%G3AfhPPP6+|pCM5%G+T!nQ z63l>hGn0+v1(^fRjBb`w0f^Vwb(|gEI*h#m)<7LF(U9(gF&fC| zC8>|9AXmON*#iLyEO%#qnF5qs?GBkL$_eFW0ihC1$_Uo?cGgEKVit}kN+){O6Q&sDEVxb#xX*;nNKz$4 zBY2WPX>%JA!&MDjVppOhzHZ?y=yN3|LPN7O?Hn_D27I+BR;&Mb>COWO_y?S?8x*+WMOpvr1 zfyEIsa)@NmgXVHzB1^gXY#xNK;QW zz`Bs99&?j&@+w6GEV2IpRPzat8csAoK|U~Ye-8cxq7_jlOh`pSRI>>KVC=Np4ehLNu?p5LXkX1*z2$MAwj` zkjKCZSFyCbxC*!m2@$iV4A`@kT!_{{S5#kjHeNF;W{ z)-poSi$5ONG^_D1GwHk_iehcHO*hU>jlhmL=CFceZ10XNg#lf2<;_aeOv5o2gD42p zwZy)ezzE!MLBo=hSZkz@t>(j1qEoTPI$yF(k_URtCp@{YoN{fA!(g*zGSP*%>i+=j zvpEm8PtX1+vX^#|GRU20rdFUa3~ow+WtdjR6#F4;DGUO5^Hfj4);ASAH9_StS+=oB z#kV*5PyRkI+^iB;$Vg?7gOR=xJ!+`4CSgcG_(txkzH%xPNvC1UF4!T>o`c4z1Kz<1b? zM3Lhi*h7ns+l){OQC=-N#dgIG{FUl4p6A~>I}`59^w0Y&O&bwa0Y{f4K`>#e4e9*g zVH*h^F9mg#PCh!g8kyqq3S(|NYqAAxz-;aCZ`5hXjff&ssi+Pj9%drh^WK; z@9Xp#xHV&#alt5PcU2pQ0;cU54nqOwPqvf-%uKLg?7n;`hf8c^tLWly2ocKT#v=iv z6Ie;K*OLX|H=azp-SU|WC_n6m+}>g{Qcr;K7qQz_e1o+hIrbG7UdH~7mDm4NiD z`b1(9M%t6}IG!+phD*z$VW9Dl*`!VL)%eaboxgKc=*A-<3OuCKjq!>IuK~s+oR(mX zeq}{A9UA`tGKQzXG^`gR1q3xiuV9`>s%f!+=utf@6wZf|z*vf(^B%57RI1exarnbX zlt6zBuKr?i=zt_`+r0iOHh-jOq>1J9U>T0i0&o*gKG}5vaw&9>qu+?ZxSerx!+^|XIm0wZ}XA=06Jz6K1^a_QaiT1&lsB+oH(YcuwEvg53W&-V9Pd` z2z&crTbWpbI*LY?q~ima(gCqB<+D^IBDsI=%(F&345E2)c}VASi-Igd$Po^cGDHqZ zjnJI6+WfuM#zomsI|^|`o~eM7Lb=hZBMl)5$$ARlDih=}A*kR+>jKJM+twN9BQ+Ew z3C8=OAwk|pbU=U?pcFkOt+sL?P~?kZ5O_>hnqJXJOrF}Tuz^rtlP6I!J+fY=kx3~= z`2M)3SrVPTyUBnWP}oArN;oMMz(KiZGGWaoV0NmuF~e&L5Uw8?5R?mPVAKpGCICr< zTAbO3b_3#I&6R|dpp(<$c)}S~*8rzLSij!zkK8w9IXt95_wr!@vLb)nZJ=~^U6J&~h=q?vkT~dg z>KSnm_={Nak?Hz=G96?KF0LM${{S(QSKIz&_eE(I#_*63kjY>|tF8QFkJ2Rc&5$7n z$m<7?Tx{Hy=O+ol z8>9hFQ{M1IhKVxBLx6#dHd~c>8^slUJ)*9A$?*tM5RK-KOtMbDvdaKSKg+P$hg=m16!5%SZmDM9C zcdMxCFuD+{68a&Hlf>^MDKa~G2}w+3Bg3Jin#RJ?+a?&+LH*f>_m4TXdzijoTpJ4V z;$|*+%KD7Gc*iE*Y4i`n{{Ru*@urK?gr0|^8+p-8W|gYEV8WZ}fvzaUD3ij})ki)) zF1Lb%`Lh z3W#gjUl2@w_U8YdnJ< zN{?d(ifW`x2wdsosK~;xGEK$MGx{-5kDWY;*{2|dPh@E8f9PgeB| zpahOW7>=##|lMGAVh!vR~oEh$2BGMASIolmvn$_prP#S*|mvhddvQlb1pZ0W5Q6 zLIW*@BS3tfxt_bksBP7nNszPKk8EljElmrx2pEvzHu~Wjl30Y@B4$u9gGp;5gUhvp zED{Phl~qIlK{cw^5D_%M7judC^*}qUXh@F`ih`k9kc>7~`Us#B8c7uZBl1MSiJiv9 zeJ3Z`VXA@ZretKcn6=^}u|ir^pe!s5ilK@D00#5kQf6AF@0ggPGn0+1I5ACPmH4xL@rEY zM1m_|sQlw22=u+5PQsdCr zQzy1F45s6$^u*|(-%%JzNSK&Dn2>^@uAZ@icH*KG##8j=-Q~*=xSp89xooC-{HwA$om-*R#w1c^1(IIhD)s0(i)3-O8upA*%DAw?q^rK%)R zrqzJAH<2Nw#I+mfPOq0Bgord+-7LLd7?HMy2udbh@7F(H<|x?$`$xjn9%S>2SyFme zwuaKrfvCxxCa7xOk_=}_Rq)PHnyy@Ei8DK3?+v}B-g>-b|t1s+23S8K;!a*%G4#E>r~9r$A75jG373)ZU+&6>}SYb-JeF zyp!SS-Yn!0bqxAP{y?irTRLAeyc{WnC}8hj-Qw8=bcdvatX)|(R3rCy`^%JKj%yVB zEXAN_Y-C0bhx-^%rczPho75T$GOQ0o@-G=%dL82LYeDr7jy!;{3T2ZP(s2ybNE4Y! z!wAbICj$EH3Kn89k0Ix59@3u}tkuzoR!TO(632m&XEIKQrE!ZtJ1sB<2GER)Fe z4q;pi#0+4>&&oQj;WMy7xQv7-Y!2}?AeLyI506|U0*I=Q;p5{yHZwFE<{`hOWhUf0 zmUCwB=PhjmB7Lr>=Lzt?FeSYLpIn6-z~L6eOu@u32+^Gks>0?{AL2#TG^v++`GvrM zaLcp5h4snO$uql?9%GFD<2L^Qm@y!YwaVPjCoKA;g^91{<1Q+AMija%L?9~hB*QV0 z5M-|~vnST^kmHm<`v=*}RpKZcdHRu&;>k%&IuL+B2YSY|=F?#4X1hhkM7j_#Z65b1 zmfmt0*vT0S1fnCu8mm?UMa8sKo^WuJHh>L}1@InGf^Mmq5MegEB*g8G2B0Z~w-Xag zmtZ_rHXumbGl8qM+{NxtMXoc`XD+V`9Gu({u*0#;NH}z;TW%{YrdDRL?nDWKDpuNO zstsr_XW18E@&O2j3f5@Z!OG#`8BnUFr^`t9Vl_)SStsNfDG)1>dp^ufCYy(Aw(-h9 z%{sq19k%av%Qtu@J2Fk!wF!F;@L5f!Idn|pW2O!AxfoSdY?I`e5_(5m$wo%ikrM<$ zrNLI#)7+ShOm-3N)L~lz#8CxY;#8(NqUDYFQ#=`zlN~u*_z$)ylqo6PoQ@+$+dq_K z)L1Aug0Q+TX!~UWiO-wTeKBqbhNe9E)*e$3?*svMCP(X%G1&I|e;F1jJtf#FtqN}; zV0*>_@v~zc&BaKyjUq;UP%*yxG5LCIh{}!ucrT2C2(%D&ztJr3C}K%_5;)(Zi6LaS zo8)9IPaG7#H;mmElW%{}hiP3x-XuMJuuOt$4en~8 zEE4Lshys>L3^N_PN2yp=@8A_{2F@>r8p#ktLY7c3XN|mM$s~cqGa0W$>zc)shDb6{ zoiIUJ4pj;%C(>b)yq8lfAo!vSnGfeX{M={zhvzv)gXr;-QAC?Ba>`zeUkc1mf&{;& zMp^uZsrrB8EYUb!-0jM{3}TQ^O5er_P>=?AasL2})@+atx~S%IT}_}Gcb=TiDhSCn z%6xrt;$IaKzrMKAOnW;LHRJP)S0zMMGVOl+5K>yW zKW1L6RJ(j#W`xTPqp#__fN}v##XUFvWrlrnqH>a;!2>W#dykHBk}Zf^cTxfIxX}j&q<|02P;R6ttu=7qs_coT908_xQkMn))yFILi>=rKo|vd`4;z zQN#ZLKP!a{KoI5}ow7pHjA`2s%N3{u38|I+m~qk}ctq=*JIJVoL~hUxuQ-8F6AQ0T zh<@{nnC+qSlzwLCA$}yRf;{Jge9l2){=%g-G@`rgHGl$XIC@oK0-%}=QUuW1Of#t? z4onc)Bkefr5!fMzlGYc?@aoA8&z6xa1Hp<~pBsA`_;UAB(}aF#{{YPx9EL}QJaNu>7K(K<=;}Ukm?uetbXpo2xI)Xr`ntpk&8Sf1%g~B^#stAS zOz42!oV|KpNrn^1VP%ip#8!kn46p@F(e>5_(vx8e0A3*oLM2MuXRZLDsCZmTWutCP z<2=AwNGOf&OnS{b0OB$Zex$Ot8cK*O1LZn@(;+q76G;ZB6H`jTLa-o6%y^ERWCr?A zh$9dJ<-%{y803vo!+e-rBtmCdS$Hz=h`L+0BgS9$Q+JE_PK^3s5HyV(F6$5{x1Los ziDeVoHi9Q5i{;vNge<&2+Q^!;Fqh2nkwaDt68Di2S3>3_tOGz!#O?XUV_Nc1Loeev3)#GxS(=rYl#91#P91dR)$+KJ0Ar`=H=?oLqJ z4V~3sFo#%#>h&3{Ed&GzX$1*st}!HnH-f^*<@$QzuCydcOFKzCP8C2kL$nJfQvK%) z@{u6=%H{9C&h8D}F_qSFMI&!W@!tS}~?& zat!KzxHM4)@FEU{n>BpnGBzq;EFo{lobO-S4F3JjeliXwchVM^)@p>JiO%OCVTwX& zq4Z_I!X0=ZW%*}6>R{AX)0h**xK#v}!I?J)@s{@fX&~OBYk1R=%Ta`zh?>U?7P|nK z6H_?+!p%BV@S6MH0#wFkjzfw60B}5=26_I6esLl30ZJ#I(){C0;=?TVP?;{KQY?bO za`0T8>$}@-YEa09lo9E?gf^>j&%>?eh8iu0jjp-HU|?#D#75&HgJ_`)PFbu<(82}t zJZ;HV5wKJEH-QX#hL&;b4GMh}HRG;wCGWW?9}ylfPRE8e7r%sY!)f*xvg>$&&C`Ov zk8EcXJ;S5%?Z{z7kN_%dmw+cKW)&%1bV~4HWN4K!Zd1Ux5w~d^v-a_tlVrGG;NAsg zlKFcMw&WZwxqzdaTmuVYh8$EJ5mn^ z+gA~^!-&8!yGFQ*QD7XNXi%D|C013AIK@-~7YrlP{^JcP+^+`pgKbEnUy<>Xu1P(q zV?Fa%u4#M6V3<7MY;RQFvQHEehnOL&I+~2`#ZoAWKO`=`a#MxVLv6?wjhUBuFio)& z2sHz^4=oWOjqGTcLsa9pEG3v(EjA~Atm2V^N*i49aQo*i4yck@4SV^+6Ar;);C-{h zn*kKbRqURugm){MX@)OPWf}I)auZ?}wIqA~Fr*~EXN6|^|>>vBYgplriC2@&F3VVJX=QyhV}0B&Y$lSw{}h2{7%QBcsBdaSzt0NYo9lLCK< zI1~UDk1_jY*S^}KBLSpU%8}aw9GYZ|_zYfA=#FwV1CU3z{lXq-N?Y4mC+(E38561^ zlK1C7n!?i^iSZ1FG5F0VWP`9=c#La6Dl9^J03^Hgz!C|XMyX<@ARqNtO}4a?)Gj*f zA!1NiBoPvX4Nw4bjRXdy7NFSice5{vOizaLyfl5Urs?;ylf2#f?wMk z6fZHt!X7`2040Pir6E){jeO!0)<{Ak(0)6OO-m9Wf+~s)Gzo~NiQGFpZt~6$1eGMA>h&FtFangf zVF!m-Q5>V*LR|u22r}jLtYNcIbjBNO=WhfW~#?5os7Alm7r~5n)Nv z!m9A#)684WvM-JMdM0hgN<^dvxJ|Zc#o*^dz>Di9c)X;e68)KrveQ4Y{{Wi+AR_R= zs3INfHaX-xxt>)yCxnp27&9@m`NfB7(oG5ZeKL?*Iv`1D*YL+`bse8ngk_bF6AHq- zn#Me!QBXzZvIb#d^pfrFe^~E8h2_>oE=9>PIK`8!4t7kC0apF@0l1-nS3IoPYyPYd zJQSWc3MP0EdC6ouB-&LQMkb5)C76*B7a?)J(g9+k6Mtub#-e(TineRMv4WJfIK>09 z<2+7mysm@coKoQNjJ{kNEDI` zj&5m!PQg~xl0ZdQu6bgo>nt&{Cnifs{PL2Ln3`bh!1Zpffc@TQj7Ym2crtrTPX5`o zn1YG`b!mDfoN(YDMKBe>jgxK>c22-L25JCk!Bjv)L;=YWJTKIOnM~oQ8f|{?!|)7$ zJmI32l#q80&deF_p|2tHp2xl`+9a{!~H>V%g z!}goV=T4Lv4!L|W7%Q{lC;Y>MLYs~F$%)9?Jy^{<<_<*X2V)c+J!C*`n-$790W-|U zFD$YQncmNTmN)@Bq8ulTVhpa30HRv+;~72?*iAWOr=nUtF_BwSmg@zI6hYiuj&ezT z)29^V02GL}4|vmgdGkgQVjqB;#&MjFgXxKIzn+;fLLj;#q6G~)V0KrM%#kr;>V6_{ z(V`{*S!y3c-yxT!xdgD8aG_W}1QJV?TK@n=agr14LLCHxWqj`gl%^F{Lnuk}UeS`H zOeiCnWAwx8k%<7w3z8Ws!^1bZ2g;#4*q1jp0FGJtr86 zO3@sv!_P#VIEhP%)`9>YDkcDKii9DRNQX6cnJ$t`u)8M|kp|lWrA#D`9+4sn6D%~V zupf2|f|TXAMKyRoMFyH|Fo5UrqOHMY+7Q{n-0?5z21OlGDIvKU%ZB<3gRHBJtnH3G3o=`lK#{7rY%{MU)?mUxA!dE!_O8 zrZZ^^xsFZergAy(3vmdwiXb9_jgh&jalxYa$WvP60nlUP^mn5Y zkjWsLtv?tR!uiAUVt*FV;tnn%GQ|Z@~Jt*Lv^O6W9l0@!C&%R1maiIr`+AxtBStgMxZ?+j=?!~kQ;w@CM zS_p@kf=_uOJKXi8#&Yb{6EHYJ{v^Ym~`cg#6a zp{JI$azUBzR>rmxkOi+S-A(I+C;R+AST zNt}II`Weo`9{&K0?3XbQh%Pw(jQpz2YfWHF&^FOEctj5tZ=35J_=7WM_>g6AW1_Nm zBoUSwB9So#2@u4h!BrQ2laT#H=|Cd#KytN!i1d2(Ch}n$MQ7R82gz8Vm)bgEC54-4 zZg2Ap7}3l{WZNRoQG{wu8PkCvQJ9-#jn+-7jq(ekOwn-#MO4vwTWoJ^GgF&|6Xqwz zEnX2Z_?+qt4&~_fbA%`n;WoIzD{1qF2%Uc;2`Mbo>)sIv(nL=!&Pol>k162yz?UGC z(`eppL=ttweTP|6bf+AZfdWxaL9ZC(t3^VXG?p{|Mil@nvkdL0S1MJa`gfWW#DKIy z20PylO{{>uB`LFb_5eglGaBYT8DWJnD9H>2+cjZS23zD%qVUpU19{ll;Tgw)JjOE_ zK33PmCD(o4OSLEq3V^nRmv|Fk0^1hOn*&!kmMAR%WO9_4<+{oC_72vC2&i*-rynIu zC?=#!FBKvU3&I)`m^fh}3|12aW^QfFO4I0gIblAk7 z9up@>7Iae$vk~ZI5IU&Pj>$UpL#*eOF+@tt3Z@P32ciTiQpIoj@-%@!E)lnzebqQ1 z90+ZgNOwCmhg`uT#LO7Jr`N_eQa%i_Lu=`M=LH~e(J_L8{9>1^w4~`JmRA^{FffQO z$%wz724(yi{{RmDG2a-vXat!khrOp5;_EG!$O^v6oVIm2f?YkvM%;0jO&Rct^~b(Q z0B*dTV`eqmUCqfMI>XAKpPS}f*QQOBLaq*up4X-tNKdFpHpSLL)~RED%F~hakhuV| z*U-qAA}|$5Ns7s@R&328LKx9THHhSSe1wc;Iw!^;IFd6|g-N(kU5JU7n<~s|Q#q0y z;sY4$RnQTL$#6H2${;~BZ&{CvlZ1Dy0VIuWb#YVM=4F^tdlEP=5CG{$0k)be6f6z4 z4zztKdAm%5YBOYf6eTrx3%jG9mRwVI1arnXX81+eXh=Hk;WC^zEtKR9QC9G%1I_(aj{R1s ziM)*z*H@DRfnw`1H3S7(yoU%-lpNyQ$jGs)oh%@ePX($Z4XnZ1PYCv>_lO!iW!!|& zFiq>3$LY$n$aD4wwh1JV5<6=Llr^~Bk*AJ1z405ZddRhmdC4JaofKo9{zBn8&gG?>7G(FHpYXPr@A_~R5fl;k|X z87kWSb-+G#g3v$(5L2*Yn3%LMCfMy#&d~e}-YF$&wF4uzu!6 z&~JGcI&&B{GPXtS`AIl3PVLF4s;mBlsb61I;z=nNz#|d;S zeJc>r+}zIGOxjrLrwMF20z6kwt}Br3$9OHFp&ROJ1Pxf6-*UlQ=UjI_`N3uP-;7;^ zZPJBtlmVeJM#%P9aS5W{8P z9(fq%NTS+M8J_y5dx4=qr%+BjNnc>bR9Y5lio>mO;wC3Kl45Bvs&~D;-U>F?AOWFO z8?UuwVrx-Aq=_+4e@n^<0@j6#Z-~J;jtC);yvuK& zwktrL(IS&vD|UK{O&Q9&23T>(Y_}A@o^wDld)nEOC;WJBEz3K%h+GhmI4Nd zk*V@Stdk_V?HfnYHP<;r2!v^H$pc@@!=kxB4}f>-V58kA0d@p=D*>Xu#eG} zV=z_EM`?a>f($11qRw+dcCdk|i;&BLficO|j~L5akY2%%U@F`{(ZML&Aln2D;}{aL z&nC^XEwx-Z3GOOE7jRW~w3BVIDfKHn28P z%{xIRoWWtpFJzw_;1p&lP*tY~n8;9uAqPV=#BEXI9^ p0FjKDb~xSBTR?2w5ub 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

    Jmb_i7QryyvD(BPf(%C_sk7j!=1xs`colFcX# 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�noe4`5SK6>{Uf|qzr8kvZ=wUZDve8}t- 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

    ^wgBPsIRGyxPc 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

    n(b6yQL?;6_gM*;9;cr;f*GBke# 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

    tfILPI)pH55Gv%y+r|djAaF*di8zxt`#>3 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 L{$KO|0Q3LZ42cfY literal 0 HcmV?d00001 diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.jpg.meta b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.jpg.meta new file mode 100644 index 0000000..90876ee --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.jpg.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: f1ba7622665bf7e44aee3f43fc62e51d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat new file mode 100644 index 0000000..517d8a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat @@ -0,0 +1,82 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: vr_glove_color + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: + - _EMISSION + - _NORMALMAP + m_InvalidKeywords: [] + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: ed1b2724730cc594aa8c79b70d2deb24, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: f1ba7622665bf7e44aee3f43fc62e51d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat.meta b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat.meta new file mode 100644 index 0000000..d80db84 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_color.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d28ff85c01985904bb98e5bc03251ff7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_new.fbx b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_new.fbx new file mode 100644 index 0000000000000000000000000000000000000000..59a52fcb46041259143a98b2abed8cedb6140f52 GIT binary patch literal 282624 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 g7vH81 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

    }ELVXT?yr)mP(zQj30lc*fgL&$K>VCGooOb<2O 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,VZn^yCZiniH(r@)*PY?~qY{QL}g1Jp8e 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

    _8G41b!K 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 literal 0 HcmV?d00001 diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_new.fbx.meta b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_new.fbx.meta new file mode 100644 index 0000000..82e36c6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_new.fbx.meta @@ -0,0 +1,106 @@ +fileFormatVersion: 2 +guid: bf4ff8034d8337a4d8f291f88a544688 +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 1 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_normal.png b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..4f41129486649a0500321567f668ec34044c37fc GIT binary patch literal 2298961 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 z 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�c2?SHcC1W4x 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ξ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%0DTU-*Sk3sxUs?XAQ;zT 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°<)#if(_(OF{)so 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

    +Iq=$mJDXT|CF`AoH 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

    Ji1KO#U# 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 c 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�(k@rf+8>8u{hhBuL96c}!6 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 z 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±lu(_t?4%+u1^X04 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

    m@0u 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

    yd9f( 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

    3XzM?52S_wuj@XI#x*@>baIp*sD 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

    b?EtU2Fyc)tl+c%y~N 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⪙61(&-pIMu9U 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¼Z{n6KP-9qpzfca#LWJ9$IFL3J79bearEPo=Z{*t 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≧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%0DE<{jg7U<$QKbD!;`v%7dLDf`Nyz~U$bXqi55mY zTmi(Bj6ySXSk)Ayzy7myG?T`aKAcJ<%P7CFzWifoU@}ZZ{O|I?5ET#e0Y2>rgoaea zNAh7f+UokIr*-hylt81oR5TGIYt;2Oq%cbxsH$n3SdK5L1(}D|9cb04EG4DYVZ4S8 z$O3J%35f$6O!~7njjS3L^L40%IXJwAzL758Nb>V#^m>=!Qab}Kmzxb*%7M#Y0#O%W zMTV}7lx;j{Sd3`|_nV6)!2{t`$TG#$OpR34EYT<*5T!*;gMvwyjeB&~qFn!^{- zkSZ1sf>$*fUirKKcwbZc$c8rh>7&1uBFP=9;kU|B&5$!aJ>n**L(waIu3-%N#Zz_A zHV$nBFHeFys5wWC@kTgR6IF6aAZgQlMV0^^gojvjhYKkw{J*=x1|e-a{^t)f2NWAm zyxl4^j97CQjF?O6%-@+zq*YqVyD=m{h(a^?LAksIq5Mrnwg2Shi#g_UyC|2pj0^;^ z@+g1*!L>PseS9Hv4{7f+R?NGp zby{oh7Q^U}1-dS54rbAzvzY5}nhALxdM2T?!gYJ~d-LwtZ7A@YL8rdZk@2OB6Sw!G ztLjSw8B>qH=JuT{slM3V^W~8cZXd=h_2p5XsY>6t{iwI7vxY0|=~>$y!gKV&!R-&_ z9KCR|S3bQ9;Ou-LJ!@6LrPq7`o3pi~<|{5fMECd-tLyvdfUT_?@?5)2{MY-`O0GyK zxYpF+&z4+!XiaZ{8?Kl4oCDoyu01O=xSV*;-?)03PickT7H=jX1w<^A=)ovL5gZR?rCc77)A@ZJ9=9i*?jd~2wczp^TSTc%vSUAbmK z`8VeBYT@#lSt4K8i+o!mQq3z;GoSF4gYa!Np<0koLu;qL=!(M2!}N1n9lh7N7!RBM zg}pdVYTnMc^sRcv&WS-cUkewce->e|c)OmZ{eq-#+tn@4u536bdVbEv3o=GGuasW6 z;hgk!z4x3pxpVvH9lrE(X~3peo22F*Jbby}R=}3(P14lthg~v`1h5x9kXmqN@m@8r zf~()6{aN$V@-82*)H<~K(_-nFp}SHQZt}me>t*g(y$hYOKpUs#m3K>n zFO+(#%SNYTX^X|re#*OTu~%{*XU`!FE;l8_$ z4!<&$@x}gq++N&Q@k~{oDY%W?o|`4{s|r0|NNRB3+m(f9X;(bFV{zAEXzH`GEuRBfM>X`PfyYx7pzCX3A`L(?W_g-yD=P4-Tk zOmmxDhW@wzEswh3_ro)||7Aq~>*g(041?;s?4O?ZcyxOE+2ff4@1q>9>73?0@gZYJ zOq8R~_tQJAKV*t@8J}}xs^k*q&){}7KJV^b$*0LLvABjmmzwit7AvRm#c-u6fz73# zH^#d1z41SD z*lzc%IU6pW+C8UwC^Yh2{Iz__V!R9%V|l!`rk07ZIxNO>hKq5dytSmeJk!O1Su@z) z>t4QZR=;$~$C-y!H+j>{rlt;&TQrw`hpYjChh_=&UK!c_^ADa7`xtU|(F_-%dABb! z)X(;IJ**sVx=A`9&rW5*rqu$>jk`5>ANRhoDXQD=UUOn@#jYCjrerIt`upcY3X0a# zJO5~I6S}J~`!KU)?v)kpb3$F%dAtws2fqq<F@e0_ zqbk*sjow*lyt-n(>9e(2b)u8ooY{)4`?{5g7xyH(IBRa*|25;Ap2^3D7Zz^6lc0NG zOR22xu5#yhuB%fx0{p8qZU}~TW;zTdC|*k$>Sjqn*sAswExP+a=n2tx?@Oev_SNNH z&c`Y)8KEDK$dvF^sKo3)6>D6+qezkZ$4=q%avzUwTF`HL#M_?drJ@vZ=zv|6nG&KU zUzs7W?v&y3$0u%I<1J8b7CQV$FSMe(Emr05g^#syVm^@rN0#Xo?97(BQn}9g?!#Nh zgB%Nwd=ZskKd;hP-QQ^XT*hafRl!}~xz>iB;Bvs{B|#LwcN5xc2=36pWd}FQ^|c5TF1QFI-+OD*4u?|Q_`N+N;~}~ zU9GBPVHd7cubF=(c2j=6^bNm|9hK63>tDy;^SG=0S~9e4)v4E~l311Gs1H0ksxH^Y zTB_2?B7Zd9d2OuvcfLR))1>@X?d%rz&zB9Zg$;)6s2!TA_|^M8KFWR3^UVDFw_iHh zoYzjgn5nUp#wvQXx=)(AZ_w53%-44_ay36T>%O!K&kGT_XGdi0PHy(#kGJxDegCCK z-g$XmrHwaE-Hj}a6B()vCMFZVv9GPNp52D#cY78s zaCO@lwf%WsF#XJce4C+2>rXZ=`&&Ec6!M$`ixY1QT%@ZB=1|ytZ-2C|!7ateCe_Bv zlC#`p2L{h>hzhrPnDY}1u~WJWQ8!> ziLRC1zsDh5&x@W@VQ4N;Oy{Cg za6Z`9=eTd$;l?->$MWkRvTTtZ{`wd1#QRt5lncj8Tzhz;RaU0xq8i(oqJ+6zm$aQS z#QauS`p>dD>n9n|Xl>|cDQ9U@R{6wD@6aa0)n0E}v|JKTwzd21i4R=wRXLzs*4O2= z-T08-z~_O(F~+kwL!DjQO{@0CuGu~_)!enAg_-e3eVdtjOHd{ov-Hrn;&tA7-A7Ab zbk8iFw__`}hv*z$7ZDM|mOh+@)=fQ~$AYoW97Ly=wsG$Zv%}k6G;RMgx_U#drThhf z>z#1<$A*~vfK7`d>XlnoEHS6!5-Ol9n*Za2njelisW)3UAj|M8HHwm`kk4`fn+nh2 z(1WNJq$NRPpA`GUvH=~yxa;03@-fK-4qfL8#o0p0+- z1xN?T0LTQ$0>}o)0muc&1IPy`04M}_2T%m?9-tWD1HeZBlAl5#s=@#WfGB_%z;1v& z0DA$#K|mh^JOPLRhy)fDHhw02=|=05$<^2G|Oq4uA*H0MG;=^_w=p z8Gy3@Ism!=dI0(W1^|WtMgYbDCIF-)Fat0LumG?GumZ3KumP|Iumi9MI0xVWa2~)B z-~zx!04D%vfJ*?E0j>hL0=NNO2e<)n6Tltd7Jvu9ZGbxfcL6*Bya4V2cmwzV_yYI= z_yYt0+y@8*2m%NO2muHMcmNOv@DLyz;1R%MfF}SE0FeMs0iFRw0Yn2l2Z#ZP1&9NP z2S@-&1V{o%1|R~Y0K5c919$~+1Wa;m0`tS{09ydI0&oIs1KghN4zL4& zA7B@N0DvICA~5Z?3}7|D`%+3$I*@--(ZazkDOo{2Qkj4i7Bem$wdT8}&E%^S9@O}b zvE~Cliv3ZL&b_U7>euBoC9sOmix=kzdw;+5<-BXw9CtQ!?~c}cthhn#r14hI8+|KN zvrfq{pI}$4h;2A)K2$eQV{Vt*N65AGt7z`F@$0-(<&1YLpIsB<=AGuEzVhDDmRIxL z12h#@-q~!+%(vki`&}ik~;*x<@z`sN9;YUU(=} zzB2b~x8WkKq908s!o;}P@egCeS`63m%SuZs&bi{WBH=mve;ZWxTPw(Nop-Tx*5vF} zGmw>}%fIS-A$3uwFzcPZryTnd%inrAYF(3}#=AMc%{aB`Xq?FTNA(W}<#(C>P%f=c zDbD`*<48Ep);di;h;W}aA4f;)-7!<&j=Dr4UHEsiOzjg9&*z-u+T`4&g0I_9wW2DwB+FJSJt_G zPi&Xv#pRfoERyAqPmUf6c%ZPc%D((gl62cvzgVC9`U~2s)hu(&ntaR7@^Dc{_$g8+ z1-+TQZI|YOD;uTLysZPc^Bb1lKQXhx-e$vMo)y`_dNPCQu6JVG`A+Rt&N^w7A+q8% zUFyExV5SVsvS$k(@o(Pv{`nh(Xq348xsk$|v(+b_w)&ht{jgPS=>X3se0bSxarbAm z@d`|}+H_5|rVY+LUNcwBb(%w{jQA?3oq9`|_+lR+_Pg~-8sqN!^XYT^^J936g`1Q0 zZ+Dh=a@XhmI5<1ECDYDUV(>cW>Bh*-{nEnB_n&0@D+%T`_Mc#3H!G9R>h=?>ebANi zpuf*a3KP0nn*_SuDeNR4=I=b(j`~75Ptcxvk z;%DVYR*fEdD*yT0EV=oeLvJVNg|s;PyE}2W^l#?~mM$6?D0};TxvK7m)%cJmzUsi; z7av~g-^$BhbnEpB0-W2z zua=j(Jb!d-wn?ja#P^67_X4G|bL*c4=oq(%UNM-1WC@xI>1(A5ZZ~ZAaAN9zP;c|4 zS7zq&{?jwF6-x}0GIm%KT&^h8m6?-{dpMUJlTzBg>2=%Jbd-=>h|okK(|Z}0}ke#D?99) z#5Y?VQ#q>6A0kuJcKV{!K?e5+Lo;R9R3@rbEqZ&+M%I~iTkMSvE+&|1SHuq~S>5>Sd`xz?mfSl>q{@n|x4&3MS)j)mNH>!2EhKu8?;#`(wGZDb zIC8eY4ZY{k2feqjc!+EG9zsyzhd)B(dl8A>$oCu)+sXG9j!d;DEZq8h#$XU~Z|92p zA94+e1@hI8sN5XT^(_cLI`|~*GDsh2?jHuysL9BUF>Z$pKyQZ(L`|;2+zvS#y&ZB9 zdOKtX=61*vnA;%>Cwe=i`!{mv!LE1s^Xou*VbDYd(gaLQ&|NI$K)McX1jcs5pFf;1 zvim}r5~k=jBLitKRE8E5HozT#y8xa5r1tj!ya9Xwd;$Cb`~d<0 z?gIn@1OWsCkOtwQ01p7d0RA)}Ck@750*oF+j~+O~L9;Kg)gK@LAP^u3AQ&J7AQa#M zKp4P70Mg+25x}1Y$kAZ^bAT9tSb#Wycz^_eM1UlKWB>v{3cw41mjI~%X#lSQ(g896 zvH%(ZngLn>S^?Ss+5tKMIsv)>x&eLw^Z@h%^a1n(3;+xQ3;|GqY?=Wu6JQp=YyfHi z8UR{=IRK=={XBrF4DjLL9uA)2z?n2?{@sAt1uQ2Gny&zm2F}+2CNg*?4V*_0m{(R) zCM9VQPx_1uBuPm|stTkd0*e_Qa@P9`WtS>*MD5S=Sg82znWWt2?*|x!Ikq2^z0b#c z<8au!1FP^Fs#{OQFH^kaTAgJR92XKCrlpbX;+B!MSMRLI4%2LWiA|p5mPZxI1>R!z zCPTZto4u`@c2)Fny5R12sw|o1!rzyXp&G8Zq=<95W9D^BL)T;)9_>t@h=}G3`b8!S zPCmq0zWbW(c-@e2%AVGGWvS9G{qJUH1LC%SR*CzIgGa-H( z)6CTkf|~U4rv1DOohk??ZQVJ%LX;2F;*-(6q6*tG8#~<5AI2TS`a9dSu5tIHE6N6^L+_@})+EuB|r;Le5IOi>%aVNdKR{6vn zi4ci58|PKLba~PuyGMHgf6oSyu;|Y(mpErqho6ozJed}HfyXjPGc46xY&zqi6XJ&~@8s0yeRZ}4}x4q=(Ymq}etp{XR_7Q>}ue!09lB5U3lXE;9%K4E+AjCkxyq8j^3>$T;t9)|DcU*9iG$i04o zZ%=-fscBN}su%ZIX-=;;%Xxc+ z$7xQ7Pw$hhaccOL%_sPHbLWN4>3L^D-*ly(czD*u)5a$URte|q5we_ZVLc#l#qy1D z$uVQxF0R#VqIfpC-4}=|6*R<;L%bgPfl|U{GzrJ8Bfj4Z4H>#*!X9WAVy8vDWo?Om z%VP;=XYQmO1G+2*40GH=aZC>$(=yN+aqA?Na8b>cGA{_=PAfSk-h#(Ck zqJk(PARSU7f~0gwx0Hy40!k|l5&{F#0@6rGcX!uWBO~vt|Mz(w-|w7regA!3KOC6w z-h1xZ_uBj3vlhueBoUBAClUDBWd7fh2#lbU2n?WC#o)Ij0=eiU0yF3&0?0p2B9J+? zw^Ky#3lIFC5ronEKZzg?jQ+ZF-TMu8u0N9=qfW&!qaTDCWKhfBL=aEMe|DM z9dv^p&&EnJhocBB~er*?nT zM|B9)-$LMrC5GmM1CE3%4;~veVQ&%C2XwDqQ(Ahxo%v>_IdGtU`duJR%qqv5oZgeW z7j1UKM^{Ls*_W;!oONuWdGOk<**;#qqgj*lc_)kfNRFbUU8LPcDgCXF+VTE%l=?fu z^QmJNBYI8<>e6j&?|5xa6FZI`0gMHAp~kQ7wD~1^^>#LtJ!iPzYmIj8avpu2aIsfo zx6U+A#dO!We@R_VLOGyYDaLY1XR_XUxpTTF~w|H}mxwnUBpLTy(tN z_q4yS*|w`ly_IRiU(&-8IeE{2!$rC`vO}UPLz%aEm#3Z2-#VV{jzdI^CGO~JW^6Z|dkXGJb?SOi+Kw`t<|r zk{#Dn!T#)Lw>Pj&tSxfmH@_EMNRVO(Bc-D0TOyRPC_XcCQe^v(Gt%F3Hqwgh4b8Qc z>17A4)F$=m(~>&}Vp1H}`?NPBowOyo9oI+NlH19pdA@c?tjn6Hh)lh;>qN>`)G9Jg zVc;Dk*d6`tJ^Y99VQw!=33Bb|k8C6emc6Va`{M&0I(rExI!j3cIvWXef*(ucURDz% z-(L0-gy&wClKt`F+v?`&>;BmYp4m4^2uS@ZTI^ zuAmdEFrk~){##;|fxT5h3ZR>O{kOy_7tx7T`p~Q5^;=?pBo?5 zwgPy;^xvLv;>W}PE&BiY1UUVCAf&L9HTJD1;=#^6Uj$$F!%MEwtLL6LbahxPS!?k%LZ#~Ys;g@9u za1Gq14PXeoeL9%EshT$E0!Mo2#T&J4jA2|PA`G5dQX*%3pI)hA@RlX0!*(jw3M##~ zz!V#1+F}%-c*!(aPkHp`fsTeR&J=H_WZDpL;$Z8|FL35@*ppZk~I zGpVMJJcz^e_7#aJ)4K?q^N9mwmE0w_#f`(*WR7JPhj^ZOZb>3S7kXSuq44t2wzQXK zaP=M8BsO}R;AK=PXkq0I1xR4H9=~@NJNCsram-+ud79ozzs8BRU*B9Nti8R&ez5TK z&831nEHSk2+p)LkQl3mr{gTq@74!AZ2gB;P9HSoQ0KfZ{BRA4+*P6YSGfYI&$sS zR;&K(P0kR;Pun&pYbop`ym{KAW-n*2+%>>lq!CNnUUgAc{k%>)im^nU(@%-#d;L|U6>GEY;S2-(y%eca|KjbGh7~#ET4e9sx^WAmT40?_;Myu)9OIz8)cna(Jy)YJpO#qcu&B^- zo|DJJp0Rl>@ibjwNamFsCcbOpq-8y^&NY^lUtb+}DkVLe^y7wcw0_@`uc+679R}tZ z3OS5}EB=LnRE+5%3a6faH6;6Z=XKrYIr^xVpaQsSAoaYnQ135 z+*@tz^P8RC6=GOq7b+TQcRfipakf3z8_7wfCHro!zl^MMjN&yx;YN;N7uD4hC4_iv z#1BXBY=2Cm#JYeRXs(uWOX<4H;FhlvmsG}vNz6^0y9Qsnd?RXT*JK%$2Z9xk6WOxi zSQ&6Eijj5>)DUjWD_(xtnAfvy&HQMR#2LROG_CeEPnO*sM)O+vSety4%ZBP>=LkYq zbuHWH#EVeKVJ`Iv9D1oL(sy)3UCvW_0vQbYA)_=PfeauI{>I zFAISiyt?+66+U#Gp|AUr9cP!D!}{K~e@?F~dDEC<$&%cMO!g|Hg&D2WppoX#7VX(4 zbES~1Z}bw|)4>fjg%5&fb!HaGZb^v_jxcA1L_N6AG~P*D(xpu;%{XP}6PXpQQa+ll zVM0n#YpXpN9D2AH_T=T%b2gsiIP0U!l;>kDMV`LhoJyCz`-px`$81qewaQg$EcEVl zuD*+ks0H~0J}1`2{1WjbD5TJsc*oW6wt7jMR4qu=!dHvKF6&d@b9}uC`z=gc)+kAX~d7$U?<(_|27}&6^&Jvd_zF zlQdjDjd3yiC+5EPYV5cw)$411(qlWRFk#G5nCCN1xL+hLnOk_rbUbH$Z>7BLfM?8| z0%ZMt9${SBo|K5(+YuklRQTbe)L*5Z8Yb+V$wHlyB$L3$FpZc*MA*Ie@3Ez zaYoO1FMl9{Y%fnBl4ma;;QkSt6FRS86*_+)H#$!sI)*)BZ^04zyQywy5!bLc+{Phu=QSP4v&P~5~daFtzVnpYw(M!{a zQBwP1PWw^9OLL44#sSE@GVPQ(Lb<#Ovz=jxbZ_G3=*Ie*^Q`&p=9Q|<5R;G`j&>my z!%HtCmN@9i5O5bKF(yF#NT^nT7{QMi^5${r>rC1&qy;aUJsm%On6Nomc&y?b-;eKN z7+E)lS6Vp<+#tHGh6=~!2Rs-ZZv={*b(Lv??=alWs5?G7{@E6`RdsC?l>Hg+`UG`-cS|YK>KLG#=dXwTN2H+Lh6E-(@cr@Drt|fxkTd) zTEX{&NXe?tJx{Znr_?i&QA`X00=>6Tnt8t4wY_F;>JX}0tc*Q-h zpuDS~^i%C1>U%dMna^A=3<#ZEBu0hb0uO(Dp-7-#8ugu`mPK;>4}+!@3ia?^k0Trz zo^`h6-}L(_i?o@$+P@MMX)=ClucKbc@Y|;9qZP|)5T%@cO0*M|`roeeW)k*u!jwaM zUH9k5&|vS^f6dVS>>}!Lhb2a#tPOjM)o~ivkBN7)Wdo!=2(+(y4-w0$GRLNKd|Z&X zdO@vYli;sF8T`1@^ZF367vC2){-gM8Jyvq;^bha4u|7O2E|c}4w|<^7`*kV{1#T$0j&5lRL^EsYbvrec>0|bFU2aW;w56ut&LG? z91ZAB6R0;h!0%pKSR$L}Uo%*SL420p{^2ak!vG;(OJ#irG5ps0&zd~cCNndSue#2> zqoX~QuH2w@eqKU;VsoR`TmVmMVfLzvx#PR%lG!=;Nf-yuiRnu4Q-1L=&N*gONA&PX z=J!pf11XZHXukCrx;`<-I+oEaTHIcqQ^J;v>ltaQ>U-o(#n%j>!n%fJvNxv<><;)q zkiEH{N;?!&lUvb>lR&`wsk}Q7OK|1A* $$_B$+}maD+&7|v;p0pdNY1y}{7fnR)%Ubvjo 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 TU+(zc>M}Gy)pIRiH|75WM#fjo literal 0 HcmV?d00001 diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_glove_right_model.fbx.meta b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_right_model.fbx.meta new file mode 100644 index 0000000..b38a981 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Model/vr_glove_right_model.fbx.meta @@ -0,0 +1,106 @@ +fileFormatVersion: 2 +guid: 9183cab5601042546807088e330d8679 +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 1 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_gloves_prototype.fbx b/Assets/HandDriverUPM/HandDriver/Model/vr_gloves_prototype.fbx new file mode 100644 index 0000000000000000000000000000000000000000..7a0ca5e74701da3ad742e709c20203e280271d82 GIT binary patch literal 538240 zcmcFr2|QF^`?nNImLe)^siZ=sBHLt3vQjTZJV1 znsu@?c7rg+82@{jDb1Uj_wDyTpHDOQ-Z|&{e4pn$=Q+gIxPV@I+3+>zbqSoy2qjBR!|2uR}|FF5st7!kt@=ZzgLsLIlosmfI5H` zHHH}J=pt6Ay%wlVsRt7HutGg{H9JcOHzW$cJL86gYJkNvv5L4y;h@ot40OxkceClpj;15gLMQXM_0CBn{X(L9`F^N_33Q96iK8*XC* zcU-F2w1N!*8FX|GR0v{=PwD8G7Y&SX(Ay3?0KG_0RZ|lDK563wgWEX@J1_OT@PU2% zWhC}X>|aZED~d2tGSC`5OQ;=G!_FF^w-I=xZiBEew*hbI=zsje0{o)y2z5|3N169g zF=8VFtpc4wZ+XqNK#zijTKn%^ZUy{!Y}I0&|M+0hhN8?tc_(Q>aa^I&>N9YZ4O9OJqOGGZw85E z(G*A9z9@f@0qCu|4sc+=nA@N(KtW7}`s>AT$^}zC#1!7J3GV{ATLf zXBO>BdGN!odb~h`eTOCYACNq-@4!LfeKNB9Wn}m5laM|j6+6NE5Ae;v z=EV0O5Z`xLc>m$0ktZvC;4qE~KxVP| zvUEcVctA_KA#C9Ux3N+H!iMy|L;DW-g5&lVg?%aC(1W5-z@+0S56(zHq3BHUm+u(^ zm?U0U0qdt(FP@A=+YFg0TLLZf)M`! z0a}R+0f*WB9%et7lLCdpWbe`~$OQD(V-7&#`g<~9!sS7QvhN29n1KC2`6HiVDkLgC zDhMEj`8^*{G%Gpnqi99N=LgCk`4~_k?f;<}m>^KbEG<3ugbM1=4=6BWr-J$;vl%Kl z%3uI`jst+xw}YefEX{48#}@OTMZdB_I9UMsCg@^1PPP_gcT!#AfrFd^H3AC7YDX9E z7N=%#P<|))-y^4!k;(HG-SHpDV1FywTEKxMPX%EEBqm^>U%Wc4uB-=AS$Yh%AT#~d z1v{uSP$=A$mTo~m2JNH@wKjLML8$=wiG%qHag-aV2Si#cCrhY<@JV2Sf&^kN5Ph|& zpm+R$2DyTn1ejy$fm0RK&dK&i7NG%-jayXBmyLB$cd$7i6@{=w*sKK6L+Kv6Re^dM;Y60xS?vi!;PVG6={GEMU?O78VMK7UtZ$tJ?q{UGi8^ z*~LY59T<*&QGS}jtjLvqVPen$^nlF@OQ`PB+7%2qh#$+?MRD2W_7oG#kp%)>1oB== ze3b0qwtzocUiwXjxHtyQFF}R(?b}br_|GpQSsKM$d+I znBpvJMX}K`Ki@_LOq16wg0CUBToUo)^Cz#%Av2&z-c7Ct*b@w(hEO={0*X3$(*w0s zQeCQQbaaXeW9ttLFi>j)+rx`Vh6Mu1Ho)H&KQzFredPIpBA%+L9*~@^)b!Htn*t7c zX{Dy6aY zUzV?fq)#JIi!n>d64;`20)hBdFMxfy3<)YDy>zoU z!L&2@B?Vyg1XaBtM0xWv|OHd|ztya1<+0+3|-4D?0W$S`k)shX`5`R`iBW+7N!@)xzYF@CQ5mCMmF>6=6j! zD#-{GZ#wnEo50;qbtu9X3M`H-mt}ANYkqi$?Clg$IzL2#8S{5hl*snK%88(oqy0k; z_|i#u4QWpD3lfUjzXPO6Y4iUAkS3Mm$bewJ0+wY{F{m=Qqo;(Tyvtf#gHXRd z#Zn=VqawI^1EZ}za%q|ITa0bwH4nv3

      (0TR=@fN=TM;*lQs4Mo)y+|UCH&=lOP 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 z�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≪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�Fd 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 literal 0 HcmV?d00001 diff --git a/Assets/HandDriverUPM/HandDriver/Model/vr_gloves_prototype.fbx.meta b/Assets/HandDriverUPM/HandDriver/Model/vr_gloves_prototype.fbx.meta new file mode 100644 index 0000000..b05d8e3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Model/vr_gloves_prototype.fbx.meta @@ -0,0 +1,106 @@ +fileFormatVersion: 2 +guid: 0305e3a35dffee44ea72d74b0d43fada +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 1 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Plugins.meta b/Assets/HandDriverUPM/HandDriver/Plugins.meta new file mode 100644 index 0000000..e4efdb4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6f2d24fab7bde647aee587d1edea618 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Plugins/Newtonsoft.Json.dll b/Assets/HandDriverUPM/HandDriver/Plugins/Newtonsoft.Json.dll new file mode 100644 index 0000000000000000000000000000000000000000..332822313fbc6937f216850faba673f14f1c6f28 GIT binary patch literal 711952 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

      gxJ1mFcpxMjZq$| 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≪pMvhjGJdI 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%0A4$-)I@ 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 _originQuaternionDic; + + public Transform Thumb1; + public Transform Thumb2; + public Transform Thumb3; + + public Transform Index1; + public Transform Index2; + public Transform Index3; + + public Transform Middle1; + public Transform Middle2; + public Transform Middle3; + + public Transform Ring1; + public Transform Ring2; + public Transform Ring3; + + public Transform Pinky1; + public Transform Pinky2; + public Transform Pinky3; + + public Transform Wrist; + + [Header("[Axis OffSet]")] + public Axis Pitch = Axis.x; + + public Axis Roll = Axis.y; + + public Axis Yaw = Axis.z; + + [Header("[IMU(On/Off)]")] public bool HasIMU = false; + + [Header("[Thumb Root Coefficient]")] [Range(0, 1)] public float coefficient = 0.6f; + + [Header("[Thumb Root OffSet]")] public Vector3 Thumb1Offset; + + [Header("[App Options]")] + public bool NeedRealTransfrom; + + //[HideInInspector] + public bool UsingNetwork; + + public bool UsingAndroidService; + + [Header("[Vector3 Angles]")] + public Vector3 thumb1; + public Vector3 thumb2; + public Vector3 thumb3; + + public Vector3 index1; + public Vector3 index2; + public Vector3 index3; + + public Vector3 middle1; + public Vector3 middle2; + public Vector3 middle3; + + public Vector3 ring1; + public Vector3 ring2; + public Vector3 ring3; + + public Vector3 pinky1; + public Vector3 pinky2; + public Vector3 pinky3; + + [Header("[Controller Values]")] + public float Joy_X; + public float Joy_Y; + public bool Button_A; + public bool Button_B; + public bool Button_Joystick; + public bool Button_Menu; + public InputData inputData = new(); + + [Header("[Vibration Control]")] + public string SendBackIP; + public VibrationData vibrationData; + + [BoxGroup("Vibrator 1"), Min(0), Label("Million Second")] + public int Duration1 = 20; + [BoxGroup("Vibrator 1"), Range(4, 10)] + public int Amplitude1 = 4; + [Button] + public void Vibrator_1Active() + { + if (Network == null) return; + SingleVirbator[] Virbators; + if (Hand == HandType.Left) + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(1, Duration1, Amplitude1), + new SingleVirbator() + }; + vibrationData = new VibrationData(Virbators); + } + else + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(), + new SingleVirbator(1, Duration1, Amplitude1), + }; + vibrationData = new VibrationData(Virbators); + } + Network.SendVibrationMsg(CharacterName, SendBackIP, vibrationData); + } + + [BoxGroup("Vibrator 2"), Min(0), Label("Million Second")] + public int Duration2 = 20; + [BoxGroup("Vibrator 2"), Range(4, 10)] + public int Amplitude2 = 4; + [Button] + public void Vibrator_2Active() + { + if (Network == null) return; + SingleVirbator[] Virbators; + if (Hand == HandType.Left) + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(2, Duration2, Amplitude2), + new SingleVirbator() + }; + vibrationData = new VibrationData(Virbators); + } + else + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(), + new SingleVirbator(2, Duration2, Amplitude2), + }; + vibrationData = new VibrationData(Virbators); + } + Network.SendVibrationMsg(CharacterName, SendBackIP, vibrationData); + } + [Button] + public void BothActiveWithVibrator_1Parameters() + { + if (Network == null) return; + SingleVirbator[] Virbators; + if (Hand == HandType.Left) + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(3, Duration1, Amplitude1), + new SingleVirbator() + }; + vibrationData = new VibrationData(Virbators); + } + else + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(), + new SingleVirbator(3, Duration1, Amplitude1), + }; + vibrationData = new VibrationData(Virbators); + } + Network.SendVibrationMsg(CharacterName, SendBackIP, vibrationData); + } + + + // Start is called before the first frame update + void Start() + { + if (GameObject.Find("Network") == null && (UsingAndroidService || UsingNetwork)) + { + GameObject network = new GameObject("Network"); + network.AddComponent(); + Network = GameObject.Find("Network").GetComponent(); + } + else if (UsingAndroidService || UsingNetwork) + { + Network = GameObject.Find("Network").GetComponent(); + } + + _originQuaternionDic = new Dictionary(); + InitJoints(); + + if (string.IsNullOrEmpty(SendBackIP) || UsingAndroidService) + { + SendBackIP = "127.0.0.1"; + } + + var Virbators = new SingleVirbator[2] + { + new SingleVirbator(0, 0, 1), + new SingleVirbator(0, 0, 1) + }; + + vibrationData = new VibrationData(Virbators); + + if(UsingAndroidService) + { + CharacterName = "AndroidService"; + } + } + + private void InitJoints() + { + _originQuaternionDic.AddOrUpdate(Thumb1.name, Thumb1.localRotation); + _originQuaternionDic.AddOrUpdate(Thumb2.name, Thumb2.localRotation); + _originQuaternionDic.AddOrUpdate(Thumb3.name, Thumb3.localRotation); + + _originQuaternionDic.AddOrUpdate(Index1.name, Index1.localRotation); + _originQuaternionDic.AddOrUpdate(Index2.name, Index2.localRotation); + _originQuaternionDic.AddOrUpdate(Index3.name, Index3.localRotation); + + _originQuaternionDic.AddOrUpdate(Middle1.name, Middle1.localRotation); + _originQuaternionDic.AddOrUpdate(Middle2.name, Middle2.localRotation); + _originQuaternionDic.AddOrUpdate(Middle3.name, Middle3.localRotation); + + _originQuaternionDic.AddOrUpdate(Ring1.name, Ring1.localRotation); + _originQuaternionDic.AddOrUpdate(Ring2.name, Ring2.localRotation); + _originQuaternionDic.AddOrUpdate(Ring3.name, Ring3.localRotation); + + _originQuaternionDic.AddOrUpdate(Pinky1.name, Pinky1.localRotation); + _originQuaternionDic.AddOrUpdate(Pinky2.name, Pinky2.localRotation); + _originQuaternionDic.AddOrUpdate(Pinky3.name, Pinky3.localRotation); + + _originQuaternionDic.AddOrUpdate(Wrist.name, Wrist.localRotation); + } + + private void Rotate(Transform tran, float angle, Axis angleType) + { + if (!NeedRealTransfrom) return; + + float angleX = 0; + float angleY = 0; + float angleZ = 0; + + switch (angleType) + { + case Axis.x_n: + angleX = -angle; + break; + case Axis.y_n: + angleY = -angle; + break; + case Axis.z_n: + angleZ = -angle; + break; + case Axis.x: + angleX = angle; + break; + case Axis.y: + angleY = angle; + break; + case Axis.z: + angleZ = angle; + break; + } + + tran.Rotate(angleX, angleY, angleZ); + } + + private Vector3 ConvertAngleToVec3(Vector3 current, float angle, Axis angleType) + { + float angleX = 0; + float angleY = 0; + float angleZ = 0; + + switch (angleType) + { + case Axis.x_n: + angleX = -angle; + break; + case Axis.y_n: + angleY = -angle; + break; + case Axis.z_n: + angleZ = -angle; + break; + case Axis.x: + angleX = angle; + break; + case Axis.y: + angleY = angle; + break; + case Axis.z: + angleZ = angle; + break; + } + + return current + new Vector3(angleX, angleY, angleZ); + } + + private void ResetRotation(Transform trans) + { + if (_originQuaternionDic.TryGetValue(trans.name, out Quaternion rot)) + { + trans.localRotation = rot; + } + } + + public void GetVec3Value(Vector3[] value) + { + thumb1 = value[0]; + thumb2 = value[1]; + thumb3 = value[2]; + + index1 = value[3]; + index2 = value[4]; + index3 = value[5]; + + middle1 = value[6]; + middle2 = value[7]; + middle3 = value[8]; + + ring1 = value[9]; + ring2 = value[10]; + ring3 = value[11]; + + pinky1 = value[12]; + pinky2 = value[13]; + pinky3 = value[14]; + } + + // Update is called once per frame + void Update() + { + if (UsingNetwork || UsingAndroidService) + { + UpdateThumb(); + UpdateIndex(); + UpdateMiddle(); + UpdateRing(); + UpdatePinky(); + + UpdateWrist(); + UpdateController(); + } + } + + private void UpdateWrist() + { + if (HasIMU) + { + if (Hand == HandType.Left) + { + Quaternion quat_r = new Quaternion( + Network.Convert2Angle(CharacterName, "l26"),//x + Network.Convert2Angle(CharacterName, "l25"),//y + Network.Convert2Angle(CharacterName, "l27"),//z + Network.Convert2Angle(CharacterName, "l24"));//w + ResetRotation(Wrist); + quat_r = ConvertQuaternion(quat_r); + Wrist.rotation = quat_r; + } + else + { + Quaternion quat_r = new Quaternion(Network.Convert2Angle(CharacterName, "r26"), + Network.Convert2Angle(CharacterName, "r25"), + Network.Convert2Angle(CharacterName, "r27"), Network.Convert2Angle(CharacterName, "r24")); + ResetRotation(Wrist); + quat_r = ConvertQuaternion(quat_r); + Wrist.rotation = quat_r; + } + } + } + + private void UpdateController() + { + if (Hand == HandType.Left) + { + Joy_X = Network.Convert2Angle(CharacterName, "l_joyX"); + Joy_Y = Network.Convert2Angle(CharacterName, "l_joyY"); + Button_A = Network.Convert2Bool(CharacterName, "l_aButton"); + Button_B = Network.Convert2Bool(CharacterName, "l_bButton"); + Button_Joystick = Network.Convert2Bool(CharacterName, "l_joyButton"); + Button_Menu = Network.Convert2Bool(CharacterName, "l_menu"); + inputData.joyX = Joy_X; + inputData.joyY = Joy_Y; + inputData.aButton = Button_A; + inputData.bButton = Button_B; + inputData.joyButton = Button_Joystick; + inputData.menu = Button_Menu; + } + else + { + Joy_X = Network.Convert2Angle(CharacterName, "r_joyX"); + Joy_Y = Network.Convert2Angle(CharacterName, "r_joyY"); + Button_A = Network.Convert2Bool(CharacterName, "r_aButton"); + Button_B = Network.Convert2Bool(CharacterName, "r_bButton"); + Button_Joystick = Network.Convert2Bool(CharacterName, "r_joyButton"); + Button_Menu = Network.Convert2Bool(CharacterName, "r_menu"); + inputData.joyX = Joy_X; + inputData.joyY = Joy_Y; + inputData.aButton = Button_A; + inputData.bButton = Button_B; + inputData.joyButton = Button_Joystick; + inputData.menu = Button_Menu; + } + } + + //z轴朝上的右手坐标系 四元数 转换为 Y轴朝上的左手坐标系 四元数 + private Quaternion ConvertQuaternion(Quaternion quat) + { + Quaternion quat_r = new Quaternion(quat.x, quat.y, quat.z, quat.w); + quat_r = Quaternion.Euler(quat_r.eulerAngles.z, -quat_r.eulerAngles.x, quat_r.eulerAngles.y); + return quat_r; + } + + private void UpdateThumb() + { + if (NeedRealTransfrom) + { + ResetRotation(Thumb1); + ResetRotation(Thumb2); + ResetRotation(Thumb3); + } + if (Hand == HandType.Left) + { + var thumb3Pitch = Network.Convert2Angle(CharacterName, "l0"); + var thumb2Pitch = Network.Convert2Angle(CharacterName, "l1"); + var thumb1Pitch = Network.Convert2Angle(CharacterName, "l2") * coefficient + Thumb1Offset.y; + var thumb1Yaw = Network.Convert2Angle(CharacterName, "l3") + Thumb1Offset.z; + var thumb1Roll = Network.Convert2Angle(CharacterName, "l20") + Thumb1Offset.x; + + thumb3 = ConvertAngleToVec3(Vector3.zero, thumb3Pitch, Pitch); + thumb2 = ConvertAngleToVec3(Vector3.zero, thumb2Pitch, Pitch); + thumb1 = ConvertAngleToVec3(Vector3.zero, thumb1Pitch, Pitch); + thumb1 = ConvertAngleToVec3(thumb1, thumb1Yaw, Yaw); + thumb1 = ConvertAngleToVec3(thumb1, thumb1Roll, Roll); + + Rotate(Thumb3, thumb3Pitch, Pitch); + Rotate(Thumb2, thumb2Pitch, Pitch); + Rotate(Thumb1, thumb1Pitch, Pitch); + Rotate(Thumb1, thumb1Yaw, Yaw); + Rotate(Thumb1, thumb1Roll, Roll); + } + else + { + + var thumb3Pitch = Network.Convert2Angle(CharacterName, "r0"); + var thumb2Pitch = Network.Convert2Angle(CharacterName, "r1"); + var thumb1Pitch = Network.Convert2Angle(CharacterName, "r2") * coefficient + Thumb1Offset.y; + var thumb1Yaw = Network.Convert2Angle(CharacterName, "r3") + Thumb1Offset.z; + var thumb1Roll = Network.Convert2Angle(CharacterName, "r20") + Thumb1Offset.x; + + thumb3 = ConvertAngleToVec3(Vector3.zero, thumb3Pitch, Pitch); + thumb2 = ConvertAngleToVec3(Vector3.zero, thumb2Pitch, Pitch); + thumb1 = ConvertAngleToVec3(Vector3.zero, thumb1Pitch, Pitch); + thumb1 = ConvertAngleToVec3(thumb1, thumb1Yaw, Yaw); + thumb1 = ConvertAngleToVec3(thumb1, thumb1Roll, Roll); + + Rotate(Thumb3, thumb3Pitch, Pitch); + Rotate(Thumb2, thumb2Pitch, Pitch); + Rotate(Thumb1, thumb1Pitch, Pitch); + Rotate(Thumb1, thumb1Yaw, Yaw); + Rotate(Thumb1, thumb1Roll, Roll); + } + } + + private void UpdateIndex() + { + if (NeedRealTransfrom) + { + ResetRotation(Index1); + ResetRotation(Index2); + ResetRotation(Index3); + } + if (Hand == HandType.Left) + { + var index3Pitch = Network.Convert2Angle(CharacterName, "l4"); + var index2Pitch = Network.Convert2Angle(CharacterName, "l5"); + var index1Pitch = Network.Convert2Angle(CharacterName, "l6"); + var index1Yaw = Network.Convert2Angle(CharacterName, "l7"); + var index1Roll = Network.Convert2Angle(CharacterName, "l21"); + + index3 = ConvertAngleToVec3(Vector3.zero, index3Pitch, Pitch); + index2 = ConvertAngleToVec3(Vector3.zero, index2Pitch, Pitch); + index1 = ConvertAngleToVec3(Vector3.zero, index1Pitch, Pitch); + index1 = ConvertAngleToVec3(index1, index1Yaw, Yaw); + index1 = ConvertAngleToVec3(index1, index1Roll, Roll); + + Rotate(Index3, index3Pitch, Pitch); + Rotate(Index2, index2Pitch, Pitch); + Rotate(Index1, index1Pitch, Pitch); + Rotate(Index1, index1Yaw, Yaw); + Rotate(Index1, index1Roll, Roll); + } + else + { + var index3Pitch = Network.Convert2Angle(CharacterName, "r4"); + var index2Pitch = Network.Convert2Angle(CharacterName, "r5"); + var index1Pitch = Network.Convert2Angle(CharacterName, "r6"); + var index1Yaw = Network.Convert2Angle(CharacterName, "r7"); + var index1Roll = Network.Convert2Angle(CharacterName, "r21"); + + index3 = ConvertAngleToVec3(Vector3.zero, index3Pitch, Pitch); + index2 = ConvertAngleToVec3(Vector3.zero, index2Pitch, Pitch); + index1 = ConvertAngleToVec3(Vector3.zero, index1Pitch, Pitch); + index1 = ConvertAngleToVec3(index1, index1Yaw, Yaw); + index1 = ConvertAngleToVec3(index1, index1Roll, Roll); + + Rotate(Index3, index3Pitch, Pitch); + Rotate(Index2, index2Pitch, Pitch); + Rotate(Index1, index1Pitch, Pitch); + Rotate(Index1, index1Yaw, Yaw); + Rotate(Index1, index1Roll, Roll); + } + } + + private void UpdateMiddle() + { + if (NeedRealTransfrom) + { + ResetRotation(Middle1); + ResetRotation(Middle2); + ResetRotation(Middle3); + } + if (Hand == HandType.Left) + { + var middle3Pitch = Network.Convert2Angle(CharacterName, "l8"); + var middle2Pitch = Network.Convert2Angle(CharacterName, "l9"); + var middle1Pitch = Network.Convert2Angle(CharacterName, "l10"); + var middle1Yaw = Network.Convert2Angle(CharacterName, "l11"); + + middle3 = ConvertAngleToVec3(Vector3.zero, middle3Pitch, Pitch); + middle2 = ConvertAngleToVec3(Vector3.zero, middle2Pitch, Pitch); + middle1 = ConvertAngleToVec3(Vector3.zero, middle1Pitch, Pitch); + middle1 = ConvertAngleToVec3(middle1, middle1Yaw, Yaw); + + Rotate(Middle3, middle3Pitch, Pitch); + Rotate(Middle2, middle2Pitch, Pitch); + Rotate(Middle1, middle1Pitch, Pitch); + Rotate(Middle1, middle1Yaw, Yaw); + } + else + { + var middle3Pitch = Network.Convert2Angle(CharacterName, "r8"); + var middle2Pitch = Network.Convert2Angle(CharacterName, "r9"); + var middle1Pitch = Network.Convert2Angle(CharacterName, "r10"); + var middle1Yaw = Network.Convert2Angle(CharacterName, "r11"); + + middle3 = ConvertAngleToVec3(Vector3.zero, middle3Pitch, Pitch); + middle2 = ConvertAngleToVec3(Vector3.zero, middle2Pitch, Pitch); + middle1 = ConvertAngleToVec3(Vector3.zero, middle1Pitch, Pitch); + middle1 = ConvertAngleToVec3(middle1, middle1Yaw, Yaw); + + Rotate(Middle3, middle3Pitch, Pitch); + Rotate(Middle2, middle2Pitch, Pitch); + Rotate(Middle1, middle1Pitch, Pitch); + Rotate(Middle1, middle1Yaw, Yaw); + } + } + + private void UpdateRing() + { + if (NeedRealTransfrom) + { + ResetRotation(Ring1); + ResetRotation(Ring2); + ResetRotation(Ring3); + } + if (Hand == HandType.Left) + { + var ring3Pitch = Network.Convert2Angle(CharacterName, "l12"); + var ring2Pitch = Network.Convert2Angle(CharacterName, "l13"); + var ring1Pitch = Network.Convert2Angle(CharacterName, "l14"); + var ring1Yaw = Network.Convert2Angle(CharacterName, "l15"); + + ring3 = ConvertAngleToVec3(Vector3.zero, ring3Pitch, Pitch); + ring2 = ConvertAngleToVec3(Vector3.zero, ring2Pitch, Pitch); + ring1 = ConvertAngleToVec3(Vector3.zero, ring1Pitch, Pitch); + ring1 = ConvertAngleToVec3(ring1, ring1Yaw, Yaw); + + Rotate(Ring3, ring3Pitch, Pitch); + Rotate(Ring2, ring2Pitch, Pitch); + Rotate(Ring1, ring1Pitch, Pitch); + Rotate(Ring1, ring1Yaw, Yaw); + } + else + { + var ring3Pitch = Network.Convert2Angle(CharacterName, "r12"); + var ring2Pitch = Network.Convert2Angle(CharacterName, "r13"); + var ring1Pitch = Network.Convert2Angle(CharacterName, "r14"); + var ring1Yaw = Network.Convert2Angle(CharacterName, "r15"); + + ring3 = ConvertAngleToVec3(Vector3.zero, ring3Pitch, Pitch); + ring2 = ConvertAngleToVec3(Vector3.zero, ring2Pitch, Pitch); + ring1 = ConvertAngleToVec3(Vector3.zero, ring1Pitch, Pitch); + ring1 = ConvertAngleToVec3(ring1, ring1Yaw, Yaw); + + Rotate(Ring3, ring3Pitch, Pitch); + Rotate(Ring2, ring2Pitch, Pitch); + Rotate(Ring1, ring1Pitch, Pitch); + Rotate(Ring1, ring1Yaw, Yaw); + } + } + + private void UpdatePinky() + { + if (NeedRealTransfrom) + { + ResetRotation(Pinky1); + ResetRotation(Pinky2); + ResetRotation(Pinky3); + } + if (Hand == HandType.Left) + { + var pinky3Pitch = Network.Convert2Angle(CharacterName, "l16"); + var pinky2Pitch = Network.Convert2Angle(CharacterName, "l17"); + var pinky1Pitch = Network.Convert2Angle(CharacterName, "l18"); + var pinky1Yaw = Network.Convert2Angle(CharacterName, "l19"); + var pinky1Roll = Network.Convert2Angle(CharacterName, "l22"); + + pinky3 = ConvertAngleToVec3(Vector3.zero, pinky3Pitch, Pitch); + pinky2 = ConvertAngleToVec3(Vector3.zero, pinky2Pitch, Pitch); + pinky1 = ConvertAngleToVec3(Vector3.zero, pinky1Pitch, Pitch); + pinky1 = ConvertAngleToVec3(pinky1, pinky1Yaw, Yaw); + pinky1 = ConvertAngleToVec3(pinky1, pinky1Roll, Roll); + + Rotate(Pinky3, pinky3Pitch, Pitch); + Rotate(Pinky2, pinky2Pitch, Pitch); + Rotate(Pinky1, pinky1Pitch, Pitch); + Rotate(Pinky1, pinky1Yaw, Yaw); + Rotate(Pinky1, pinky1Roll, Roll); + } + else + { + var pinky3Pitch = Network.Convert2Angle(CharacterName, "r16"); + var pinky2Pitch = Network.Convert2Angle(CharacterName, "r17"); + var pinky1Pitch = Network.Convert2Angle(CharacterName, "r18"); + var pinky1Yaw = Network.Convert2Angle(CharacterName, "r19"); + var pinky1Roll = Network.Convert2Angle(CharacterName, "r22"); + + pinky3 = ConvertAngleToVec3(Vector3.zero, pinky3Pitch, Pitch); + pinky2 = ConvertAngleToVec3(Vector3.zero, pinky2Pitch, Pitch); + pinky1 = ConvertAngleToVec3(Vector3.zero, pinky1Pitch, Pitch); + pinky1 = ConvertAngleToVec3(pinky1, pinky1Yaw, Yaw); + pinky1 = ConvertAngleToVec3(pinky1, pinky1Roll, Roll); + + Rotate(Pinky3, pinky3Pitch, Pitch); + Rotate(Pinky2, pinky2Pitch, Pitch); + Rotate(Pinky1, pinky1Pitch, Pitch); + Rotate(Pinky1, pinky1Yaw, Yaw); + Rotate(Pinky1, pinky1Roll, Roll); + } + } + + public void ServiceVibrationControl(int VirbatorIndex = 1, int DurationSecond = 20, int Strength = 10) + { + if (Network == null || !UsingAndroidService) return; + + SingleVirbator[] Virbators; + if (Hand == HandType.Left) + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(VirbatorIndex, DurationSecond, Strength), + new SingleVirbator() + }; + vibrationData = new VibrationData(Virbators); + } + else + { + Virbators = new SingleVirbator[2] + { + new SingleVirbator(), + new SingleVirbator(VirbatorIndex, DurationSecond, Strength), + }; + vibrationData = new VibrationData(Virbators); + } + Network.SendVibrationMsg("AndroidService", "127.0.0.1", vibrationData); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/Scripts/HandDriver.cs.meta b/Assets/HandDriverUPM/HandDriver/Scripts/HandDriver.cs.meta new file mode 100644 index 0000000..f4e3eb4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Scripts/HandDriver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff3bfb33faef00d40880dd5952fd19e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs b/Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs new file mode 100644 index 0000000..69d5f99 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs @@ -0,0 +1,35 @@ +//Struct InputData is a struct that contains all of the button, finger, and linear inputs. This is what's sent to the driver via the named pipe. +public struct InputData +{ + + public float joyX; //range: -1 -> 1 + public float joyY; //range: -1 -> 1 + public bool joyButton; + public bool trgButton; + public bool aButton; + public bool bButton; + public bool grab; + //public bool pinch; + public bool menu; + //public bool calibrate; + public bool trackpad_touch; + public float trgValue; //range: 0 -> 1 + + //constructor that uses a 1d array for flexion. + public InputData(float joyX, float joyY, bool joyButton, bool trgButton, + bool aButton, bool bButton, bool grab, bool pinch, bool menu, bool calibrate, float trgValue,bool trackpad_touch) + { + this.joyX = joyX; + this.joyY = joyY; + this.joyButton = joyButton; + this.trgButton = trgButton; + this.aButton = aButton; + this.bButton = bButton; + this.grab = grab; + //this.pinch = pinch; + this.menu = menu; + //this.calibrate = calibrate; + this.trgValue = trgValue; + this.trackpad_touch = trackpad_touch; + } +} diff --git a/Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs.meta b/Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs.meta new file mode 100644 index 0000000..2e5d61d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Scripts/InputData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 704298a683566b5449b0b21443685ded +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Scripts/Network.cs b/Assets/HandDriverUPM/HandDriver/Scripts/Network.cs new file mode 100644 index 0000000..4ea7b45 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Scripts/Network.cs @@ -0,0 +1,207 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Net; +using System.Text; +using TouchSocket.Core; +using TouchSocket.Sockets; +using UnityEngine; + +public class Network : MonoBehaviour +{ + + public int Port = 5555; + + private UdpSession _udpClient; + + private ConcurrentDictionary> _deviceReadMessages; + + private StreamWriter writer; + private string _txtPath; + void Start() + { + _txtPath = Application.dataPath + "stream.data"; + _deviceReadMessages = new ConcurrentDictionary>(); + _udpClient = new UdpSession(); + + _udpClient.Received += ReceiveMsg; + + _udpClient.Setup(new TouchSocketConfig() + .SetBindIPHost(new IPHost(Port)) + .SetUdpDataHandlingAdapter(() => new NormalUdpDataHandlingAdapter())) + .Start(); + + Debug.Log("UDP Client Start!!"); + + } + + + private void WriteIntoTxt(string message) + { + FileInfo file = new FileInfo(_txtPath); + if (!file.Exists) + { + writer = file.CreateText(); + } + else + { + writer = file.AppendText(); + } + + writer.WriteLine(message); + writer.Flush(); + writer.Dispose(); + writer.Close(); + } + + private void ReceiveMsg(EndPoint endpoint, ByteBlock byteblock, IRequestInfo requestinfo) + { + string msg = Encoding.UTF8.GetString(byteblock.Buffer, 0, byteblock.Len); + Debug.Log(msg); + //WriteIntoTxt(msg); + JObject obj = JObject.Parse(msg); + var jps = obj.Properties(); + foreach (var jp in jps) + { + string role_name = jp.Name; + + JToken token = obj.GetValue(role_name); + JArray array = token["Parameter"] as JArray; + ConcurrentDictionary _deviceMsg = new ConcurrentDictionary(); + for (int i = 0; i < array.Count; i++) + { + JObject obj1 = array[i] as JObject; + string key = obj1.GetValue("Name").ToString(); + string value = obj1.GetValue("Value").ToString(); + _deviceMsg.TryAdd(key, value); + } + if (_deviceReadMessages.ContainsKey(role_name)) + { + _deviceReadMessages[role_name] = _deviceMsg; + } + else + { + _deviceReadMessages.TryAdd(role_name, _deviceMsg); + } + + } + //JToken token = obj.GetValue("Device1_"+Port); + //JArray array = token["Parameter"] as JArray; + //for (int i = 0; i < array.Count; i++) + //{ + // JObject obj1 = array[i] as JObject; + // string key = obj1.GetValue("Name").ToString(); + // string value = obj1.GetValue("Value").ToString(); + // _device1ReadMessages.AddOrUpdate(key, value); + //} + + //JToken token2 = obj.GetValue("Device2_"+Port); + //JArray array2 = token2["Parameter"] as JArray; + //for (int i = 0; i < array.Count; i++) + //{ + // JObject obj1 = array2[i] as JObject; + // string key = obj1.GetValue("Name").ToString(); + // string value = obj1.GetValue("Value").ToString(); + // _device2ReadMessages.AddOrUpdate(key, value); + //} + } + + // Update is called once per frame + void Update() + { + + } + + public float Convert2Angle(string role_name, string key) + { + float angle = 0; + if (!string.IsNullOrEmpty(role_name)) + { + if (!_deviceReadMessages.ContainsKey(role_name)) + { + return 0; + } + string str = _deviceReadMessages[role_name][key]; + + if (!string.IsNullOrEmpty(str)) + { + angle = Single.Parse(str); + } + } + return angle; + } + + public bool Convert2Bool(string role_name, string key) + { + bool flag = false; + if (!string.IsNullOrEmpty(role_name)) + { + if (!_deviceReadMessages.ContainsKey(role_name)) + { + return false; + } + string str = _deviceReadMessages[role_name][key]; + + if (!string.IsNullOrEmpty(str)) + { + flag = bool.Parse(str); + } + } + return flag; + } + + public void SendVibrationMsg(string RoleName, string IP, VibrationData data) + { + var json_role = new JObject(); + var json_one = new JObject(); + var parameterArrayLeft = new JArray(); + var parameterArrayRight = new JArray(); + + var _Lpara_active = new JObject(); + _Lpara_active.Add("Name", "Vibrators"); + _Lpara_active.Add("Value", data.Virbators[0].ActiveCommand); + + var _Lpara_duration = new JObject(); + _Lpara_duration.Add("Name", "Duration"); + _Lpara_duration.Add("Value", data.Virbators[0].Duration); + + var _Lpara_amplitude = new JObject(); + _Lpara_amplitude.Add("Name", "Amplitude"); + _Lpara_amplitude.Add("Value", data.Virbators[0].Amplitude); + + parameterArrayLeft.Add(_Lpara_active); + parameterArrayLeft.Add(_Lpara_duration); + parameterArrayLeft.Add(_Lpara_amplitude); + + var _Rpara_active = new JObject(); + _Rpara_active.Add("Name", "Vibrators"); + _Rpara_active.Add("Value", data.Virbators[1].ActiveCommand); + + var _Rpara_duration = new JObject(); + _Rpara_duration.Add("Name", "Duration"); + _Rpara_duration.Add("Value", data.Virbators[1].Duration); + + var _Rpara_amplitude = new JObject(); + _Rpara_amplitude.Add("Name", "Amplitude"); + _Rpara_amplitude.Add("Value", data.Virbators[1].Amplitude); + + parameterArrayRight.Add(_Rpara_active); + parameterArrayRight.Add(_Rpara_duration); + parameterArrayRight.Add(_Rpara_amplitude); + + json_one.Add("LeftHand", parameterArrayLeft); + json_one.Add("RightHand", parameterArrayRight); + json_role.Add(RoleName, json_one); + + Debug.Log(json_role.ToJson()); + _udpClient.Send(new IPEndPoint(IPAddress.Parse(IP), 8920), Encoding.UTF8.GetBytes(json_role.ToJson())); + } + + private void OnDestroy() + { + _udpClient.Received -= ReceiveMsg; + _udpClient.Stop(); + _udpClient.Dispose(); + } +} diff --git a/Assets/HandDriverUPM/HandDriver/Scripts/Network.cs.meta b/Assets/HandDriverUPM/HandDriver/Scripts/Network.cs.meta new file mode 100644 index 0000000..3b9d158 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Scripts/Network.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d694a138ada737547be655b517ff143b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs b/Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs new file mode 100644 index 0000000..ceec53f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs @@ -0,0 +1,33 @@ + +public struct SingleVirbator +{ + public int ActiveCommand; + public int Duration; + public int Amplitude; + + public SingleVirbator(int command = 1, int duration = 0, int amplitude = 4) + { + command = command < 1 ? 1 : command > 3 ? 3 : command; + duration = duration < 0 ? 0 : duration; + amplitude = amplitude < 4 ? 4 : amplitude > 10 ? 10 : amplitude; + + ActiveCommand = command; + Duration = duration; + Amplitude = amplitude; + } +} + +public class VibrationData +{ + public SingleVirbator[] Virbators = new SingleVirbator[2]; + + public VibrationData(SingleVirbator[] virbators) + { + if (virbators.Length != 2) return; + + for (int i = 0; i < virbators.Length; i++) + { + Virbators[i] = virbators[i]; + } + } +} diff --git a/Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs.meta b/Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs.meta new file mode 100644 index 0000000..62d7e9d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/Scripts/VibrationData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1fe0a761cd51ae048b2fd88ac356edf4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd.meta b/Assets/HandDriverUPM/HandDriver/_3rd.meta new file mode 100644 index 0000000..039595d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f94ed6072f4ff6646becdf1839ffe326 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket.meta new file mode 100644 index 0000000..943ab4b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c37048798d5eed44db29842d399ae29d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core.meta new file mode 100644 index 0000000..6690722 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b7db8e71011decc4780329933fb537a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager.meta new file mode 100644 index 0000000..c6a8726 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e1e6048f206b62443a41e15c5c03aef1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs new file mode 100644 index 0000000..aaf3cae --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs @@ -0,0 +1,1309 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; + +namespace TouchSocket.Core +{ + ///

      + /// 字节块流 + /// + [DebuggerDisplay("Len={Len},Pos={Pos},Capacity={Capacity}")] + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public sealed partial class ByteBlock : Stream, IWrite + { + private static float m_ratio = 1.5f; + private readonly bool m_needDis; + private byte[] m_buffer; + private int m_dis = 1; + private bool m_holding; + private long m_length; + private long m_position; + private bool m_using; + + /// + /// 构造函数 + /// + /// + /// + public ByteBlock(int byteSize = 1024 * 64, bool equalSize = false) + { + m_needDis = true; + m_buffer = BytePool.Default.GetByteCore(byteSize, equalSize); + m_using = true; + } + + /// + /// 实例化一个已知内存的对象。且该内存不会被回收。 + /// + /// + public ByteBlock(byte[] bytes) + { + m_buffer = bytes ?? throw new ArgumentNullException(nameof(bytes)); + m_length = bytes.Length; + m_using = true; + } + + /// + /// 扩容增长比,默认为1.5, + /// min:1.5 + /// + public static float Ratio + { + get => m_ratio; + set + { + if (value < 1.5) + { + value = 1.5f; + } + m_ratio = value; + } + } + + /// + /// 字节实例 + /// + public byte[] Buffer => m_buffer; + + /// + /// 仅当内存块可用,且>0时为True。 + /// + public override bool CanRead => m_using && CanReadLen > 0; + + /// + /// 还能读取的长度,计算为的差值。 + /// + public int CanReadLen => Len - Pos; + + /// + /// 还能读取的长度,计算为的差值。 + /// + public long CanReadLength => m_length - m_position; + + /// + /// 支持查找 + /// + public override bool CanSeek => m_using; + + /// + /// 可写入 + /// + public override bool CanWrite => m_using; + + /// + /// 容量 + /// + public int Capacity => m_buffer.Length; + + /// + /// 空闲长度,准确掌握该值,可以避免内存扩展,计算为的差值。 + /// + public int FreeLength => Capacity - Pos; + + /// + /// 表示持续性持有,为True时,Dispose将调用无效。 + /// + public bool Holding => m_holding; + + /// + /// Int真实长度 + /// + public int Len => (int)m_length; + + /// + /// 真实长度 + /// + public override long Length => m_length; + + /// + /// int型流位置 + /// + public int Pos + { + get => (int)m_position; + set => m_position = value; + } + + /// + /// 流位置 + /// + public override long Position + { + get => m_position; + set => m_position = value; + } + + /// + /// 使用状态 + /// + public bool Using => m_using; + + /// + /// 直接完全释放,游离该对象,然后等待GC + /// + public void AbsoluteDispose() + { + if (Interlocked.Decrement(ref m_dis) == 0) + { + Dis(); + } + } + + /// + /// 清空所有内存数据 + /// + /// 内存块已释放 + public void Clear() + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + Array.Clear(m_buffer, 0, m_buffer.Length); + } + + /// + /// 无实际效果 + /// + //IntelligentCoder.AsyncMethodIgnore] + public override void Flush() + { + } + + /// + /// 读取数据,然后递增Pos + /// + /// + /// + /// + /// + /// + public override int Read(byte[] buffer, int offset, int length) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + int len = m_length - m_position > length ? length : CanReadLen; + Array.Copy(m_buffer, m_position, buffer, offset, len); + m_position += len; + return len; + } + + /// + /// 读取数据,然后递增Pos + /// + /// + /// + public int Read(byte[] buffer) + { + return Read(buffer, 0, buffer.Length); + } + + /// + /// 读取数据,然后递增Pos + /// + + /// + /// + /// + public int Read(out byte[] buffer, int length) + { + buffer = new byte[length]; + return Read(buffer, 0, buffer.Length); + } + + /// + /// 从当前流位置读取一个值 + /// + public override int ReadByte() + { + byte value = m_buffer[m_position]; + m_position++; + return value; + } + + /// + /// 将内存块初始化到刚申请的状态。 + /// 仅仅重置属性。 + /// + /// 内存块已释放 + public void Reset() + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + m_position = 0; + m_length = 0; + } + + /// + /// 设置流位置 + /// + /// + /// + /// + /// + public override long Seek(long offset, SeekOrigin origin) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + switch (origin) + { + case SeekOrigin.Begin: + m_position = offset; + break; + + case SeekOrigin.Current: + m_position += offset; + break; + + case SeekOrigin.End: + m_position = m_length + offset; + break; + } + return m_position; + } + + /// + /// 移动游标 + /// + /// + /// + public ByteBlock Seek(int position) + { + Position = position; + return this; + } + + /// + /// 设置游标到末位 + /// + /// + public ByteBlock SeekToEnd() + { + Position = Length; + return this; + } + + /// + /// 设置游标到首位 + /// + /// + public ByteBlock SeekToStart() + { + Position = 0; + return this; + } + + /// + /// 重新设置容量 + /// + /// 新尺寸 + /// 是否保留元数据 + /// + public void SetCapacity(int size, bool retainedData = false) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + byte[] bytes = new byte[size]; + + if (retainedData) + { + Array.Copy(m_buffer, 0, bytes, 0, m_buffer.Length); + } + if (m_needDis) + { + BytePool.Default.Recycle(m_buffer); + } + m_buffer = bytes; + } + + /// + /// 设置持续持有属性,当为True时,调用Dispose会失效,表示该对象将长期持有,直至设置为False。 + /// 当为False时,会自动调用Dispose。 + /// + /// + /// + public void SetHolding(bool holding) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + m_holding = holding; + if (!holding) + { + Dispose(); + } + } + + /// + /// 设置实际长度 + /// + /// + /// + public override void SetLength(long value) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + if (value > m_buffer.Length) + { + throw new Exception("设置值超出容量"); + } + m_length = value; + } + + /// + /// 从指定位置转化到指定长度的有效内存 + /// + /// + /// + /// + public byte[] ToArray(int offset, int length) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + byte[] buffer = new byte[length]; + Array.Copy(m_buffer, offset, buffer, 0, buffer.Length); + return buffer; + } + + /// + /// 转换为有效内存 + /// + /// + public byte[] ToArray() + { + return ToArray(0, Len); + } + + /// + /// 从指定位置转化到有效内存 + /// + + /// + /// + /// + public byte[] ToArray(int offset) + { + return ToArray(offset, Len - offset); + } + + /// + /// 转换为UTF-8字符 + /// + /// + public override string ToString() + { + return ToString(0, Len); + } + + /// + /// 转换为UTF-8字符 + /// + /// 偏移量 + /// 长度 + /// + public string ToString(int offset, int length) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + return Encoding.UTF8.GetString(m_buffer, offset, length); + } + + /// + /// 转换为UTF-8字符 + /// + /// 偏移量 + /// + public string ToString(int offset) + { + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + return Encoding.UTF8.GetString(m_buffer, offset, Len - offset); + } + + /// + /// 写入 + /// + /// + /// + /// + /// + public override void Write(byte[] buffer, int offset, int count) + { + if (count == 0) + { + return; + } + if (!m_using) + { + throw new ObjectDisposedException(GetType().FullName); + } + if (m_buffer.Length - m_position < count) + { + int need = m_buffer.Length + count - ((int)(m_buffer.Length - m_position)); + int lend = m_buffer.Length; + while (need > lend) + { + lend = (int)(lend * m_ratio); + } + SetCapacity(lend, true); + } + Array.Copy(buffer, offset, m_buffer, m_position, count); + m_position += count; + m_length = Math.Max(m_position, m_length); + } + + /// + /// + /// + /// + /// + public void Write(byte[] buffer) + { + Write(buffer, 0, buffer.Length); + } + + /// + /// 释放当前内存到指定内存池 + /// + /// + public void Dispose(BytePool bytePool) + { + if (m_holding) + { + return; + } + + if (m_needDis) + { + if (Interlocked.Decrement(ref m_dis) == 0) + { + GC.SuppressFinalize(this); + bytePool.Recycle(m_buffer); + Dis(); + } + } + } + + /// + /// + /// + /// + protected override sealed void Dispose(bool disposing) + { + if (m_holding) + { + return; + } + + if (m_needDis) + { + if (Interlocked.Decrement(ref m_dis) == 0) + { + GC.SuppressFinalize(this); + BytePool.Default.Recycle(m_buffer); + Dis(); + } + } + + base.Dispose(disposing); + } + + private void Dis() + { + m_holding = false; + m_using = false; + m_position = 0; + m_length = 0; + m_buffer = null; + } + + #region BytesPackage + + /// + /// 从当前流位置读取一个独立的数组包 + /// + public byte[] ReadBytesPackage() + { + byte status = (byte)ReadByte(); + if (status == 0) + { + return null; + } + int length = ReadInt32(); + byte[] data = new byte[length]; + Array.Copy(Buffer, Pos, data, 0, length); + Pos += length; + return data; + } + + /// + /// 尝试获取数据包信息,方便从Buffer操作数据 + /// + /// + /// + /// + public bool TryReadBytesPackageInfo(out int pos, out int len) + { + byte status = (byte)ReadByte(); + if (status == 0) + { + pos = 0; + len = 0; + return false; + } + len = ReadInt32(); + pos = Pos; + return true; + } + + /// + /// 写入一个独立的数组包,值可以为null。 + /// + /// + /// + /// + public ByteBlock WriteBytesPackage(byte[] value, int offset, int length) + { + if (value == null) + { + Write((byte)0); + } + else + { + Write((byte)1); + Write(length); + Write(value, offset, length); + } + return this; + } + + /// + /// 写入一个独立的数组包。值可以为null。 + /// + /// + public ByteBlock WriteBytesPackage(byte[] value) + { + if (value == null) + { + return WriteBytesPackage(value, 0, 0); + } + return WriteBytesPackage(value, 0, value.Length); + } + + #endregion BytesPackage + + #region Int32 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public int ReadInt32(bool? bigEndian = null) + { + int value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToInt32(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToInt32(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToInt32(Buffer, Pos); break; + } + m_position += 4; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(int value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion Int32 + + #region Int16 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public short ReadInt16(bool? bigEndian = null) + { + short value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToInt16(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToInt16(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToInt16(Buffer, Pos); break; + } + Pos += 2; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(short value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion Int16 + + #region Int64 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public long ReadInt64(bool? bigEndian = null) + { + long value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToInt64(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToInt64(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToInt64(Buffer, Pos); break; + } + Pos += 8; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(long value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion Int64 + + #region Boolean + + /// + /// 从当前流位置读取一个值 + /// + public bool ReadBoolean() + { + bool value = TouchSocketBitConverter.Default.ToBoolean(Buffer, Pos); + Pos += 1; + return value; + } + + /// + /// 写入值 + /// + /// + public ByteBlock Write(bool value) + { + Write(TouchSocketBitConverter.Default.GetBytes(value)); + return this; + } + + #endregion Boolean + + #region Byte + + /// + /// 写入值 + /// + /// + /// + public ByteBlock Write(byte value) + { + Write(new byte[] { value }, 0, 1); + return this; + } + + #endregion Byte + + #region String + + /// + /// 从当前流位置读取一个值 + /// + public string ReadString() + { + int len = this.ReadInt32(); + if (len < 0) + { + return null; + } + else + { + string str = Encoding.UTF8.GetString(Buffer, Pos, len); + Pos += len; + return str; + } + } + + /// + /// 写入值。值可以为null,或者空。 + /// 注意:该操作不具备通用性,读取时必须使用ReadString。或者得先做出判断,由默认端序的int32值标识,具体如下: + /// + /// 小于0,表示字符串为null + /// 等于0,表示字符串为"" + /// 大于0,表示字符串在utf-8编码下的字节长度。 + /// + /// + /// + public ByteBlock Write(string value) + { + if (value == null) + { + Write(-1); + } + else + { + byte[] buffer = Encoding.UTF8.GetBytes(value); + Write(buffer.Length); + Write(buffer); + } + return this; + } + + /// + /// 写入值。值必须为有效值。可通用解析。 + /// + /// + /// + public ByteBlock WriteString(string value, Encoding encoding = null) + { + Write((encoding ?? Encoding.UTF8).GetBytes(value)); + return this; + } + + #endregion String + + #region Char + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public char ReadChar(bool? bigEndian = null) + { + char value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToChar(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToChar(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToChar(Buffer, Pos); break; + } + Pos += 2; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(char value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion Char + + #region Double + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public double ReadDouble(bool? bigEndian = null) + { + double value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToDouble(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToDouble(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToDouble(Buffer, Pos); break; + } + Pos += 8; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(double value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion Double + + #region Float + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public float ReadFloat(bool? bigEndian = null) + { + float value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToSingle(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToSingle(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToSingle(Buffer, Pos); break; + } + Pos += 4; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(float value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion Float + + #region UInt16 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ushort ReadUInt16(bool? bigEndian = null) + { + ushort value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToUInt16(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToUInt16(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToUInt16(Buffer, Pos); break; + } + Pos += 2; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(ushort value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion UInt16 + + #region UInt32 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public uint ReadUInt32(bool? bigEndian = null) + { + uint value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToUInt32(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToUInt32(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToUInt32(Buffer, Pos); break; + } + Pos += 4; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(uint value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion UInt32 + + #region UInt64 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ulong ReadUInt64(bool? bigEndian = null) + { + ulong value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToUInt64(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToUInt64(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToUInt64(Buffer, Pos); break; + } + Pos += 8; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ByteBlock Write(ulong value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + return this; + } + + #endregion UInt64 + + #region Null + + /// + /// 从当前流位置读取一个标识值,判断是否为null。 + /// + public bool ReadIsNull() + { + var status = ReadByte(); + if (status == 0) + { + return true; + } + else if (status == 1) + { + return false; + } + else + { + throw new Exception("标识既非Null,也非NotNull,可能是流位置发生了错误。"); + } + } + + /// + /// 判断该值是否为Null,然后写入标识值 + /// + public ByteBlock WriteIsNull(T t) where T : class + { + if (t == null) + { + WriteNull(); + } + else + { + WriteNotNull(); + } + return this; + } + + /// + /// 写入一个标识非Null值 + /// + public ByteBlock WriteNotNull() + { + Write((byte)1); + return this; + } + + /// + /// 写入一个标识Null值 + /// + public ByteBlock WriteNull() + { + Write((byte)0); + return this; + } + + #endregion Null + + #region Package + + /// + /// 读取一个指定类型的包 + /// + /// + /// + public TPackage ReadPackage() where TPackage : class, IPackage, new() + { + if (ReadIsNull()) + { + return default; + } + else + { + TPackage package = new TPackage(); + package.Unpackage(this); + return package; + } + } + + /// + /// 以包进行写入。允许null值。 + /// 读取时调用,解包。或者先判断,然后自行解包。 + /// + /// + /// + /// + public ByteBlock WritePackage(TPackage package) where TPackage : class, IPackage + { + WriteIsNull(package); + if (package != null) + { + package.Package(this); + } + + return this; + } + + #endregion Package + + #region DateTime + + /// + /// 从当前流位置读取一个值 + /// + public DateTime ReadDateTime() + { + long value = TouchSocketBitConverter.Default.ToInt64(Buffer, Pos); + Pos += 8; + return DateTime.FromBinary(value); + } + + /// + /// 写入值 + /// + /// + public ByteBlock Write(DateTime value) + { + Write(TouchSocketBitConverter.Default.GetBytes(value.ToBinary())); + return this; + } + + #endregion DateTime + + #region TimeSpan + + /// + /// 从当前流位置读取一个值 + /// + public TimeSpan ReadTimeSpan() + { + long value = TouchSocketBitConverter.Default.ToInt64(Buffer, Pos); + Pos += 8; + return TimeSpan.FromTicks(value); + } + + /// + /// 写入值 + /// + /// + public ByteBlock Write(TimeSpan value) + { + Write(TouchSocketBitConverter.Default.GetBytes(value.Ticks)); + return this; + } + + #endregion TimeSpan + + #region Object + + /// + /// 从当前流位置读取一个泛型值 + /// + /// + /// + /// + public T ReadObject(SerializationType serializationType = SerializationType.FastBinary) + { + int length = ReadInt32(); + + if (length == 0) + { + return default; + } + + T obj; + + switch (serializationType) + { + case SerializationType.FastBinary: + { + obj = SerializeConvert.FastBinaryDeserialize(Buffer, Pos); + } + break; + + case SerializationType.Json: + { + string jsonString = Encoding.UTF8.GetString(Buffer, Pos, length); + obj = SerializeConvert.JsonDeserializeFromString(jsonString); + } + break; + + case SerializationType.Xml: + { + string jsonString = Encoding.UTF8.GetString(Buffer, Pos, length); + obj = SerializeConvert.XmlDeserializeFromString(jsonString); + } + break; + + case SerializationType.SystemBinary: + { + obj = SerializeConvert.BinaryDeserialize(Buffer, Pos, length); + } + break; + + default: + throw new Exception("未定义的序列化类型"); + } + + Pos += length; + return obj; + } + + /// + /// 写入值 + /// + /// + /// + public ByteBlock WriteObject(object value, SerializationType serializationType = SerializationType.FastBinary) + { + if (value == null) + { + Write(0); + return this; + } + byte[] data; + switch (serializationType) + { + case SerializationType.FastBinary: + { + data = SerializeConvert.FastBinarySerialize(value); + } + break; + + case SerializationType.Json: + { + data = SerializeConvert.JsonSerializeToBytes(value); + } + break; + + case SerializationType.Xml: + { + data = Encoding.UTF8.GetBytes(SerializeConvert.XmlSerializeToString(value)); + } + break; + + case SerializationType.SystemBinary: + { + data = SerializeConvert.BinarySerialize(value); + } + break; + + default: + throw new Exception("未定义的序列化类型"); + } + + Write(data.Length); + Write(data); + return this; + } + + #endregion Object + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs.meta new file mode 100644 index 0000000..0f404a0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ByteBlock.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54ff10f3a2b47fe439f12a9a7f84c22d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs new file mode 100644 index 0000000..76783d2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs @@ -0,0 +1,438 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 内存池 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial class BytePool + { + private readonly ConcurrentDictionary bytesDictionary = new ConcurrentDictionary(); + private readonly Timer m_timer; + private long m_fullSize; + private long m_maxSize; + + static BytePool() + { + Default = new BytePool(); + } + + /// + /// 内存池 + /// + public BytePool() + { + m_timer = new Timer((o) => + { + Clear(); + }, null, 1000 * 60 * 60, 1000 * 60 * 60); + KeyCapacity = 100; + AutoZero = false; + m_maxSize = 1024 * 1024 * 512; + SetBlockSize(1024, 1024 * 1024 * 20); + AddSizeKey(10240); + } + + /// + /// 默认的内存池实例 + /// + public static BytePool Default { get; } + + /// + /// 回收内存时,自动归零 + /// + public bool AutoZero { get; set; } + + /// + /// 键容量 + /// + public int KeyCapacity { get; set; } + + /// + /// 单个块最大值 + /// + public int MaxBlockSize { get; private set; } + + /// + /// 允许的内存池最大值 + /// + public long MaxSize + { + get => m_maxSize; + set + { + if (value < 1024) + { + value = 1024; + } + m_maxSize = value; + } + } + + /// + /// 单个块最小值 + /// + public int MinBlockSize { get; private set; } + + /// + /// 添加尺寸键 + /// + /// + /// + public bool AddSizeKey(int byteSize) + { + if (bytesDictionary.TryAdd(byteSize, new BytesQueue(byteSize))) + { + return true; + } + return false; + } + + /// + /// 清理 + /// + public void Clear() + { + bytesDictionary.Clear(); + GC.Collect(); + } + + /// + /// 确定是否包含指定尺寸键 + /// + /// + /// + public bool ContainsSizeKey(int byteSize) + { + return bytesDictionary.ContainsKey(byteSize); + } + + /// + /// 获取所以内存键 + /// + /// + public long[] GetAllSizeKeys() + { + return bytesDictionary.Keys.ToArray(); + } + + /// + /// 获取ByteBlock + /// + /// 长度 + /// 要求长度相同 + /// + public ByteBlock GetByteBlock(int byteSize, bool equalSize) + { + return new ByteBlock(byteSize, equalSize); + } + + /// + /// 获取ByteBlock + /// + /// + /// + public ByteBlock GetByteBlock(int byteSize) + { + return new ByteBlock(byteSize, false); + } + + /// + /// 获取内存核心。获取的核心可以不用归还。 + /// 如果要调用归还,切记不要有持久性引用。 + /// + /// + /// + /// + public byte[] GetByteCore(int byteSize, bool equalSize = false) + { + BytesQueue bytesCollection; + if (equalSize) + { + //等长 + if (bytesDictionary.TryGetValue(byteSize, out bytesCollection)) + { + if (bytesCollection.TryGet(out byte[] bytes)) + { + m_fullSize -= byteSize; + return bytes; + } + } + else + { + CheckKeyCapacity(byteSize); + } + return new byte[byteSize]; + } + else + { + //byteSize = HitSize(byteSize); + //byteSize = byteSize; + //搜索已创建集合 + if (bytesDictionary.TryGetValue(byteSize, out bytesCollection)) + { + if (bytesCollection.TryGet(out byte[] bytes)) + { + m_fullSize -= byteSize; + return bytes; + } + } + else + { + CheckKeyCapacity(byteSize); + } + return new byte[byteSize]; + } + } + + /// + /// 获取内存池容量 + /// + /// + public long GetPoolSize() + { + long size = 0; + foreach (var item in bytesDictionary.Values) + { + size += item.FullSize; + } + return size; + } + + /// + /// 获取ValueByteBlock + /// + /// + /// + /// + //[IntelligentCoder.AsyncMethodIgnore] + public ValueByteBlock GetValueByteBlock(int byteSize, bool equalSize) + { + return new ValueByteBlock(byteSize, equalSize); + } + + /// + /// 获取ValueByteBlock + /// + /// + /// + //[IntelligentCoder.AsyncMethodIgnore] + public ValueByteBlock GetValueByteBlock(int byteSize) + { + return new ValueByteBlock(byteSize, false); + } + + /// + /// 回收内存核心。 + /// 注意:回收的内存,必须百分百确定该对象没有再被其他引用。不然这属于危险操作。 + /// + /// + public void Recycle(byte[] bytes) + { + if (bytes == null || bytes.Length > MaxBlockSize || bytes.Length < MinBlockSize) + { + return; + } + if (m_maxSize > m_fullSize) + { + if (bytesDictionary.TryGetValue(bytes.Length, out BytesQueue bytesQueue)) + { + if (AutoZero) + { + Array.Clear(bytes, 0, bytes.Length); + } + m_fullSize += bytes.Length; + bytesQueue.Add(bytes); + } + } + else + { + long size = 0; + foreach (var collection in bytesDictionary.Values) + { + size += collection.FullSize; + } + m_fullSize = size; + } + } + + /// + /// 移除尺寸键 + /// + /// + /// + public bool RemoveSizeKey(int byteSize) + { + if (bytesDictionary.TryRemove(byteSize, out BytesQueue queue)) + { + queue.Clear(); + return true; + } + return false; + } + + /// + /// 设置内存块参数 + /// + /// + /// + public void SetBlockSize(int minBlockSize, int maxBlockSize) + { + this.MaxBlockSize = maxBlockSize; + this.MinBlockSize = minBlockSize; + bytesDictionary.Clear(); + } + + private void CheckKeyCapacity(int byteSize) + { + if (byteSize < MinBlockSize || byteSize > MaxBlockSize) + { + return; + } + if (bytesDictionary.Count < KeyCapacity) + { + bytesDictionary.TryAdd(byteSize, new BytesQueue(byteSize)); + } + else + { + List bytesQueues = bytesDictionary.Values.ToList(); + bytesQueues.Sort((x, y) => { return x.m_referenced > y.m_referenced ? -1 : 1; }); + for (int i = (int)(bytesQueues.Count * 0.2); i < bytesQueues.Count; i++) + { + if (bytesDictionary.TryRemove(bytesQueues[i].m_size, out BytesQueue queue)) + { + queue.Clear(); + } + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private int HitSize(int num) + { + if (num < MinBlockSize) + { + num = MinBlockSize; + } + + if (num <= 10240)//10k + { + return 10240; + } + else if (num <= 65536)//64k + { + return 65536; + } + else if (num <= 102400)//100k + { + return 102400; + } + else if (num <= 524288) //512k + { + return 524288; + } + else if (num <= 1048576)//1Mb + { + return 1048576; + } + else if (num <= 1048576 * 2)//2Mb + { + return 1048576 * 2; + } + else if (num <= 1048576 * 3)//3Mb + { + return 1048576 * 3; + } + else if (num <= 1048576 * 4)//4Mb + { + return 1048576 * 4; + } + else if (num <= 1048576 * 5)//5Mb + { + return 1048576 * 5; + } + else if (num <= 1048576 * 6)//6Mb + { + return 1048576 * 6; + } + else if (num <= 1048576 * 7)//7Mb + { + return 1048576 * 7; + } + else if (num <= 1048576 * 8)//8Mb + { + return 1048576 * 8; + } + else if (num <= 1048576 * 9)//9Mb + { + return 1048576 * 9; + } + else if (num <= 10485760)//10Mb + { + return 10485760; + } + else if (num <= 1024 * 1024 * 12)//12Mb + { + return 1024 * 1024 * 12; + } + else if (num <= 1024 * 1024 * 15)//15Mb + { + return 1024 * 1024 * 15; + } + else if (num <= 1024 * 1024 * 18)//18Mb + { + return 1024 * 1024 * 18; + } + else if (num <= 1024 * 1024 * 20)//20Mb + { + return 1024 * 1024 * 20; + } + else if (num <= 1024 * 1024 * 30)//30Mb + { + return 1024 * 1024 * 30; + } + else if (num <= 1024 * 1024 * 40)//40Mb + { + return 1024 * 1024 * 40; + } + else if (num <= 1024 * 1024 * 50)//50Mb + { + return 1024 * 1024 * 50; + } + else if (num <= 1024 * 1024 * 100)//100Mb + { + return 1024 * 1024 * 100; + } + else if (num <= 1024 * 1024 * 500)//500Mb + { + return 1024 * 1024 * 500; + } + else if (num <= 1024 * 1024 * 1024)//1Gb + { + return 1024 * 1024 * 1024; + } + else + { + return num; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs.meta new file mode 100644 index 0000000..bad3017 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytePool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e198fd391e85af146959f92d37ba5894 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs new file mode 100644 index 0000000..f231f10 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs @@ -0,0 +1,57 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Concurrent; +using System.Diagnostics; + +namespace TouchSocket.Core +{ + /// + /// 字节块集合 + /// + [DebuggerDisplay("Count = {bytesQueue.Count}")] + internal class BytesQueue: ConcurrentStack + { + internal int m_size; + + internal BytesQueue(int size) + { + m_size = size; + } + + /// + /// 占用空间 + /// + public long FullSize => m_size * this.Count; + + internal long m_referenced; + + /// + /// 获取当前实例中的空闲的Block + /// + /// + public bool TryGet(out byte[] bytes) + { + m_referenced++; + return base.TryPop(out bytes); + } + + /// + /// 向当前集合添加Block + /// + /// + public void Add(byte[] bytes) + { + base.Push(bytes); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs.meta new file mode 100644 index 0000000..91106ed --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/BytesQueue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb91b6d0d3153b2418cbb08b593d71db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs new file mode 100644 index 0000000..88e84b8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs @@ -0,0 +1,1249 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 字节块流 + /// + [DebuggerDisplay("Len={Len},Pos={Pos},Capacity={Capacity}")] + public ref partial struct ValueByteBlock + { + private static float m_ratio = 1.5f; + private readonly bool m_needDis; + private byte[] m_buffer; + private int m_dis; + private bool m_holding; + private long m_length; + private long m_position; + private bool m_using; + + /// + /// 构造函数 + /// + /// + /// + public ValueByteBlock(int byteSize = 1024 * 64, bool equalSize = false) + { + m_dis = 1; + m_needDis = true; + m_buffer = BytePool.Default.GetByteCore(byteSize, equalSize); + m_using = true; + m_length = 0; + m_holding = false; + m_position = 0; + } + + /// + /// 实例化一个已知内存的对象。且该内存不会被回收。 + /// + /// + public ValueByteBlock(byte[] bytes) + { + m_dis = 0; + m_needDis = false; + m_buffer = bytes ?? throw new ArgumentNullException(nameof(bytes)); + m_length = bytes.Length; + m_using = true; + m_length = 0; + m_holding = false; + m_position = 0; + } + + /// + /// 扩容增长比,默认为1.5, + /// min:1.5 + /// + public static float Ratio + { + get => m_ratio; + set + { + if (value < 1.5) + { + value = 1.5f; + } + m_ratio = value; + } + } + + /// + /// 字节实例 + /// + public byte[] Buffer => m_buffer; + + /// + /// 仅当内存块可用,且>0时为True。 + /// + public bool CanRead => m_using && CanReadLen > 0; + + /// + /// 还能读取的长度,计算为的差值。 + /// + public int CanReadLen => Len - Pos; + + /// + /// 还能读取的长度,计算为的差值。 + /// + public long CanReadLength => m_length - m_position; + + /// + /// 支持查找 + /// + public bool CanSeek => m_using; + + /// + /// 可写入 + /// + public bool CanWrite => m_using; + + /// + /// 容量 + /// + public int Capacity => m_buffer.Length; + + /// + /// 空闲长度,准确掌握该值,可以避免内存扩展,计算为的差值。 + /// + public int FreeLength => Capacity - Pos; + + /// + /// 表示持续性持有,为True时,Dispose将调用无效。 + /// + public bool Holding => m_holding; + + /// + /// Int真实长度 + /// + public int Len => (int)m_length; + + /// + /// 真实长度 + /// + public long Length => m_length; + + /// + /// int型流位置 + /// + public int Pos + { + get => (int)m_position; + set => m_position = value; + } + + /// + /// 流位置 + /// + public long Position + { + get => m_position; + set => m_position = value; + } + + /// + /// 使用状态 + /// + public bool Using => m_using; + + /// + /// 创建一个来自于内存池的成员。 + /// + /// + /// + /// + public static ValueByteBlock Create(int byteSize = 1024 * 64, bool equalSize = false) + { + return new ValueByteBlock(byteSize, equalSize); + } + + /// + /// 直接完全释放,游离该对象,然后等待GC + /// + public void AbsoluteDispose() + { + if (Interlocked.Decrement(ref m_dis) == 0) + { + Dis(); + } + } + + /// + /// 清空所有内存数据 + /// + /// 内存块已释放 + public void Clear() + { + if (!m_using) + { + throw new ObjectDisposedException(nameof(ValueByteBlock)); + } + Array.Clear(m_buffer, 0, m_buffer.Length); + } + + /// + /// + /// + public void Dispose() + { + if (m_holding) + { + return; + } + + if (m_needDis) + { + if (Interlocked.Decrement(ref m_dis) == 0) + { + BytePool.Default.Recycle(m_buffer); + Dis(); + } + } + } + + /// + /// 释放当前内存到指定内存池 + /// + /// + public void Dispose(BytePool bytePool) + { + if (m_holding) + { + return; + } + + if (m_needDis) + { + if (Interlocked.Decrement(ref m_dis) == 0) + { + bytePool.Recycle(m_buffer); + Dis(); + } + } + } + + /// + /// 读取数据,然后递增Pos + /// + /// + /// + /// + /// + /// + public int Read(byte[] buffer, int offset, int length) + { + if (!m_using) + { + throw new ObjectDisposedException(nameof(ValueByteBlock)); + } + int len = m_length - m_position > length ? length : CanReadLen; + Array.Copy(m_buffer, m_position, buffer, offset, len); + m_position += len; + return len; + } + + /// + /// 读取数据,然后递增Pos + /// + /// + /// + public int Read(byte[] buffer) + { + return Read(buffer, 0, buffer.Length); + } + + /// + /// 读取数据,然后递增Pos + /// + + /// + /// + /// + public int Read(out byte[] buffer, int length) + { + buffer = new byte[length]; + return Read(buffer, 0, buffer.Length); + } + + /// + /// 从当前流位置读取一个值 + /// + public int ReadByte() + { + byte value = m_buffer[m_position]; + m_position++; + return value; + } + + /// + /// 将内存块初始化到刚申请的状态。 + /// 仅仅重置属性。 + /// + /// 内存块已释放 + public void Reset() + { + if (!m_using) + { + throw new ObjectDisposedException(nameof(ValueByteBlock)); + } + m_position = 0; + m_length = 0; + } + + /// + /// 设置流位置 + /// + /// + /// + /// + /// + public long Seek(long offset, SeekOrigin origin) + { + if (!m_using) + { + throw new ObjectDisposedException(nameof(ValueByteBlock)); + } + switch (origin) + { + case SeekOrigin.Begin: + m_position = offset; + break; + + case SeekOrigin.Current: + m_position += offset; + break; + + case SeekOrigin.End: + m_position = m_length + offset; + break; + } + return m_position; + } + + /// + /// 移动游标 + /// + /// + /// + public void Seek(int position) + { + Position = position; + } + + /// + /// 设置游标到末位 + /// + /// + public void SeekToEnd() + { + Position = Length; + } + + /// + /// 设置游标到首位 + /// + /// + public void SeekToStart() + { + Position = 0; + } + + /// + /// 重新设置容量 + /// + /// 新尺寸 + /// 是否保留元数据 + /// + public void SetCapacity(int size, bool retainedData = false) + { + if (!m_using) + { + throw new ObjectDisposedException("ValueByteBlock"); + } + byte[] bytes = new byte[size]; + + if (retainedData) + { + Array.Copy(m_buffer, 0, bytes, 0, m_buffer.Length); + } + if (m_needDis) + { + BytePool.Default.Recycle(m_buffer); + } + m_buffer = bytes; + } + + /// + /// 设置持续持有属性,当为True时,调用Dispose会失效,表示该对象将长期持有,直至设置为False。 + /// 当为False时,会自动调用Dispose。 + /// + /// + /// + public void SetHolding(bool holding) + { + if (!m_using) + { + throw new ObjectDisposedException("ValueByteBlock"); + } + m_holding = holding; + if (!holding) + { + Dispose(); + } + } + + /// + /// 设置实际长度 + /// + /// + /// + public void SetLength(long value) + { + if (!m_using) + { + throw new ObjectDisposedException("ValueByteBlock"); + } + if (value > m_buffer.Length) + { + throw new Exception("设置值超出容量"); + } + m_length = value; + } + + /// + /// 从指定位置转化到指定长度的有效内存 + /// + /// + /// + /// + public byte[] ToArray(int offset, int length) + { + if (!m_using) + { + throw new ObjectDisposedException("ValueByteBlock"); + } + byte[] buffer = new byte[length]; + Array.Copy(m_buffer, offset, buffer, 0, buffer.Length); + return buffer; + } + + /// + /// 转换为有效内存 + /// + /// + public byte[] ToArray() + { + return ToArray(0, Len); + } + + /// + /// 从指定位置转化到有效内存 + /// + /// + /// + /// + public byte[] ToArray(int offset) + { + return ToArray(offset, Len - offset); + } + + /// + /// 转换为UTF-8字符 + /// + /// + public override string ToString() + { + return ToString(0, Len); + } + + /// + /// 转换为UTF-8字符 + /// + /// 偏移量 + /// 长度 + /// + public string ToString(int offset, int length) + { + if (!m_using) + { + throw new ObjectDisposedException("ValueByteBlock"); + } + return Encoding.UTF8.GetString(m_buffer, offset, length); + } + + /// + /// 转换为UTF-8字符 + /// + /// 偏移量 + /// + public string ToString(int offset) + { + if (!m_using) + { + throw new ObjectDisposedException("ValueByteBlock"); + } + return Encoding.UTF8.GetString(m_buffer, offset, Len - offset); + } + + /// + /// 写入 + /// + /// + /// + /// + /// + public void Write(byte[] buffer, int offset, int count) + { + if (count == 0) + { + return; + } + if (!m_using) + { + throw new ObjectDisposedException("ValueByteBlock"); + } + if (m_buffer.Length - m_position < count) + { + int need = m_buffer.Length + count - ((int)(m_buffer.Length - m_position)); + int lend = m_buffer.Length; + while (need > lend) + { + lend = (int)(lend * m_ratio); + } + SetCapacity(lend, true); + } + Array.Copy(buffer, offset, m_buffer, m_position, count); + m_position += count; + m_length = Math.Max(m_position, m_length); + } + + /// + /// + /// + /// + /// + public void Write(byte[] buffer) + { + Write(buffer, 0, buffer.Length); + } + + private void Dis() + { + m_holding = false; + m_using = false; + m_position = 0; + m_length = 0; + m_buffer = null; + } + + #region BytesPackage + + /// + /// 从当前流位置读取一个独立的数组包 + /// + public byte[] ReadBytesPackage() + { + byte status = (byte)ReadByte(); + if (status == 0) + { + return null; + } + int length = ReadInt32(); + byte[] data = new byte[length]; + Array.Copy(Buffer, Pos, data, 0, length); + Pos += length; + return data; + } + + /// + /// 尝试获取数据包信息,方便从Buffer操作数据 + /// + /// + /// + /// + public bool TryReadBytesPackageInfo(out int pos, out int len) + { + byte status = (byte)ReadByte(); + if (status == 0) + { + pos = 0; + len = 0; + return false; + } + len = ReadInt32(); + pos = Pos; + return true; + } + + /// + /// 写入一个独立的数组包,值可以为null。 + /// + /// + /// + /// + public void WriteBytesPackage(byte[] value, int offset, int length) + { + if (value == null) + { + Write((byte)0); + } + else + { + Write((byte)1); + Write(length); + Write(value, offset, length); + } + } + + /// + /// 写入一个独立的数组包。值可以为null。 + /// + /// + public void WriteBytesPackage(byte[] value) + { + if (value == null) + { + WriteBytesPackage(value, 0, 0); + } + WriteBytesPackage(value, 0, value.Length); + } + + #endregion BytesPackage + + #region Int32 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public int ReadInt32(bool? bigEndian = null) + { + int value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToInt32(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToInt32(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToInt32(Buffer, Pos); break; + } + m_position += 4; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(int value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion Int32 + + #region Int16 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public short ReadInt16(bool? bigEndian = null) + { + short value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToInt16(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToInt16(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToInt16(Buffer, Pos); break; + } + Pos += 2; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(short value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion Int16 + + #region Int64 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public long ReadInt64(bool? bigEndian = null) + { + long value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToInt64(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToInt64(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToInt64(Buffer, Pos); break; + } + Pos += 8; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(long value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion Int64 + + #region Boolean + + /// + /// 从当前流位置读取一个值 + /// + public bool ReadBoolean() + { + bool value = TouchSocketBitConverter.Default.ToBoolean(Buffer, Pos); + Pos += 1; + return value; + } + + /// + /// 写入值 + /// + /// + public void Write(bool value) + { + Write(TouchSocketBitConverter.Default.GetBytes(value)); + } + + #endregion Boolean + + #region Byte + + /// + /// 写入值 + /// + /// + /// + public void Write(byte value) + { + Write(new byte[] { value }, 0, 1); + } + + #endregion Byte + + #region String + + /// + /// 从当前流位置读取一个值 + /// + public string ReadString() + { + int len = this.ReadInt32(); + if (len < 0) + { + return null; + } + else + { + string str = Encoding.UTF8.GetString(Buffer, Pos, len); + Pos += len; + return str; + } + } + + /// + /// 写入值。值可以为null,或者空。 + /// 注意:该操作不具备通用性,读取时必须使用ReadString。或者得先做出判断,由默认端序的int32值标识,具体如下: + /// + /// 小于0,表示字符串为null + /// 等于0,表示字符串为"" + /// 大于0,表示字符串在utf-8编码下的字节长度。 + /// + /// + /// + public void Write(string value) + { + if (value == null) + { + Write(-1); + } + else + { + byte[] buffer = Encoding.UTF8.GetBytes(value); + Write(buffer.Length); + Write(buffer); + } + } + + /// + /// 写入值。值必须为有效值。可通用解析。 + /// + /// + /// + public void WriteString(string value, Encoding encoding = null) + { + Write((encoding ?? Encoding.UTF8).GetBytes(value)); + } + + #endregion String + + #region Char + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public char ReadChar(bool? bigEndian = null) + { + char value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToChar(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToChar(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToChar(Buffer, Pos); break; + } + Pos += 2; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(char value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion Char + + #region Double + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public double ReadDouble(bool? bigEndian = null) + { + double value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToDouble(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToDouble(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToDouble(Buffer, Pos); break; + } + Pos += 8; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(double value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion Double + + #region Float + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public float ReadFloat(bool? bigEndian = null) + { + float value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToSingle(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToSingle(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToSingle(Buffer, Pos); break; + } + Pos += 4; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(float value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion Float + + #region UInt16 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ushort ReadUInt16(bool? bigEndian = null) + { + ushort value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToUInt16(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToUInt16(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToUInt16(Buffer, Pos); break; + } + Pos += 2; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(ushort value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion UInt16 + + #region UInt32 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public uint ReadUInt32(bool? bigEndian = null) + { + uint value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToUInt32(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToUInt32(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToUInt32(Buffer, Pos); break; + } + Pos += 4; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(uint value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion UInt32 + + #region UInt64 + + /// + /// 从当前流位置读取一个值 + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public ulong ReadUInt64(bool? bigEndian = null) + { + ulong value; + switch (bigEndian) + { + case true: value = TouchSocketBitConverter.BigEndian.ToUInt64(Buffer, Pos); break; + case false: value = TouchSocketBitConverter.LittleEndian.ToUInt64(Buffer, Pos); break; + default: value = TouchSocketBitConverter.Default.ToUInt64(Buffer, Pos); break; + } + Pos += 8; + return value; + } + + /// + /// 写入值 + /// + /// + /// 是否为指定大端编码。允许true(大端),false(小端),null(默认端序)三种赋值。默认为null。 + public void Write(ulong value, bool? bigEndian = null) + { + switch (bigEndian) + { + case true: Write(TouchSocketBitConverter.BigEndian.GetBytes(value)); break; + case false: Write(TouchSocketBitConverter.LittleEndian.GetBytes(value)); break; + default: Write(TouchSocketBitConverter.Default.GetBytes(value)); break; + } + } + + #endregion UInt64 + + #region Null + + /// + /// 从当前流位置读取一个标识值,判断是否为null。 + /// + public bool ReadIsNull() + { + var status = ReadByte(); + if (status == 0) + { + return true; + } + else if (status == 1) + { + return false; + } + else + { + throw new Exception("标识既非Null,也非NotNull,可能是流位置发生了错误。"); + } + } + + /// + /// 判断该值是否为Null,然后写入标识值 + /// + public void WriteIsNull(T t) where T : class + { + if (t == null) + { + WriteNull(); + } + else + { + WriteNotNull(); + } + } + + /// + /// 写入一个标识非Null值 + /// + public void WriteNotNull() + { + Write((byte)1); + } + + /// + /// 写入一个标识Null值 + /// + public void WriteNull() + { + Write((byte)0); + } + + #endregion Null + + #region DateTime + + /// + /// 从当前流位置读取一个值 + /// + public DateTime ReadDateTime() + { + long value = TouchSocketBitConverter.Default.ToInt64(Buffer, Pos); + Pos += 8; + return DateTime.FromBinary(value); + } + + /// + /// 写入值 + /// + /// + public void Write(DateTime value) + { + Write(TouchSocketBitConverter.Default.GetBytes(value.ToBinary())); + } + + #endregion DateTime + + #region TimeSpan + + /// + /// 从当前流位置读取一个值 + /// + public TimeSpan ReadTimeSpan() + { + long value = TouchSocketBitConverter.Default.ToInt64(Buffer, Pos); + Pos += 8; + return TimeSpan.FromTicks(value); + } + + /// + /// 写入值 + /// + /// + public void Write(TimeSpan value) + { + Write(TouchSocketBitConverter.Default.GetBytes(value.Ticks)); + } + + #endregion TimeSpan + + #region Object + + /// + /// 从当前流位置读取一个泛型值 + /// + /// + /// + /// + public T ReadObject(SerializationType serializationType = SerializationType.FastBinary) + { + int length = ReadInt32(); + + if (length == 0) + { + return default; + } + + T obj; + + switch (serializationType) + { + case SerializationType.FastBinary: + { + obj = SerializeConvert.FastBinaryDeserialize(Buffer, Pos); + } + break; + + case SerializationType.Json: + { + string jsonString = Encoding.UTF8.GetString(Buffer, Pos, length); + obj = SerializeConvert.JsonDeserializeFromString(jsonString); + } + break; + + case SerializationType.Xml: + { + string jsonString = Encoding.UTF8.GetString(Buffer, Pos, length); + obj = SerializeConvert.XmlDeserializeFromString(jsonString); + } + break; + + case SerializationType.SystemBinary: + { + obj = SerializeConvert.BinaryDeserialize(Buffer, Pos, length); + } + break; + + default: + throw new Exception("未定义的序列化类型"); + } + + Pos += length; + return obj; + } + + /// + /// 写入值 + /// + /// + /// + public void WriteObject(object value, SerializationType serializationType = SerializationType.FastBinary) + { + if (value == null) + { + Write(0); + } + byte[] data; + switch (serializationType) + { + case SerializationType.FastBinary: + { + data = SerializeConvert.FastBinarySerialize(value); + } + break; + + case SerializationType.Json: + { + data = SerializeConvert.JsonSerializeToBytes(value); + } + break; + + case SerializationType.Xml: + { + data = Encoding.UTF8.GetBytes(SerializeConvert.XmlSerializeToString(value)); + } + break; + + case SerializationType.SystemBinary: + { + data = SerializeConvert.BinarySerialize(value); + } + break; + + default: + throw new Exception("未定义的序列化类型"); + } + + Write(data.Length); + Write(data); + } + + #endregion Object + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs.meta new file mode 100644 index 0000000..5a7c577 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/ByteManager/ValueByteBlock.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19414046bb9249f4b9d555defe71fe9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching.meta new file mode 100644 index 0000000..13b9a73 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 23f86139776b6194e819e048e47eb60b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs new file mode 100644 index 0000000..dcb52be --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 缓存实体 + /// + public class CacheEntry : ICacheEntry + { + /// + /// 缓存实体 + /// + /// + public CacheEntry(TKey key) : this(key, default) + { + } + + /// + /// 缓存实体 + /// + public CacheEntry(TKey key, TValue value) + { + UpdateTime = DateTime.Now; + Duration = TimeSpan.FromSeconds(60); + Key = key; + Value = value; + } + + /// + /// 有效区间。如果想长期有效,请使用 + /// + public TimeSpan Duration { get; set; } + + /// + /// 键 + /// + public TKey Key { get; set; } + + /// + /// 更新时间 + /// + public DateTime UpdateTime { get; set; } + + /// + /// 值 + /// + public TValue Value { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs.meta new file mode 100644 index 0000000..88047b7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheEntry.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 663cd719b9c7a4241a188a52bfb5dc8d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs new file mode 100644 index 0000000..123f86b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs @@ -0,0 +1,58 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// CacheExtensions + /// + public static class CacheManagementExtensions + { + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void AddCache(this ICache cacheManagement, TKey key, TValue value, int duration = 60 * 1000) + { + cacheManagement.AddCache(new CacheEntry(key) + { + Value = value, + Duration = TimeSpan.FromMilliseconds(duration) + }); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void SetCache(this ICache cacheManagement, TKey key, TValue value, int duration = 60 * 1000) + { + cacheManagement.SetCache(new CacheEntry(key) + { + Value = value, + Duration = TimeSpan.FromMilliseconds(duration) + }); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs.meta new file mode 100644 index 0000000..39b12f6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/CacheManagementExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9680faf7cadf2594abefdf5ab80d0388 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs new file mode 100644 index 0000000..379e23f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs @@ -0,0 +1,106 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 缓存键值 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial interface ICache + { + /// + /// 添加缓存。当缓存存在时,不会添加成功。 + /// + /// 缓存实体 + /// + bool AddCache(ICacheEntry entity); + + /// + /// 清空所有缓存 + /// + void ClearCache(); + + /// + /// 清空所有缓存 + /// + /// + Task ClearCacheAsync(); + + /// + /// 判断缓存是否存在,且在生命周期内。 + /// + /// + /// + /// + bool ContainsCache(TKey key); + + /// + /// 判断缓存是否存在,且在生命周期内。 + /// + /// + /// + /// + Task ContainsCacheAsync(TKey key); + + /// + /// 设置缓存,不管缓存存不存在,都会添加。 + /// + /// + /// + /// + bool SetCache(ICacheEntry entity); + + /// + /// 设置缓存,不管缓存存不存在,都会添加。 + /// + /// + /// + /// + Task SetCacheAsync(ICacheEntry entity); + + /// + /// 获取指定键的缓存。 + /// + /// 键 + /// + /// + ICacheEntry GetCache(TKey key); + + /// + /// 获取指定键的缓存。 + /// + /// 键 + /// + /// + Task> GetCacheAsync(TKey key); + + /// + /// 移除指定键的缓存。 + /// + /// 键 + /// + /// + bool RemoveCache(TKey key); + + /// + /// 移除指定键的缓存。 + /// + /// 键 + /// + /// + Task RemoveCacheAsync(TKey key); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs.meta new file mode 100644 index 0000000..b520a89 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3054dead237b63e428a357750722f254 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs new file mode 100644 index 0000000..f591697 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 缓存实体接口 + /// + public interface ICacheEntry + { + /// + /// 有效区间。如果想长期有效,请使用 + /// + public TimeSpan Duration { get; } + + /// + /// 更新时间 + /// + public DateTime UpdateTime { get; set; } + } + + /// + /// 缓存实体接口 + /// + public interface ICacheEntry : ICacheEntry + { + /// + /// 键 + /// + public TKey Key { get; } + + /// + /// 值 + /// + public TValue Value { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs.meta new file mode 100644 index 0000000..cc92e20 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/ICacheEntry.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ecbef6cbd2aa5e84e946e3dbe8516d28 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs new file mode 100644 index 0000000..8399612 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs @@ -0,0 +1,319 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 一个简单的内存缓存 + /// + public class MemoryCache : IEnumerable>, ICache + { + private readonly ConcurrentDictionary> m_pairs = new ConcurrentDictionary>(); + private readonly Timer m_timer; + + /// + /// 一个简单的内存缓存 + /// + public MemoryCache() + { + m_timer = new Timer((o) => + { + List list = new List(); + foreach (var item in m_pairs) + { + if (DateTime.Now - item.Value.UpdateTime > item.Value.Duration) + { + list.Add(item.Key); + } + } + foreach (var item in list) + { + OnRemove(item, out _); + } + }, null, 0, 60 * 1000); + } + + /// + /// 当每个元素超时被移除时触发。 + /// + public Action> Remove { get; set; } + + /// + /// + /// + /// + public bool AddCache(ICacheEntry entity) + { + return m_pairs.TryAdd(entity.Key, entity); + } + + /// + /// + /// + /// + /// + public Task AddCacheAsync(ICacheEntry entity) + { + return EasyTask.Run(() => + { + return AddCache(entity); + }); + } + + /// + /// 清空所有缓存 + /// + public void ClearCache() + { + m_pairs.Clear(); + } + + /// + /// + /// + /// + public Task ClearCacheAsync() + { + return EasyTask.Run(() => + { + ClearCache(); + }); + } + + /// + /// + /// + /// + /// + public bool ContainsCache(TKey key) + { + if (m_pairs.TryGetValue(key, out ICacheEntry cache)) + { + if (cache.Duration == TimeSpan.Zero) + { + return true; + } + else + { + if (DateTime.Now - cache.UpdateTime > cache.Duration) + { + OnRemove(key, out _); + return false; + } + else + { + return true; + } + } + } + return false; + } + + /// + /// + /// + /// + /// + public Task ContainsCacheAsync(TKey key) + { + return EasyTask.Run(() => + { + return ContainsCache(key); + }); + } + + /// + /// 获取缓存实体。 + /// + /// + /// + public ICacheEntry GetCache(TKey key) + { + ICacheEntry cache; + if (m_pairs.TryGetValue(key, out cache)) + { + if (cache.Duration == TimeSpan.Zero) + { + return cache; + } + else + { + if (DateTime.Now - cache.UpdateTime > cache.Duration) + { + OnRemove(key, out _); + return default; + } + else + { + return cache; + } + } + } + return default; + } + + /// + /// + /// + /// + /// + public Task> GetCacheAsync(TKey key) + { + return EasyTask.Run(() => + { + return GetCache(key); + }); + } + + /// + /// + /// + /// + public IEnumerator> GetEnumerator() + { + return m_pairs.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// 移除缓存 + /// + /// + /// + /// + public bool RemoveCache(TKey key, out ICacheEntry entity) + { + return OnRemove(key, out entity); + } + + /// + /// 移除缓存 + /// + /// + /// + public bool RemoveCache(TKey key) + { + return OnRemove(key, out _); + } + + /// + /// + /// + /// + /// + public Task RemoveCacheAsync(TKey key) + { + return EasyTask.Run(() => + { + return RemoveCache(key); + }); + } + + /// + /// + /// + /// + /// + public bool SetCache(ICacheEntry entity) + { + m_pairs.AddOrUpdate(entity.Key, entity, (k, v) => + { + return entity; + }); + return true; + } + + /// + /// + /// + /// + /// + public Task SetCacheAsync(ICacheEntry entity) + { + return EasyTask.Run(() => + { + return SetCache(entity); + }); + } + + /// + /// 获取对应的值。 + /// + /// + /// + /// + /// + public bool TryGetValue(TKey key, out TValue value, bool update = false) + { + if (m_pairs.TryGetValue(key, out ICacheEntry cache)) + { + if (cache.Duration == TimeSpan.Zero) + { + if (update) + { + cache.UpdateTime = DateTime.Now; + } + value = cache.Value; + return true; + } + else + { + if (DateTime.Now - cache.UpdateTime > cache.Duration) + { + RemoveCache(key); + value = default; + return false; + } + else + { + if (update) + { + cache.UpdateTime = DateTime.Now; + } + value = (TValue)cache.Value; + return true; + } + } + } + value = default; + return false; + } + + private bool OnRemove(TKey key, out ICacheEntry cache) + { + if (m_pairs.TryRemove(key, out cache)) + { + try + { + Remove?.Invoke(cache); + return true; + } + catch + { + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs.meta new file mode 100644 index 0000000..af5b3e3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Caching/MemoryCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7dfeb47bd7624e747958892b91e6a6e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections.meta new file mode 100644 index 0000000..eab2a29 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c4a241f9e49967944989e3b7c9ee4cf2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent.meta new file mode 100644 index 0000000..860a8d3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d5f7da4939a12db4a91dc35545db7a9b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs new file mode 100644 index 0000000..6ad3fb1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs @@ -0,0 +1,125 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Concurrent; + +namespace TouchSocket.Core +{ + /// + /// 安全双向字典 + /// + public class ConcurrentDoublyDictionary + { + private readonly ConcurrentDictionary m_keyToValue; + private readonly ConcurrentDictionary m_valueToKey; + + /// + /// 构造函数 + /// + public ConcurrentDoublyDictionary() + { + m_keyToValue = new ConcurrentDictionary(); + m_valueToKey = new ConcurrentDictionary(); + } + + /// + /// 由键指向值得集合 + /// + public ConcurrentDictionary KeyToValue => m_keyToValue; + + /// + /// 由值指向键的集合 + /// + public ConcurrentDictionary ValueToKey => m_valueToKey; + + /// + /// 尝试将指定的键和值添加到字典中。 + /// + /// + /// + /// + public bool TryAdd(TKey key, TValue value) + { + if (m_keyToValue.TryAdd(key, value)) + { + if (m_valueToKey.TryAdd(value, key)) + { + return true; + } + else + { + m_keyToValue.TryRemove(key, out _); + return false; + } + } + return false; + } + + /// + /// 由键尝试移除 + /// + /// + /// + /// + public bool TryRemoveFromKey(TKey key, out TValue value) + { + if (m_keyToValue.TryRemove(key, out value)) + { + if (m_valueToKey.TryRemove(value, out _)) + { + return true; + } + } + return false; + } + + /// + /// 由值尝试移除 + /// + /// + /// + /// + public bool TryRemoveFromValue(TValue value, out TKey key) + { + if (m_valueToKey.TryRemove(value, out key)) + { + if (m_keyToValue.TryRemove(key, out _)) + { + return true; + } + } + return false; + } + + /// + /// 由键获取到值 + /// + /// + /// + /// + public bool TryGetFromKey(TKey key, out TValue value) + { + return m_keyToValue.TryGetValue(key, out value); + } + + /// + /// 由值获取到键 + /// + /// + /// + /// + public bool TryGetFromValue(TValue value, out TKey key) + { + return m_valueToKey.TryGetValue(value, out key); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs.meta new file mode 100644 index 0000000..91db76d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentDoublyDictionary.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c3d244f996ca2446ab0fec67556bd84 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs new file mode 100644 index 0000000..7ed58cf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs @@ -0,0 +1,680 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace TouchSocket.Core +{ + /// + /// 线程安全的List,其基本操作和List一致。 + /// + /// + public class ConcurrentList : IList + { + private readonly List m_list; + + /// + /// 构造函数 + /// + /// + public ConcurrentList(IEnumerable collection) + { + m_list = new List(collection); + } + + /// + /// 构造函数 + /// + public ConcurrentList() + { + m_list = new List(); + } + + /// + /// 构造函数 + /// + /// + public ConcurrentList(int capacity) + { + m_list = new List(capacity); + } + + /// + /// 元素数量 + /// + public int Count + { + get + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.Count; + } + } + } + + /// + /// 是否为只读 + /// + public bool IsReadOnly => false; + + /// + /// 获取索引元素 + /// + /// + /// + public T this[int index] + { + get + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list[index]; + } + } + set + { + lock (((ICollection)m_list).SyncRoot) + { + m_list[index] = value; + } + } + } + + /// + /// 添加元素 + /// + /// + public void Add(T item) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Add(item); + } + } + + /// + /// 清空所有元素 + /// + public void Clear() + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Clear(); + } + } + + /// + /// 是否包含某个元素 + /// + /// + /// + public bool Contains(T item) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.Contains(item); + } + } + + /// + /// 复制到 + /// + /// + /// + public void CopyTo(T[] array, int arrayIndex) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.CopyTo(array, arrayIndex); + } + } + + /// + /// 返回迭代器 + /// + /// + public IEnumerator GetEnumerator() + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.ToList().GetEnumerator(); + } + } + + /// + /// 返回迭代器组合 + /// + /// + IEnumerator IEnumerable.GetEnumerator() + { + lock (((ICollection)m_list).SyncRoot) + { + return GetEnumerator(); + } + } + + /// + /// 索引 + /// + /// + /// + public int IndexOf(T item) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.IndexOf(item); + } + } + + /// + /// 插入 + /// + /// + /// + public void Insert(int index, T item) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Insert(index, item); + } + } + + /// + /// 移除元素 + /// + /// + /// + public bool Remove(T item) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.Remove(item); + } + } + + /// + /// 按索引移除 + /// + /// + public void RemoveAt(int index) + { + lock (((ICollection)m_list).SyncRoot) + { + if (index < m_list.Count) + { + m_list.RemoveAt(index); + } + } + } + + /// + /// 获取或设置容量 + /// + public int Capacity + { + get + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.Capacity; + } + } + set + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Capacity = value; + } + } + } + + /// + /// + /// + /// + public void AddRange(IEnumerable collection) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.AddRange(collection); + } + } + + /// + /// + /// + /// + /// + public int BinarySearch(T item) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.BinarySearch(item); + } + } + + /// + /// + /// + /// + /// + /// + public int BinarySearch(T item, IComparer comparer) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.BinarySearch(item, comparer); + } + } + + /// + /// + /// + /// + /// + /// + /// + /// + public int BinarySearch(int index, int count, T item, IComparer comparer) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.BinarySearch(index, count, item, comparer); + } + } + + /// + /// + /// + /// + /// + /// + public List ConvertAll(Converter converter) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.ConvertAll(converter); + } + } + + /// + /// + /// + /// + /// + public T Find(Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.Find(match); + } + } + + /// + /// + /// + /// + /// + public List FindAll(Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindAll(match); + } + } + + /// + /// + /// + /// + /// + /// + /// + public int FindIndex(int startIndex, int count, Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindIndex(startIndex, count, match); + } + } + + /// + /// + /// + /// + /// + /// + public int FindIndex(int startIndex, Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindIndex(startIndex, match); + } + } + + /// + /// + /// + /// + /// + public int FindIndex(Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindIndex(match); + } + } + + /// + /// + /// + /// + /// + public T FindLast(Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindLast(match); + } + } + + /// + /// + /// + /// + /// + /// + /// + public int FindLastIndex(int startIndex, int count, Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindLastIndex(startIndex, count, match); + } + } + + /// + /// + /// + /// + /// + /// + public int FindLastIndex(int startIndex, Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindLastIndex(startIndex, match); + } + } + + /// + /// + /// + /// + /// + public int FindLastIndex(Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.FindLastIndex(match); + } + } + + /// + /// + /// + /// + public void ForEach(Action action) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.ForEach(action); + } + } + + /// + /// + /// + /// + /// + /// + public List GetRange(int index, int count) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.GetRange(index, count); + } + } + + /// + /// + /// + /// + /// + /// + public int IndexOf(T item, int index) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.IndexOf(item, index); + } + } + + /// + /// + /// + /// + /// + /// + /// + public int IndexOf(T item, int index, int count) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.IndexOf(item, index, count); + } + } + + /// + /// + /// + /// + /// + public void InsertRange(int index, IEnumerable collection) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.InsertRange(index, collection); + } + } + + /// + /// + /// + /// + /// + public int LastIndexOf(T item) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.IndexOf(item); + } + } + + /// + /// + /// + /// + /// + /// + public int LastIndexOf(T item, int index) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.LastIndexOf(item, index); + } + } + + /// + /// + /// + /// + /// + /// + /// + public int LastIndexOf(T item, int index, int count) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.LastIndexOf(item, index, count); + } + } + + /// + /// + /// + /// + public void RemoveAll(Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.RemoveAll(match); + } + } + + /// + /// + /// + /// + /// + public void RemoveRange(int index, int count) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.RemoveRange(index, count); + } + } + + /// + /// + /// + public void Reverse() + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Reverse(); + } + } + + /// + /// + /// + /// + /// + public void Reverse(int index, int count) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Reverse(index, count); + } + } + + /// + /// + /// + public void Sort() + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Sort(); + } + } + + /// + /// + /// + /// + public void Sort(Comparison comparison) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Sort(comparison); + } + } + + /// + /// + /// + /// + public void Sort(IComparer comparer) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Sort(comparer); + } + } + + /// + /// + /// + /// + /// + /// + public void Sort(int index, int count, IComparer comparer) + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.Sort(index, count, comparer); + } + } + + /// + /// + /// + /// + public T[] ToArray() + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.ToArray(); + } + } + + /// + /// + /// + public void TrimExcess() + { + lock (((ICollection)m_list).SyncRoot) + { + m_list.TrimExcess(); + } + } + + /// + /// + /// + /// + /// + public bool TrueForAll(Predicate match) + { + lock (((ICollection)m_list).SyncRoot) + { + return m_list.TrueForAll(match); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs.meta new file mode 100644 index 0000000..438b571 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentList.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 673586cb35b70a046985566deb8b8fef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs new file mode 100644 index 0000000..9bf73c9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs @@ -0,0 +1,194 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Concurrent; + +namespace TouchSocket.Core +{ + /// + /// 三元组合 + /// + /// + /// + /// + public readonly struct Ternary + { + /// + /// 三元组合 + /// + /// + /// + /// + public Ternary(TKey1 key1, TKey2 key2, TValue value) + { + Key1 = key1; + Key2 = key2; + Value = value; + } + + /// + /// 首键 + /// + public readonly TKey1 Key1 { get; } + + /// + /// 次键 + /// + public readonly TKey2 Key2 { get; } + + /// + /// 值 + /// + public readonly TValue Value { get; } + } + + /// + /// 线程安全的双键字典 + /// + /// + /// + /// + public class ConcurrentMultiDictionary + { + private readonly ConcurrentDictionary> m_key1ToValue = + new ConcurrentDictionary>(); + + private readonly ConcurrentDictionary> m_key2ToValue = + new ConcurrentDictionary>(); + + /// + /// 元素数量。 + /// + public int Count { get => m_key1ToValue.Count; } + + /// + /// 清空所有元素。 + /// + public void Clear() + { + m_key1ToValue.Clear(); + m_key2ToValue.Clear(); + } + + /// + /// 是否包含指定键。 + /// + /// + /// + public bool ContainsKey(TKey2 key) + { + return m_key2ToValue.ContainsKey(key); + } + + /// + /// 是否包含指定键。 + /// + /// + /// + public bool ContainsKey(TKey1 key) + { + return m_key1ToValue.ContainsKey(key); + } + + /// + /// 尝试添加。 + /// + /// + /// + /// + /// + public bool TryAdd(TKey1 key1, TKey2 key2, TValue value) + { + var ternary = new Ternary(key1, key2, value); + if (m_key1ToValue.TryAdd(key1, ternary) && m_key2ToValue.TryAdd(key2, ternary)) + { + return true; + } + else + { + m_key1ToValue.TryRemove(key1, out _); + m_key2ToValue.TryRemove(key2, out _); + return false; + } + } + + /// + /// 由首键删除 + /// + /// + /// + /// + public bool TryRemove(TKey1 key, out TValue value) + { + if (m_key1ToValue.TryRemove(key, out var ternary)) + { + m_key2ToValue.TryRemove(ternary.Key2, out _); + value = ternary.Value; + return true; + } + value = default; + return false; + } + + /// + /// 由次键删除 + /// + /// + /// + /// + public bool TryRemove(TKey2 key, out TValue value) + { + if (m_key2ToValue.TryRemove(key, out var ternary)) + { + m_key1ToValue.TryRemove(ternary.Key1, out _); + value = ternary.Value; + return true; + } + value = default; + return false; + } + + /// + /// 由首键获取值 + /// + /// + /// + /// + public bool TryGetValue(TKey1 key, out TValue value) + { + if (m_key1ToValue.TryGetValue(key, out var ternary)) + { + value = ternary.Value; + return true; + } + value = default; + return false; + } + + /// + /// 由次键获取值 + /// + /// + /// + /// + public bool TryGetValue(TKey2 key, out TValue value) + { + if (m_key2ToValue.TryGetValue(key, out var ternary)) + { + value = ternary.Value; + return true; + } + value = default; + return false; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs.meta new file mode 100644 index 0000000..a0d60c5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/ConcurrentMultiDictionary.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96aafe28e2306da4bb93c80f1e2b5adb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs new file mode 100644 index 0000000..e86a8bd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Concurrent; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 智能安全队列 + /// + /// + public class IntelligentConcurrentQueue : ConcurrentQueue + { + private int m_count; + + private readonly int m_maxCount; + + /// + /// 构造函数 + /// + /// + public IntelligentConcurrentQueue(int maxCount) + { + m_maxCount = maxCount; + } + + /// + /// 允许的最大长度 + /// + public int MaxCount => m_maxCount; + + /// + /// 长度 + /// + public new int Count => m_count; + + /// + /// 入队 + /// + /// + public new void Enqueue(T item) + { + SpinWait.SpinUntil(Check); + Interlocked.Increment(ref m_count); + base.Enqueue(item); + } + + /// + /// 出队 + /// + /// + /// + public new bool TryDequeue(out T result) + { + if (base.TryDequeue(out result)) + { + Interlocked.Decrement(ref m_count); + return true; + } + return false; + } + + private bool Check() + { + return m_count < m_maxCount; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs.meta new file mode 100644 index 0000000..8817598 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentConcurrentQueue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8e7021efeb05d1a44b90744bce5ce182 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs new file mode 100644 index 0000000..fdf1a1b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs @@ -0,0 +1,233 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 队列数据 + /// + public interface IQueueData + { + /// + /// 数据长度 + /// + int Size { get; } + } + + /// + /// 传输字节 + /// + public class QueueDataBytes : IQueueData + { + /// + /// 构造函数 + /// + /// + /// + /// + public QueueDataBytes(byte[] buffer, int offset, int length) + { + Offset = offset; + Length = length; + Buffer = buffer; + Size = length; + } + + /// + /// 从指定内存创建一个新对象,且内存也为新创建。 + /// + /// + /// + /// + /// + public static QueueDataBytes CreateNew(byte[] buffer, int offset, int length) + { + byte[] buf = new byte[length]; + Array.Copy(buffer, offset, buf, 0, length); + return new QueueDataBytes(buf); + } + + /// + /// 构造函数 + /// + /// + public QueueDataBytes(byte[] buffer) : this(buffer, 0, buffer.Length) + { + } + + /// + /// 数据内存 + /// + public byte[] Buffer { get; } + + /// + /// 长度 + /// + public int Length { get; } + + /// + /// 偏移 + /// + public int Offset { get; } + + /// + /// 尺寸 + /// + public int Size { get; } + } + + /// + /// 智能数据安全队列 + /// + /// + public class IntelligentDataQueue : ConcurrentQueue where T : IQueueData + { + private long m_actualSize; + private bool m_free; + private long m_maxSize; + private Action m_onQueueChanged; + private bool m_overflowWait; + + /// + /// 构造函数 + /// + /// + public IntelligentDataQueue(long maxSize) + { + m_free = true; + m_overflowWait = true; + MaxSize = maxSize; + } + + /// + /// 构造函数 + /// + public IntelligentDataQueue() : this(1024 * 1024 * 10) + { + } + + /// + /// 实际尺寸 + /// + public long ActualSize => m_actualSize; + + /// + /// 是否有空位允许入队 + /// + public bool Free => m_free; + + /// + /// 允许的最大长度 + /// + public long MaxSize + { + get => m_maxSize; + set + { + if (value < 1) + { + value = 1; + } + m_maxSize = value; + } + } + + /// + /// 在队列修改时 + /// + public Action OnQueueChanged + { + get => m_onQueueChanged; + set => m_onQueueChanged = value; + } + + /// + /// 溢出等待 + /// + public bool OverflowWait + { + get => m_overflowWait; + set => m_overflowWait = value; + } + + /// + /// 超时时间。默认1000*30ms; + /// + public int Timeout { get; set; } = 1000 * 30; + + /// + /// 清空队列 + /// + public void Clear(Action onClear) + { + while (base.TryDequeue(out T t)) + { + onClear?.Invoke(t); + } + } + + /// + /// 入队 + /// + /// + public new void Enqueue(T item) + { + lock (this) + { + bool free = m_actualSize < m_maxSize; + if (m_free != free) + { + m_free = free; + m_onQueueChanged?.Invoke(m_free); + } + + if (m_overflowWait) + { + SpinWait.SpinUntil(Check, Timeout); + } + + Interlocked.Add(ref m_actualSize, item.Size); + base.Enqueue(item); + } + } + + /// + /// 出队 + /// + /// + /// + public new bool TryDequeue(out T result) + { + if (base.TryDequeue(out result)) + { + Interlocked.Add(ref m_actualSize, -result.Size); + bool free = m_actualSize < m_maxSize; + if (m_free != free) + { + m_free = free; + m_onQueueChanged?.Invoke(m_free); + } + return true; + } + return false; + } + + private bool Check() + { + return m_actualSize < m_maxSize; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs.meta new file mode 100644 index 0000000..3ad83bd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/IntelligentDataQueue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0247c53477b0b394ca5c24ed020ba16f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs new file mode 100644 index 0000000..8bc3ee2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs @@ -0,0 +1,150 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 触发器队列 + /// + /// + public class TriggerQueue : DisposableObject + { + private readonly ReaderWriterLockSlim m_lockSlim; + private readonly ConcurrentQueue m_queue; + private readonly Timer m_timer; + private volatile bool m_sending; + + /// + /// 触发器队列 + /// + public TriggerQueue() + { + m_lockSlim = new ReaderWriterLockSlim(); + m_queue = new ConcurrentQueue(); + m_timer = new Timer(TimerRun, null, 10, 10); + } + + /// + /// 析构函数 + /// + ~TriggerQueue() + { + Dispose(false); + } + + /// + /// 出队列处理。 + /// + public Action OnDequeue { get; set; } + + /// + /// 发生错误 + /// + public Action OnError { get; set; } + + /// + /// 是否处于发送状态 + /// + public bool Sending + { + get + { + using (new ReadLock(m_lockSlim)) + { + return m_sending; + } + } + + private set + { + using (new WriteLock(m_lockSlim)) + { + m_sending = value; + } + } + } + + /// + /// 发送 + /// + public void Enqueue(T data) + { + m_queue.Enqueue(data); + if (SwitchToRun()) + { + ThreadPool.QueueUserWorkItem(BeginTrigger); + } + } + + /// + /// 释放 + /// + /// + protected override void Dispose(bool disposing) + { + m_timer.SafeDispose(); + m_queue.Clear(); + base.Dispose(disposing); + } + + private void BeginTrigger(object o) + { + while (true) + { + try + { + if (m_queue.TryDequeue(out T data)) + { + OnDequeue?.Invoke(data); + } + else + { + break; + } + } + catch (Exception ex) + { + OnError?.Invoke(ex); + } + } + Sending = false; + } + + private bool SwitchToRun() + { + using (new ReadLock(m_lockSlim)) + { + if (m_sending) + { + return false; + } + else + { + m_sending = true; + return true; + } + } + } + + private void TimerRun(object state) + { + if (SwitchToRun()) + { + BeginTrigger(null); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs.meta new file mode 100644 index 0000000..9766889 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/Concurrent/TriggerQueue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aacbd1d9a5a0feb45bae13256a6a906b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs new file mode 100644 index 0000000..371bd09 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Specialized; +using System.Diagnostics; + +namespace TouchSocket.Core +{ + /// + /// IgnoreCaseNameValueCollection + /// + [DebuggerTypeProxy(typeof(NameValueCollectionDebugView))] + public class IgnoreCaseNameValueCollection : NameValueCollection + { + /// + /// IgnoreCaseNameValueCollection + /// + public IgnoreCaseNameValueCollection() : base(StringComparer.OrdinalIgnoreCase) + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs.meta new file mode 100644 index 0000000..6084ffd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/IgnoreCaseNameValueCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c63f43c6a4d54e5499011ef334467ad1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs new file mode 100644 index 0000000..ebfbeb6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Diagnostics; + +namespace TouchSocket.Core +{ + /// + /// NameValueCollectionDebugView + /// + public class NameValueCollectionDebugView + { + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly NameValueCollection m_nameValue; + + /// + /// NameValueCollectionDebugView + /// + /// + public NameValueCollectionDebugView(NameValueCollection nameValue) + { + m_nameValue = nameValue; + } + + [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] + private Dictionary KV + { + get + { + var dic = new Dictionary(); + foreach (var item in m_nameValue.AllKeys) + { + dic.TryAdd(item, m_nameValue[item]); + } + return dic; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs.meta new file mode 100644 index 0000000..21e6135 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Collections/NameValueCollectionDebugView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 987fdf4e6e637724ea77a76634e1a790 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common.meta new file mode 100644 index 0000000..a64aa14 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fb889b7d313e6284b9f776c89ca01fce +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs new file mode 100644 index 0000000..ac83754 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs @@ -0,0 +1,137 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.IO; + +namespace TouchSocket.Core +{ + /// + /// 运行配置类 + /// + public abstract class AppConfigBase + { + private readonly string m_fullPath; + + /// + /// 构造函数 + /// + /// + public AppConfigBase(string fullPath) + { + if (string.IsNullOrEmpty(fullPath)) + { + throw new ArgumentException($"“{nameof(fullPath)}”不能为 null 或空。", nameof(fullPath)); + } + + m_fullPath = fullPath; + } + + /// + /// 保存配置 + /// + /// + /// + /// + public bool Save(bool overwrite, out string msg) + { + if (overwrite == false && File.Exists(m_fullPath)) + { + msg = null; + return true; + } + try + { + File.WriteAllText(m_fullPath, this.ToJson()); + msg = null; + return true; + } + catch (Exception ex) + { + msg = ex.Message; + return false; + } + } + + /// + /// 加载配置 + /// + /// + /// + public bool Load(out string msg) + { + try + { + if (!File.Exists(m_fullPath)) + { + Save(false, out _); + } + var obj = File.ReadAllText(m_fullPath).FromJson(GetType()); + var ps = GetType().GetProperties(); + + foreach (var item in ps) + { + item.SetValue(this, item.GetValue(obj)); + } + msg = null; + return true; + } + catch (Exception ex) + { + msg = ex.Message; + return false; + } + } + + /// + /// 获取默认配置。 + /// + /// + /// + public static T GetDefault() where T : AppConfigBase, new() + { + Type type = typeof(T); + if (list.TryGetValue(type, out object value)) + { + return (T)value; + } + T _default = ((T)Activator.CreateInstance(typeof(T))); + _default.Load(out _); + list.Add(type, _default); + return _default; + } + + private static readonly Dictionary list = new Dictionary(); + + /// + /// 获取默认配置,每次调用该方法时,都会重新加载配置。 + /// + /// + /// + public static T GetNewDefault() where T : AppConfigBase, new() + { + T _default = ((T)Activator.CreateInstance(typeof(T))); + _default.Load(out _); + if (list.ContainsKey(_default.GetType())) + { + list[_default.GetType()] = _default; + } + else + { + list.Add(_default.GetType(), _default); + } + return _default; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs.meta new file mode 100644 index 0000000..9c7a948 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/AppConfigBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ed702ed827ce43409e18eb8fc27e7e8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs new file mode 100644 index 0000000..139bd56 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// DateExtensions + /// + public static class DateExtensions + { + private static readonly DateTime m_utc_time = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + /// + /// 将时间转为毫秒级别的短整形 + /// + /// + /// + //[MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint ConvertTime(this in DateTime time) + { + return (uint)(Convert.ToInt64(time.Subtract(m_utc_time).TotalMilliseconds) & 0xffffffff); + } + + private static readonly DateTimeOffset m_utc1970 = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); + + /// + /// 将时间转为毫秒级别的短整形 + /// + /// + /// + //[MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint ConvertTime(this in DateTimeOffset time) + { + return (uint)(Convert.ToInt64(time.Subtract(m_utc1970).TotalMilliseconds) & 0xffffffff); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs.meta new file mode 100644 index 0000000..2d6a38a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DateExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48540296bedd2b9429e3e9c67a01ea7c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs new file mode 100644 index 0000000..78723a3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 具有释放的对象。 + /// 并未实现析构函数相关。 + /// + public class DisposableObject : IDisposable + { + /// + /// 判断是否已释放。 + /// + private volatile bool m_disposedValue; + + /// + /// 标识该对象是否已被释放 + /// + public bool DisposedValue { get => m_disposedValue; } + + /// + /// 调用释放,切换释放状态。 + /// + /// + protected virtual void Dispose(bool disposing) + { + m_disposedValue = true; + } + + /// + /// 释放资源 + /// + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs.meta new file mode 100644 index 0000000..bea9891 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/DisposableObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f554ce7c1a71cf7428880cc87acd8929 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum.meta new file mode 100644 index 0000000..b256b36 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b7889a97bcee5e84bbebb6c2b76514b5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs new file mode 100644 index 0000000..51608bc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 大小端类型 + /// + public enum EndianType + { + /// + /// 小端模式 + /// + Little, + + /// + /// 大端模式 + /// + Big + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs.meta new file mode 100644 index 0000000..ca8089f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/EndianType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10c00a81122ee2449bb07b625a8fb1ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs new file mode 100644 index 0000000..c3ebc13 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 结果类型 + /// + public enum ResultCode + { + /// + /// 默认 + /// + Default, + + /// + /// 错误 + /// + Error, + + /// + /// 异常 + /// + Exception, + + /// + /// 成功 + /// + Success, + + /// + /// 失败 + /// + Fail, + + /// + /// 操作超时 + /// + Overtime, + + /// + /// 操作取消 + /// + Canceled + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs.meta new file mode 100644 index 0000000..d0ff41c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Enum/ResultCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c6cd2fbac739ef478c9731e4e3d7454 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs new file mode 100644 index 0000000..04fed76 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs @@ -0,0 +1,112 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 流量控制 + /// + public class FlowGate + { + private readonly Stopwatch m_stopwatch; + + private long m_timeTick; + + private long m_transferLength; + + /// + /// 构造函数 + /// + public FlowGate() + { + m_stopwatch = new Stopwatch(); + } + + /// + /// 最大值 + /// + public long Maximum { get; set; } = long.MaxValue; + + /// + /// 最长休眠周期。默认为5*1000ms. + /// 当设置为5000时,假如设置的=10,而一次递增了100,则理应会休眠10s,但是会休眠5s。反之,如果设置1,则每秒周期都会清空。 + /// + public int MaximumPeriod { get; set; } = 5000; + + /// + /// 检测等待 + /// + public void AddCheckWait(int increment) + { + if (GetNowTick() - m_timeTick > 0) + { + //时间过了一秒 + m_timeTick = FlowGate.GetNowTick(); + m_transferLength = 0; + m_stopwatch.Restart(); + } + else + { + //在这一秒中 + if (Interlocked.Add(ref m_transferLength, increment) > Maximum) + { + //上传饱和 + m_stopwatch.Stop(); + int sleepTime = 1000 - (int)m_stopwatch.ElapsedMilliseconds <= 0 ? 0 : GetBaseNum() - (int)m_stopwatch.ElapsedMilliseconds; + Thread.Sleep(sleepTime); + } + } + } + + /// + /// 检测等待 + /// + /// + /// + public async Task AddCheckWaitAsync(int increment) + { + if (GetNowTick() - m_timeTick > 0) + { + //时间过了一秒 + m_timeTick = FlowGate.GetNowTick(); + m_transferLength = 0; + m_stopwatch.Restart(); + } + else + { + //在这一秒中 + if (Interlocked.Add(ref m_transferLength, increment) > Maximum) + { + //上传饱和 + m_stopwatch.Stop(); + int sleepTime = 1000 - (int)m_stopwatch.ElapsedMilliseconds <= 0 ? 0 : GetBaseNum() - (int)m_stopwatch.ElapsedMilliseconds; + await Task.Delay(sleepTime); + } + } + } + + private static long GetNowTick() + { + return DateTime.Now.Ticks / 10000000; + } + + private int GetBaseNum() + { + return Math.Min((int)((double)m_transferLength / Maximum * 1000), MaximumPeriod); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs.meta new file mode 100644 index 0000000..3bf9eb1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/FlowGate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ff12a1b57c52874d9827f83bc01350e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs new file mode 100644 index 0000000..e62cf11 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 全局环境设置 + /// + public static class GlobalEnvironment + { + /// + /// 优化平台 + /// + public static OptimizedPlatforms OptimizedPlatforms { get; set; } = OptimizedPlatforms.None; + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs.meta new file mode 100644 index 0000000..b4ffcde --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/GlobalEnvironment.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7fbf96b0cdf447d42ac9789d27263955 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs new file mode 100644 index 0000000..b91f03a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// 返回通知接口 + /// + public interface IResult + { + /// + /// 是否成功 + /// + ResultCode ResultCode { get; } + + /// + /// 消息 + /// + string Message { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs.meta new file mode 100644 index 0000000..4df41d6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c6dda961a9316114e8c8d073c5e32267 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs new file mode 100644 index 0000000..d9e3387 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 规范写端口,提供更多扩展 + /// + public interface IWrite + { + /// + /// 写入 + /// + /// + /// + /// + void Write(byte[] buffer, int offset, int length); + + /// + /// 写入 + /// + /// + void Write(byte[] buffer); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs.meta new file mode 100644 index 0000000..acc2ebb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/IWrite.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0fcb41a96551b7047aab8e24c5cd7bf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs new file mode 100644 index 0000000..a7d4545 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 读取锁 + /// + public struct ReadLock : IDisposable + { + private readonly ReaderWriterLockSlim m_locks; + + /// + /// 构造函数 + /// + /// + public ReadLock(ReaderWriterLockSlim locks) + { + m_locks = locks; + m_locks.EnterReadLock(); + } + + /// + /// 释放 + /// + public void Dispose() + { + m_locks.ExitReadLock(); + } + } + + /// + /// 写入锁 + /// + public struct WriteLock : IDisposable + { + private readonly ReaderWriterLockSlim m_locks; + + /// + /// 构造函数 + /// + /// + public WriteLock(ReaderWriterLockSlim locks) + { + m_locks = locks; + m_locks.EnterWriteLock(); + } + + /// + /// 释放 + /// + public void Dispose() + { + m_locks.ExitWriteLock(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs.meta new file mode 100644 index 0000000..be1d167 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Locker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 32062fa43b30c4748bb562c907c8074d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs new file mode 100644 index 0000000..83f2219 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Specialized; + +namespace TouchSocket.Core +{ + /// + /// 元数据键值对。 + /// + [FastConverter(typeof(MetadataFastBinaryConverter))] + public class Metadata : NameValueCollection, IPackage + { + /// + /// 元数据键值对。 + /// + public Metadata() + { + } + + /// + /// 添加。如果键存在,将被覆盖。 + /// + /// + /// + public new Metadata Add(string name, string value) + { + base.Add(name, value); + return this; + } + + /// + /// 打包 + /// + /// + public void Package(ByteBlock byteBlock) + { + byteBlock.Write(Count); + foreach (var item in AllKeys) + { + byteBlock.Write(item); + byteBlock.Write(this[item]); + } + } + + /// + /// 解包 + /// + /// + public void Unpackage(ByteBlock byteBlock) + { + int count = byteBlock.ReadInt32(); + for (int i = 0; i < count; i++) + { + string key = byteBlock.ReadString(); + string value = byteBlock.ReadString(); + Add(key, value); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs.meta new file mode 100644 index 0000000..0a29632 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Metadata.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f12db4dc096b0148b954a76cb5a8453 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs new file mode 100644 index 0000000..622bc1c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs @@ -0,0 +1,43 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// MetadataFastBinaryConverter + /// + internal sealed class MetadataFastBinaryConverter : FastBinaryConverter + { + protected override Metadata Read(byte[] buffer, int offset, int len) + { + ByteBlock byteBlock = new ByteBlock(buffer); + byteBlock.Pos = offset; + Metadata metadata = new Metadata(); + while (byteBlock.Pos < offset + len) + { + metadata.Add(byteBlock.ReadString(), byteBlock.ReadString()); + } + return metadata; + } + + protected override int Write(ByteBlock byteBlock, Metadata obj) + { + int pos = byteBlock.Pos; + foreach (var item in obj.AllKeys) + { + byteBlock.Write(item); + byteBlock.Write(obj[item]); + } + return byteBlock.Pos - pos; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs.meta new file mode 100644 index 0000000..18fc094 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/MetadataFastBinaryConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 09e52d077aabd034b87ae6c6aeabc08e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs new file mode 100644 index 0000000..ae43ab0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 优化平台 + /// + [Flags] + public enum OptimizedPlatforms + { + /// + /// 无特殊优化 + /// + None=0, + + /// + /// 针对Unity2020及以下优化。 + /// 一般来说,当在unity2020及以下版本,中执行il2cpp编译时,需要设置该值。 + /// + Unity = 1 + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs.meta new file mode 100644 index 0000000..5ca3780 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/OptimizedPlatforms.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b8cb16ca24672f4f8e0089982269460 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs new file mode 100644 index 0000000..d805d99 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs @@ -0,0 +1,268 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using TouchSocket.Resources; + +namespace TouchSocket.Core +{ + /// + /// 结果返回 + /// + public struct Result : IResult + { + /// + /// 成功 + /// + public static readonly Result Success = new Result(ResultCode.Success, "Success"); + + /// + /// 初始状态 + /// + public static readonly Result Default = new Result(ResultCode.Default, "Default"); + + /// + /// 未知失败 + /// + public static readonly Result UnknownFail = new Result(ResultCode.Fail, TouchSocketStatus.UnknownError.GetDescription()); + + /// + /// 超时 + /// + public static readonly Result Overtime = new Result(ResultCode.Overtime, TouchSocketStatus.Overtime.GetDescription()); + + /// + /// 取消 + /// + public static readonly Result Canceled = new Result(ResultCode.Canceled, TouchSocketStatus.Canceled.GetDescription()); + + /// + /// 构造函数 + /// + /// + /// + public Result(ResultCode resultCode, string message) + { + ResultCode = resultCode; + Message = message; + } + + /// + /// 构造函数 + /// + /// + public Result(IResult result) + { + ResultCode = result.ResultCode; + Message = result.Message; + } + + /// + /// 构造函数 + /// + /// + public Result(Exception exception) + { + ResultCode = ResultCode.Exception; + Message = exception.Message; + } + + /// + /// 构造函数 + /// + /// + public Result(ResultCode resultCode) + { + ResultCode = resultCode; + Message = resultCode.GetDescription(); + } + + /// + /// + /// + public ResultCode ResultCode { get; private set; } + + /// + /// + /// + public string Message { get; private set; } + + /// + /// 创建来自 + /// + /// + /// + public static Result FromCanceled(string msg) + { + return new Result(ResultCode.Canceled, msg); + } + + /// + /// 创建来自 + /// + /// + /// + public static Result FromError(string msg) + { + return new Result(ResultCode.Error, msg); + } + + /// + /// 创建来自 + /// + /// + /// + public static Result FromException(string msg) + { + return new Result(ResultCode.Exception, msg); + } + + /// + /// 创建来自 + /// + /// + /// + public static Result FromFail(string msg) + { + return new Result(ResultCode.Fail, msg); + } + + /// + /// 创建来自 + /// + /// + /// + public static Result FromOvertime(string msg) + { + return new Result(ResultCode.Overtime, msg); + } + + /// + /// 创建来自 + /// + /// + /// + public static Result FromSuccess(string msg) + { + return new Result(ResultCode.Success, msg); + } + + /// + /// ToString + /// + /// + public override string ToString() + { + return $"类型:{ResultCode},信息:{Message}"; + } + } + + /// + /// 结果返回 + /// + public class ResultBase : IResult + { + /// + /// 构造函数 + /// + /// + /// + public ResultBase(ResultCode resultCode, string message) + { + ResultCode = resultCode; + Message = message; + } + + /// + /// 构造函数 + /// + /// + public ResultBase(ResultCode resultCode) + { + ResultCode = resultCode; + Message = resultCode.GetDescription(); + } + + /// + /// 构造函数 + /// + /// + public ResultBase(Result result) + { + ResultCode = result.ResultCode; + Message = result.Message; + } + + /// + /// 构造函数 + /// + public ResultBase() + { + } + + /// + /// + /// + public ResultCode ResultCode { get; protected set; } + + /// + /// + /// + public string Message { get; protected set; } + + /// + /// ToString + /// + /// + public override string ToString() + { + return $"类型:{ResultCode},信息:{Message}"; + } + } + + /// + /// ResultExtensions + /// + public static class ResultExtensions + { + /// + /// 是否成功。 + /// + /// + /// + public static bool IsSuccess(this IResult result) + { + return result.ResultCode == ResultCode.Success; + } + + /// + /// 是否没有成功。 + /// + /// + /// + public static bool NotSuccess(this IResult result) + { + return result.ResultCode != ResultCode.Success; + } + + /// + /// 转换为 + /// + /// + /// + public static Result ToResult(this IResult result) + { + return new Result(result); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs.meta new file mode 100644 index 0000000..8416426 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/Result.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 742b24f62b34d924295db0b03167f36b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs new file mode 100644 index 0000000..970028d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 雪花ID生成器(该代码来自网络) + /// + public class SnowflakeIDGenerator + { + private const int SequenceBits = 10; + + /// + /// 一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成 + /// + private const long SequenceMask = -1L ^ -1L << SequenceBits; + + private const int TimestampLeftShift = SequenceBits + WorkerIdBits; + + private const int WorkerIdBits = 4; + + //计数器字节数,10个字节用来保存计数码 + private const int WorkerIdShift = SequenceBits; + + private static long Sequence = 0L; + + //机器ID + private static long WorkerId; + + private readonly long Twepoch = 687888001020L; + + private long m_lastTimestamp = -1L; + + static SnowflakeIDGenerator() + { + } + + //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成 + /// + /// 机器码 + /// + /// + public SnowflakeIDGenerator(long workerId) + { + if (workerId > MaxWorkerId || workerId < 0) + throw new Exception(string.Format("worker Id can't be greater than {0} or less than 0 ", MaxWorkerId)); + SnowflakeIDGenerator.WorkerId = workerId; + Twepoch = DateTime.Now.Ticks - 10000; + } + + /// + /// 最大机器ID + /// + public static long MaxWorkerId { get; private set; } = -1L ^ (-1L << WorkerIdBits); //最大机器ID + + //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳 + //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义) + + //机器码数据左移位数,就是后面计数器占用的位数 + //时间戳左移动位数就是机器码和计数器总字节数 + /// + /// 获取ID + /// + /// + public long NextID() + { + lock (this) + { + long timestamp = timeGen(); + if (m_lastTimestamp == timestamp) + { //同一微妙中生成ID + Sequence = (Sequence + 1) & SequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限 + if (Sequence == 0) + { + //一微妙内产生的ID计数已达上限,等待下一微妙 + timestamp = tillNextMillis(m_lastTimestamp); + } + } + else + { //不同微秒生成ID + Sequence = 0; //计数清0 + } + if (timestamp < m_lastTimestamp) + { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过 + throw new Exception(string.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds", + m_lastTimestamp - timestamp)); + } + m_lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳 + long nextId = (timestamp - Twepoch << TimestampLeftShift) | WorkerId << WorkerIdShift | Sequence; + return nextId; + } + } + + /// + /// 获取下一微秒时间戳 + /// + /// + /// + private long tillNextMillis(long lastTimestamp) + { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) + { + timestamp = timeGen(); + } + return timestamp; + } + + /// + /// 生成当前时间戳 + /// + /// + private long timeGen() + { + return Environment.TickCount; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs.meta new file mode 100644 index 0000000..06bee95 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/SnowflakeIDGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a78dd2ca3f724343b888d463ae3e754 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs new file mode 100644 index 0000000..e38ae69 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs @@ -0,0 +1,65 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.ComponentModel; + +namespace TouchSocket.Core +{ + /// + /// 字符串资源字典 + /// + public static class StringResStore + { + private static readonly ConcurrentDictionary m_cache = new ConcurrentDictionary(); + + /// + /// 获取资源字符 + /// + /// + /// + /// + public static string GetDescription(this Enum @enum, params object[] objs) + { + if (m_cache.TryGetValue(@enum, out string str)) + { + if (string.IsNullOrEmpty(str)) + { + return @enum.ToString(); + } + else + { + return str.Format(objs); + } + } + + if (@enum.GetAttribute() is DescriptionAttribute description) + { + string res = description.Description; + m_cache.TryAdd(@enum, res); + if (!string.IsNullOrEmpty(res)) + { + if (objs.Length > 0) + { + return res.Format(objs); + } + else + { + return res; + } + } + } + return @enum.ToString(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs.meta new file mode 100644 index 0000000..7fdfc96 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/StringResStore.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e588c0e64e8f69489b04ae3a0fe93e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs new file mode 100644 index 0000000..030e783 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//using System; +//using System.Collections.Concurrent; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; + +//namespace TouchSocket.Core +//{ +// /// +// /// 异常助手 +// /// +// public static class ThrowHelper +// { +// private static readonly ConcurrentDictionary> m_pairs = +// new ConcurrentDictionary>(); + +// /// +// /// 添加抛出规则。 +// /// +// /// +// /// +// public static void Add(Enum @enum,Func func) +// { +// if (@enum is null) +// { +// throw new ArgumentNullException(nameof(@enum)); +// } + +// if (func is null) +// { +// throw new ArgumentNullException(nameof(func)); +// } + +// m_pairs.TryRemove(@enum,out _); +// m_pairs.TryAdd(@enum,func); +// } + +// public static Exception Throw(Enum @enum,string msg,Exception exception) +// { +// } + +// } +//} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs.meta new file mode 100644 index 0000000..ab6dd5f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/ThrowHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4fddf4d61d7f6f64e8883a8c00dd0f81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs new file mode 100644 index 0000000..7814449 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs @@ -0,0 +1,498 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Runtime.CompilerServices; + +namespace TouchSocket.Core +{ + /// + /// 将基数据类型转换为指定端的一个字节数组, + /// 或将一个字节数组转换为指定端基数据类型。 + /// + public class TouchSocketBitConverter + { + /// + /// 以大端 + /// + public static TouchSocketBitConverter BigEndian; + + /// + /// 以小端 + /// + public static TouchSocketBitConverter LittleEndian; + + static TouchSocketBitConverter() + { + BigEndian = new TouchSocketBitConverter(EndianType.Big); + LittleEndian = new TouchSocketBitConverter(EndianType.Little); + DefaultEndianType = EndianType.Little; + } + + private static TouchSocketBitConverter m_default; + + /// + /// 以默认小端,可通过重新指定默认端。 + /// + public static TouchSocketBitConverter Default => m_default; + + private static EndianType m_defaultEndianType; + + /// + /// 默认大小端切换。 + /// + public static EndianType DefaultEndianType + { + get => m_defaultEndianType; + set + { + m_defaultEndianType = value; + switch (value) + { + case EndianType.Little: + m_default = LittleEndian; + break; + + case EndianType.Big: + m_default = BigEndian; + break; + + default: + break; + } + } + } + + private readonly EndianType endianType; + + /// + /// 构造函数 + /// + /// + public TouchSocketBitConverter(EndianType endianType) + { + this.endianType = endianType; + } + + /// + /// 指定大小端。 + /// + public EndianType EndianType => endianType; + + /// + /// 判断当前系统是否为设置的大小端 + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IsSameOfSet() + { + return !(BitConverter.IsLittleEndian ^ (endianType == EndianType.Little)); + //return true; + } + + #region ushort + + /// + /// 转换为指定端2字节 + /// + /// + /// + public byte[] GetBytes(ushort value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + return bytes; + } + + /// + /// 转换为指定端模式的2字节转换为UInt16数据。 + /// + /// + /// + /// + public ushort ToUInt16(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToUInt16(buffer, offset); + } + else + { + byte[] bytes = new byte[2]; + Array.Copy(buffer, offset, bytes, 0, 2); + Array.Reverse(bytes); + return BitConverter.ToUInt16(bytes, 0); + } + } + + #endregion ushort + + #region ulong + + /// + /// 转换为指定端8字节 + /// + /// + /// + public byte[] GetBytes(ulong value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的Ulong数据。 + /// + /// + /// + /// + public ulong ToUInt64(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToUInt64(buffer, offset); + } + else + { + byte[] bytes = new byte[8]; + Array.Copy(buffer, offset, bytes, 0, 8); + Array.Reverse(bytes); + return BitConverter.ToUInt64(bytes,0); + } + + } + + #endregion ulong + + #region bool + + /// + /// 转换为指定端1字节 + /// + /// + /// + public byte[] GetBytes(bool value) + { + return BitConverter.GetBytes(value); + } + + /// + /// 转换为指定端模式的bool数据。 + /// + /// + /// + /// + public bool ToBoolean(byte[] buffer, int offset) + { + return BitConverter.ToBoolean(buffer, offset); + } + + #endregion bool + + #region char + + /// + /// 转换为指定端2字节 + /// + /// + /// + public byte[] GetBytes(char value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的Char数据。 + /// + /// + /// + /// + public char ToChar(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToChar(buffer, offset); + } + else + { + byte[] bytes = new byte[2]; + Array.Copy(buffer, offset, bytes, 0, bytes.Length); + Array.Reverse(bytes); + return BitConverter.ToChar(bytes, 0); + } + } + + #endregion char + + #region short + + /// + /// 转换为指定端2字节 + /// + /// + /// + public byte[] GetBytes(short value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的Short数据。 + /// + /// + /// + /// + public short ToInt16(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToInt16(buffer, offset); + } + else + { + byte[] bytes = new byte[2]; + Array.Copy(buffer, offset, bytes, 0, bytes.Length); + Array.Reverse(bytes); + return BitConverter.ToInt16(bytes, 0); + } + + } + + #endregion short + + #region int + + /// + /// 转换为指定端4字节 + /// + /// + /// + public byte[] GetBytes(int value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的int数据。 + /// + /// + /// + /// + public int ToInt32(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToInt32(buffer, offset); + } + else + { + byte[] bytes = new byte[4]; + Array.Copy(buffer, offset, bytes, 0, bytes.Length); + Array.Reverse(bytes); + return BitConverter.ToInt32(bytes, 0); + } + } + + #endregion int + + #region long + + /// + /// 转换为指定端8字节 + /// + /// + /// + public byte[] GetBytes(long value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的long数据。 + /// + /// + /// + /// + public long ToInt64(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToInt64(buffer, offset); + } + else + { + byte[] bytes = new byte[8]; + Array.Copy(buffer, offset, bytes, 0, bytes.Length); + Array.Reverse(bytes); + return BitConverter.ToInt64(bytes, 0); + } + + } + + #endregion long + + #region uint + + /// + /// 转换为指定端4字节 + /// + /// + /// + public byte[] GetBytes(uint value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的Uint数据。 + /// + /// + /// + /// + public uint ToUInt32(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToUInt32(buffer, offset); + } + else + { + byte[] bytes = new byte[4]; + Array.Copy(buffer, offset, bytes, 0, bytes.Length); + Array.Reverse(bytes); + return BitConverter.ToUInt32(bytes, 0); + } + } + + #endregion uint + + #region float + + /// + /// 转换为指定端4字节 + /// + /// + /// + public byte[] GetBytes(float value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的float数据。 + /// + /// + /// + /// + public float ToSingle(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToSingle(buffer, offset); + } + else + { + byte[] bytes = new byte[4]; + Array.Copy(buffer, offset, bytes, 0, bytes.Length); + Array.Reverse(bytes); + return BitConverter.ToSingle(bytes, 0); + } + } + + #endregion float + + #region long + + /// + /// 转换为指定端8字节 + /// + /// + /// + public byte[] GetBytes(double value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (!IsSameOfSet()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + /// + /// 转换为指定端模式的double数据。 + /// + /// + /// + /// + public double ToDouble(byte[] buffer, int offset) + { + if (IsSameOfSet()) + { + return BitConverter.ToDouble(buffer, offset); + } + else + { + byte[] bytes = new byte[8]; + Array.Copy(buffer, offset, bytes, 0, bytes.Length); + Array.Reverse(bytes); + return BitConverter.ToDouble(bytes, 0); + } + } + + #endregion long + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs.meta new file mode 100644 index 0000000..f33f98b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketBitConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4673e7b6c600812448d61f975b427f80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs new file mode 100644 index 0000000..c5a7dcf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; + +namespace TouchSocket.Core +{ + /// + /// 常量 + /// + public class TouchSocketCoreUtility + { +#pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 + public static readonly Type stringType = typeof(string); + public static readonly Type byteType = typeof(byte); + public static readonly Type sbyteType = typeof(sbyte); + public static readonly Type shortType = typeof(short); + public static readonly Type objType = typeof(object); + public static readonly Type ushortType = typeof(ushort); + public static readonly Type intType = typeof(int); + public static readonly Type uintType = typeof(uint); + public static readonly Type boolType = typeof(bool); + public static readonly Type charType = typeof(char); + public static readonly Type longType = typeof(long); + public static readonly Type ulongType = typeof(ulong); + public static readonly Type floatType = typeof(float); + public static readonly Type doubleType = typeof(double); + public static readonly Type decimalType = typeof(decimal); + public static readonly Type dateTimeType = typeof(DateTime); + public static readonly Type bytesType = typeof(byte[]); + public static readonly Type dicType = typeof(IDictionary); + public static readonly Type iEnumerableType = typeof(IEnumerable); + public static readonly Type arrayType = typeof(Array); + public static readonly Type listType = typeof(IList); + public static readonly Type nullableType = typeof(Nullable<>); + + public static readonly byte[] ZeroBytes = new byte[0]; +#pragma warning restore CS1591 // 缺少对公共可见类型或成员的 XML 注释 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs.meta new file mode 100644 index 0000000..ada8817 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Common/TouchSocketCoreUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b31641ee563557e40801cd1947b734a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config.meta new file mode 100644 index 0000000..dd2ffca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af2f3ff589084514890ff5b84d539e38 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs new file mode 100644 index 0000000..1653c76 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs @@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 配置文件基类 + /// + public class TouchSocketConfig : DependencyObject + { + //private bool built; + private IContainer m_container; + + private IPluginsManager m_pluginsManager; + + //ConcurrentQueue> actions = new ConcurrentQueue>(); + + ///// + ///// 添加构建委托,该委托会在时调用。 + ///// + ///// + ///// + //public void AddBuildAction(Delegate action,params object[] ps) + //{ + // actions.Enqueue(Tuple.Create(action,ps)) ; + //} + + ///// + ///// 构建配置 + ///// + //public void Build() + //{ + // if (!built) + // { + // built = true; + // while (actions.TryDequeue(out var action)) + // { + // action.Item1.DynamicInvoke(action.Item2); + // } + // } + //} + + /// + /// 构造函数 + /// + public TouchSocketConfig() + { + SetContainer(new Container()); + } + + /// + /// IOC容器。 + /// + public IContainer Container => m_container; + + /// + /// 使用插件 + /// + public bool IsUsePlugin { get; set; } + + /// + /// 插件管理器 + /// + public IPluginsManager PluginsManager => m_pluginsManager; + + /// + /// 设置注入容器。 + /// + /// + /// + public TouchSocketConfig SetContainer(IContainer value) + { + m_container = value; + if (!value.IsRegistered(typeof(ILog))) + { + m_container.RegisterSingleton(); + } + SetPluginsManager(new PluginsManager(m_container)); + return this; + } + + /// + /// 设置PluginsManager + /// + /// + /// + public TouchSocketConfig SetPluginsManager(IPluginsManager value) + { + m_pluginsManager = value; + m_container.RegisterSingleton(value); + return this; + } + + /// + /// 启用插件 + /// + /// + public TouchSocketConfig UsePlugin() + { + IsUsePlugin = true; + return this; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs.meta new file mode 100644 index 0000000..6fb3d09 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 88c8b3fc35a1a684bbfab5bea773edf0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs new file mode 100644 index 0000000..2c625bb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// TouchSocketCoreConfigExtension + /// + public static class TouchSocketCoreConfigExtension + { + #region 插件 + + /// + /// 配置插件。 + /// + /// + /// + /// + public static TouchSocketConfig ConfigurePlugins(this TouchSocketConfig config, Action action) + { + action?.Invoke(config.PluginsManager); + return config; + } + + #endregion 插件 + + #region 容器 + + /// + /// 配置容器注入。 + /// + /// + /// + /// + public static TouchSocketConfig ConfigureContainer(this TouchSocketConfig config, Action action) + { + action?.Invoke(config.Container); + return config; + } + + #endregion 容器 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs.meta new file mode 100644 index 0000000..4d850aa --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Config/TouchSocketCoreConfigExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ae62c9f7051ed74abdf72de93976ec5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter.meta new file mode 100644 index 0000000..2ccd6d7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 45a134310d7a2cb4a83de02d60c9c763 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs new file mode 100644 index 0000000..815e7d5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Core +{ + /// + /// 字节类转换器 + /// + public class BytesConverter : TouchSocketConverter + { + /// + /// 字节类转换器 + /// + public BytesConverter() + { + Add(new JsonBytesToClassConverter()); + } + } + + /// + /// Json字节转到对应类 + /// + public class JsonBytesToClassConverter : IConverter + { + /// + /// + /// + public int Order { get; set; } + + /// + /// + /// + /// + /// + /// + /// + public bool TryConvertFrom(byte[] source, Type targetType, out object target) + { + try + { + target = SerializeConvert.JsonDeserializeFromBytes(source, targetType); + return true; + } + catch + { + target = default; + return false; + } + } + + /// + /// + /// + /// + /// + /// + public bool TryConvertTo(object target, out byte[] source) + { + try + { + source = SerializeConvert.JsonSerializeToBytes(target); + return true; + } + catch (Exception) + { + source = null; + return false; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs.meta new file mode 100644 index 0000000..aa1a050 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/BytesConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8fe7c754405e0b346807eb190f28dc11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs new file mode 100644 index 0000000..82f2c5e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs @@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 转换器接口 + /// + public interface IConverter + { + /// + /// 转换器执行顺序 + /// 该属性值越小,越靠前执行。值相等时,按添加先后顺序 + /// 该属性效果,仅在之前设置有效。 + /// + int Order { get; set; } + + /// + /// 尝试将源数据转换目标类型对象 + /// + /// + /// + /// + /// + bool TryConvertFrom(TSource source, Type targetType, out object target); + + /// + /// 尝试将目标类型对象转换源数据 + /// + /// + /// + /// + bool TryConvertTo(object target, out TSource source); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs.meta new file mode 100644 index 0000000..8514150 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/IConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1a3f236eb7f95d4582f93c4751ff14b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs new file mode 100644 index 0000000..e1efe5c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs @@ -0,0 +1,134 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Core +{ + /// + /// String类型数据转换器 + /// + public class StringConverter : TouchSocketConverter + { + /// + /// 构造函数 + /// + public StringConverter() + { + Add(new StringToPrimitiveConverter()); + Add(new JsonStringToClassConverter()); + } + } + + /// + /// String值转换为基础类型。 + /// + public class StringToPrimitiveConverter : IConverter + { + /// + /// + /// + public int Order { get; set; } + + /// + /// + /// + /// + /// + /// + /// + public bool TryConvertFrom(string source, Type targetType, out object target) + { + if (targetType.IsPrimitive || targetType == TouchSocketCoreUtility.stringType) + { + return StringExtension.TryParseToType(source, targetType, out target); + } + target = default; + return false; + } + + /// + /// + /// + /// + /// + /// + public bool TryConvertTo(object target, out string source) + { + if (target != null) + { + Type type = target.GetType(); + if (type.IsPrimitive || type == TouchSocketCoreUtility.stringType) + { + source = target.ToString(); + return true; + } + } + + source = null; + return false; + } + } + + /// + /// Json字符串转到对应类 + /// + public class JsonStringToClassConverter : IConverter + { + /// + /// + /// + public int Order { get; set; } + + /// + /// + /// + /// + /// + /// + /// + public bool TryConvertFrom(string source, Type targetType, out object target) + { + try + { + target = source.FromJson(targetType); + return true; + } + catch + { + target = default; + return false; + } + } + + /// + /// + /// + /// + /// + /// + public bool TryConvertTo(object target, out string source) + { + try + { + source = target.ToJson(); + return true; + } + catch (Exception) + { + source = null; + return false; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs.meta new file mode 100644 index 0000000..1c64f78 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/StringConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8b967ba1974e4ca49b56ced25f47a407 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs new file mode 100644 index 0000000..0429250 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; + +namespace TouchSocket.Core +{ + /// + /// 转换器 + /// + public class TouchSocketConverter + { + private readonly List> m_converters = new List>(); + + /// + /// 添加插件 + /// + /// 插件 + /// + public void Add(IConverter converter) + { + if (converter == null) + { + throw new ArgumentNullException(); + } + foreach (var item in m_converters) + { + if (item.GetType() == converter.GetType()) + { + return; + } + } + + m_converters.Add(converter); + + m_converters.Sort(delegate (IConverter x, IConverter y) + { + if (x.Order == y.Order) return 0; + else if (x.Order > y.Order) return 1; + else return -1; + }); + } + + /// + /// 清除所有转化器 + /// + public void Clear() + { + m_converters.Clear(); + } + + /// + /// 将源数据转换目标类型对象 + /// + /// + /// + /// + public object ConvertFrom(TSource source, Type targetType) + { + object result; + foreach (var item in m_converters) + { + if (item.TryConvertFrom(source, targetType, out result)) + { + return result; + } + } + + throw new Exception($"{source}无法转换为{targetType}类型。"); + } + + /// + /// 将目标类型对象转换源数据 + /// + /// + /// + public TSource ConvertTo(object target) + { + foreach (var item in m_converters) + { + if (item.TryConvertTo(target, out TSource source)) + { + return source; + } + } + + throw new Exception($"{target}无法转换为{typeof(TSource)}类型。"); + } + + /// + /// 移除插件 + /// + /// + public void Remove(IConverter converter) + { + if (converter == null) + { + throw new ArgumentNullException(); + } + m_converters.Remove(converter); + } + + /// + /// 移除插件 + /// + /// + public void Remove(Type type) + { + for (int i = m_converters.Count - 1; i >= 0; i--) + { + IConverter plugin = m_converters[i]; + if (plugin.GetType() == type) + { + m_converters.RemoveAt(i); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs.meta new file mode 100644 index 0000000..9dd5e89 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Converter/TouchSocketConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 207ff5eed5ab11b4da8704677bd460b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data.meta new file mode 100644 index 0000000..d214093 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8ef8b9af426f5e54a873bb9243efc311 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress.meta new file mode 100644 index 0000000..ae6d81e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dcb3037464fad3d4abd103206b3e2761 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs new file mode 100644 index 0000000..37d79ea --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// GZip压缩算法的压缩机 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public sealed partial class GZipDataCompressor : IDataCompressor + { + byte[] IDataCompressor.Compress(ArraySegment data) + { + return GZip.Compress(data.Array, data.Offset, data.Count); + } + + byte[] IDataCompressor.Decompress(ArraySegment data) + { + return GZip.Decompress(data.Array, data.Offset, data.Count); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs.meta new file mode 100644 index 0000000..173c63e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/GZipDataCompressor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f49d717664383d3488bbfc30c138945f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs new file mode 100644 index 0000000..16de22f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 数据压缩机接口 + /// + public interface IDataCompressor + { + /// + /// 压缩数据 + /// + /// + /// + byte[] Compress(ArraySegment data); + + /// + /// 解压数据 + /// + /// + /// + byte[] Decompress(ArraySegment data); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs.meta new file mode 100644 index 0000000..ffda7a7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Compress/IDataCompressor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48a447374e239524ca9472261ffc64ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs new file mode 100644 index 0000000..7f18dc8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs @@ -0,0 +1,783 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// Crc相关。 + /// 该代码来源于网络 + /// + public static class Crc + { + /// ********************************************************************** + /// Name: CRC-4/ITU x4+x+1 + /// Poly: 0x03 + /// Init: 0x00 + /// Refin: true + /// Refout: true + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc1(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (byte)((crc >> 1) ^ 0x0C);//0x0C = (reverse 0x03)>>(8-4) + else + crc = (byte)(crc >> 1); + } + } + return new byte[] { crc }; + } + + /// ********************************************************************** + /// Name: CRC-5/EPC x5+x3+1 + /// Poly: 0x09 + /// Init: 0x09 + /// Refin: false + /// Refout: false + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc2(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0x48;// Initial value: 0x48 = 0x09<<(8-5) + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 0x80) > 0) + crc = (byte)((crc << 1) ^ 0x48);// 0x48 = 0x09<<(8-5) + else + crc = (byte)(crc << 1); + } + } + return new byte[] { (byte)(crc >> 3) }; + } + + /// ********************************************************************** + /// Name: CRC-5/ITU x5+x4+x2+1 + /// Poly: 0x15 + /// Init: 0x00 + /// Refin: true + /// Refout: true + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc3(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (byte)((crc >> 1) ^ 0x15);// 0x15 = (reverse 0x15)>>(8-5) + else + crc = (byte)(crc >> 1); + } + } + return new byte[] { crc }; + } + + /// ********************************************************************** + /// Name: CRC-5/USB x5+x2+1 + /// Poly: 0x05 + /// Init: 0x1F + /// Refin: true + /// Refout: true + /// Xorout: 0x1F + ///************************************************************************* + public static byte[] Crc4(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0x1F;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (byte)((crc >> 1) ^ 0x14);// 0x14 = (reverse 0x05)>>(8-5) + else + crc = (byte)(crc >> 1); + } + } + return new byte[] { (byte)(crc ^ 0x1F) }; + } + + /// ********************************************************************** + /// Name: CRC-6/ITU x6+x+1 + /// Poly: 0x03 + /// Init: 0x00 + /// Refin: true + /// Refout: true + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc5(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (byte)((crc >> 1) ^ 0x30);// 0x30 = (reverse 0x03)>>(8-6) + else + crc = (byte)(crc >> 1); + } + } + return new byte[] { crc }; + } + + /// ********************************************************************** + /// Name: CRC-7/MMC x7+x3+1 + /// Poly: 0x09 + /// Init: 0x00 + /// Refin: false + /// Refout: false + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc6(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 0x80) > 0) + crc = (byte)((crc << 1) ^ 0x12);// 0x12 = 0x09<<(8-7) + else + crc = (byte)(crc << 1); + } + } + return new byte[] { (byte)(crc >> 1) }; + } + + /// ********************************************************************** + /// Name: CRC8 x8+x2+x+1 + /// Poly: 0x07 + /// Init: 0x00 + /// Refin: false + /// Refout: false + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc7(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 0x80) > 0) + crc = (byte)((crc << 1) ^ 0x07); + else + crc = (byte)(crc << 1); + } + } + return new byte[] { crc }; + } + + /// ********************************************************************** + /// Name: CRC-8/ITU x8+x2+x+1 + /// Poly: 0x07 + /// Init: 0x00 + /// Refin: false + /// Refout: false + /// Xorout: 0x55 + ///************************************************************************* + public static byte[] Crc8(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 0x80) > 0) + crc = (byte)((crc << 1) ^ 0x07); + else + crc = (byte)(crc << 1); + } + } + return new byte[] { (byte)(crc ^ 0x55) }; + } + + /// ********************************************************************** + /// Name: CRC-8/MAXIM x8+x5+x4+1 + /// Poly: 0x31 + /// Init: 0x00 + /// Refin: true + /// Refout: true + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc9(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (byte)((crc >> 1) ^ 0x8C);// 0x8C = reverse 0x31 + else + crc = (byte)(crc >> 1); + } + } + return new byte[] { crc }; + } + + /// ********************************************************************** + /// Name: CRC-8/ROHC x8+x2+x+1 + /// Poly: 0x07 + /// Init: 0xFF + /// Refin: true + /// Refout: true + /// Xorout: 0x00 + ///************************************************************************* + public static byte[] Crc10(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + byte crc = 0xFF;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (byte)((crc >> 1) ^ 0xE0);// 0xE0 = reverse 0x07 + else + crc = (byte)(crc >> 1); + } + } + return new byte[] { crc }; + } + + /// Z1协议校验码计算 + private static readonly byte[] table = { 0x00, 0x1C, 0x38, 0x24, 0x70, 0x6C, 0x48, 0x54, 0xE0, 0xFC, + 0xD8, 0xC4, 0x90, 0x8C, 0xA8, 0xB4, 0xDC, 0xC0, 0xE4, 0xF8, + 0xAC, 0xB0, 0x94, 0x88, 0x3C, 0x20, 0x04, 0x18, 0x4C, 0x50, + 0x74, 0x68, 0xA4, 0xB8, 0x9C, 0x80, 0xD4, 0xC8, 0xEC, 0xF0, + 0x44, 0x58, 0x7C, 0x60, 0x34, 0x28, 0x0C, 0x10, 0x78, 0x64, + 0x40, 0x5C, 0x08, 0x14, 0x30, 0x2C, 0x98, 0x84, 0xA0, 0xBC, + 0xE8, 0xF4, 0xD0, 0xCC, 0x54, 0x48, 0x6C, 0x70, 0x24, 0x38, + 0x1C, 0x00, 0xB4, 0xA8, 0x8C, 0x90, 0xC4, 0xD8, 0xFC, 0xE0, + 0x88, 0x94, 0xB0, 0xAC, 0xF8, 0xE4, 0xC0, 0xDC, 0x68, 0x74, + 0x50, 0x4C, 0x18, 0x04, 0x20, 0x3C, 0xF0, 0xEC, 0xC8, 0xD4, + 0x80, 0x9C, 0xB8, 0xA4, 0x10, 0x0C, 0x28, 0x34, 0x60, 0x7C, + 0x58, 0x44, 0x2C, 0x30, 0x14, 0x08, 0x5C, 0x40, 0x64, 0x78, + 0xCC, 0xD0, 0xF4, 0xE8, 0xBC, 0xA0, 0x84, 0x98, 0xA8, 0xB4, + 0x90, 0x8C, 0xD8, 0xC4, 0xE0, 0xFC, 0x48, 0x54, 0x70, 0x6C, + 0x38, 0x24, 0x00, 0x1C, 0x74, 0x68, 0x4C, 0x50, 0x04, 0x18, + 0x3C, 0x20, 0x94, 0x88, 0xAC, 0xB0, 0xE4, 0xF8, 0xDC, 0xC0, + 0x0C, 0x10, 0x34, 0x28, 0x7C, 0x60, 0x44, 0x58, 0xEC, 0xF0, + 0xD4, 0xC8, 0x9C, 0x80, 0xA4, 0xB8, 0xD0, 0xCC, 0xE8, 0xF4, + 0xA0, 0xBC, 0x98, 0x84, 0x30, 0x2C, 0x08, 0x14, 0x40, 0x5C, + 0x78, 0x64, 0xFC, 0xE0, 0xC4, 0xD8, 0x8C, 0x90, 0xB4, 0xA8, + 0x1C, 0x00, 0x24, 0x38, 0x6C, 0x70, 0x54, 0x48, 0x20, 0x3C, + 0x18, 0x04, 0x50, 0x4C, 0x68, 0x74, 0xC0, 0xDC, 0xF8, 0xE4, + 0xB0, 0xAC, 0x88, 0x94, 0x58, 0x44, 0x60, 0x7C, 0x28, 0x34, + 0x10, 0x0C, 0xB8, 0xA4, 0x80, 0x9C, 0xC8, 0xD4, 0xF0, 0xEC, + 0x84, 0x98, 0xBC, 0xA0, 0xF4, 0xE8, 0xCC, 0xD0, 0x64, 0x78, + 0x5C, 0x40, 0x14, 0x08, 0x2C, 0x30 + }; + + /// + /// Crc11 + /// + /// + /// + /// + /// + public static byte[] Crc11(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + int i; + byte crc = 0x00; + int tableIndex; + for (i = start; i < length; i++) + { + tableIndex = crc ^ (buffer[i] & 0xFF); + crc = table[tableIndex]; + } + return new byte[] { crc }; + } + + /// ********************************************************************** + /// Name: CRC-12 x16+x12+x5+1 + /// Poly: 0x80 + /// Init: 0x0000 + /// Refin: true + /// Refout: true + /// Xorout: 0x0000 + ///************************************************************************* + public static byte[] Crc12(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0;// Initial value + short iQ = 0, iR = 0; + for (int i = start; i < length; i++) + { + // 多项式除法 + // 如果该位为1 + if ((buffer[i] & (0x80 >> iR)) > 0) + { + // 则在余数尾部添1否则添0 + crc |= 0x01; + } + // 如果12位除数中的最高位为1,则够除 + if (crc >= 0x1000) + { + crc ^= 0x180D; + } + crc <<= 1; + iR++; + if (8 == iR) + { + iR = 0; + iQ++; + } + } + // 对后面添加的12个0做处理 + for (int i = 0; i < 12; i++) + { + if (crc >= 0x1000) + { + crc ^= 0x180D; + } + crc <<= 1; + } + crc >>= 1; + byte[] ret = BitConverter.GetBytes(crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/CCITT x16+x12+x5+1 + /// Poly: 0x1021 + /// Init: 0x0000 + /// Refin: true + /// Refout: true + /// Xorout: 0x0000 + ///************************************************************************* + public static byte[] Crc13(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (ushort)((crc >> 1) ^ 0x8408);// 0x8408 = reverse 0x1021 + else + crc = (ushort)(crc >> 1); + } + } + byte[] ret = BitConverter.GetBytes(crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/CCITT FALSE x16+x12+x5+1 + /// Poly: 0x1021 + /// Init: 0xFFFF + /// Refin: false + /// Refout: false + /// Xorout: 0x0000 + ///************************************************************************* + public static byte[] Crc14(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0xFFFF;// Initial value + for (int i = start; i < length; i++) + { + crc ^= (ushort)(buffer[i] << 8); + for (int j = 0; j < 8; j++) + { + if ((crc & 0x8000) > 0) + crc = (ushort)((crc << 1) ^ 0x1021); + else + crc = (ushort)(crc << 1); + } + } + byte[] ret = BitConverter.GetBytes(crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/DNP x16+x13+x12+x11+x10+x8+x6+x5+x2+1 + /// Poly: 0x3D65 + /// Init: 0x0000 + /// Refin: true + /// Refout: true + /// Xorout: 0xFFFF + ///************************************************************************* + public static byte[] Crc15(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (ushort)((crc >> 1) ^ 0xA6BC);// 0xA6BC = reverse 0x3D65 + else + crc = (ushort)(crc >> 1); + } + } + byte[] ret = BitConverter.GetBytes((ushort)~crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/IBM x16+x15+x2+1 + /// Poly: 0x8005 + /// Init: 0x0000 + /// Refin: true + /// Refout: true + /// Xorout: 0x0000 + ///************************************************************************* + public static byte[] Crc16(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005 + else + crc = (ushort)(crc >> 1); + } + } + byte[] ret = BitConverter.GetBytes(crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/MAXIM x16+x15+x2+1 + /// Poly: 0x8005 + /// Init: 0x0000 + /// Refin: true + /// Refout: true + /// Xorout: 0xFFFF + ///************************************************************************* + public static byte[] Crc17(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005 + else + crc = (ushort)(crc >> 1); + } + } + byte[] ret = BitConverter.GetBytes((ushort)~crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/MODBUS x16+x15+x2+1 + /// Poly: 0x8005 + /// Init: 0xFFFF + /// Refin: true + /// Refout: true + /// Xorout: 0x0000 + ///************************************************************************* + public static byte[] Crc18(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0xFFFF;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005 + else + crc = (ushort)(crc >> 1); + } + } + byte[] ret = BitConverter.GetBytes(crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/USB x16+x15+x2+1 + /// Poly: 0x8005 + /// Init: 0xFFFF + /// Refin: true + /// Refout: true + /// Xorout: 0xFFFF + ///************************************************************************* + public static byte[] Crc19(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0xFFFF;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005 + else + crc = (ushort)(crc >> 1); + } + } + byte[] ret = BitConverter.GetBytes((ushort)~crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/X25 x16+x12+x5+1 + /// Poly: 0x1021 + /// Init: 0xFFFF + /// Refin: true + /// Refout: true + /// Xorout: 0xFFFF + ///************************************************************************* + public static byte[] Crc20(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0xFFFF;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (ushort)((crc >> 1) ^ 0x8408);// 0x8408 = reverse 0x1021 + else + crc = (ushort)(crc >> 1); + } + } + byte[] ret = BitConverter.GetBytes((ushort)~crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC-16/XMODEM x16+x12+x5+1 + /// Poly: 0x1021 + /// Init: 0x0000 + /// Refin: false + /// Refout: false + /// Xorout: 0x0000 + ///************************************************************************* + public static byte[] Crc21(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + ushort crc = 0;// Initial value + for (int i = start; i < length; i++) + { + crc ^= (ushort)(buffer[i] << 8); + for (int j = 0; j < 8; j++) + { + if ((crc & 0x8000) > 0) + crc = (ushort)((crc << 1) ^ 0x1021); + else + crc = (ushort)(crc << 1); + } + } + byte[] ret = BitConverter.GetBytes(crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC32 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 + /// Poly: 0x04C11DB7 + /// Init: 0xFFFFFFFF + /// Refin: true + /// Refout: true + /// Xorout: 0xFFFFFFFF + ///************************************************************************* + public static byte[] Crc22(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + uint crc = 0xFFFFFFFF;// Initial value + for (int i = start; i < length; i++) + { + crc ^= buffer[i]; + for (int j = 0; j < 8; j++) + { + if ((crc & 1) > 0) + crc = (crc >> 1) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7 + else + crc = crc >> 1; + } + } + byte[] ret = BitConverter.GetBytes(~crc); + Array.Reverse(ret); + return ret; + } + + /// ********************************************************************** + /// Name: CRC32/MPEG-2 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 + /// Poly: 0x04C11DB7 + /// Init: 0xFFFFFFFF + /// Refin: false + /// Refout: false + /// Xorout: 0x00000000 + ///************************************************************************* + public static byte[] Crc23(byte[] buffer, int start = 0, int len = 0) + { + if (buffer == null || buffer.Length == 0) return null; + if (start < 0) return null; + if (len == 0) len = buffer.Length - start; + int length = start + len; + if (length > buffer.Length) return null; + uint crc = 0xFFFFFFFF;// Initial value + for (int i = start; i < length; i++) + { + crc ^= (uint)(buffer[i] << 24); + for (int j = 0; j < 8; j++) + { + if ((crc & 0x80000000) > 0) + crc = (crc << 1) ^ 0x04C11DB7; + else + crc = crc << 1; + } + } + byte[] ret = BitConverter.GetBytes(crc); + Array.Reverse(ret); + return ret; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs.meta new file mode 100644 index 0000000..8dc8051 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Crc.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 547cfdf97147bec459081ca215295703 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs new file mode 100644 index 0000000..f9a34c5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs @@ -0,0 +1,142 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.IO; +using System.IO.Compression; + +namespace TouchSocket.Core +{ + /// + /// Gzip操作类 + /// + public static class GZip + { + /// + /// 压缩数据 + /// + /// + /// + /// + /// + /// + public static void Compress(ByteBlock byteBlock, byte[] buffer, int offset, int length) + { + using (GZipStream gZipStream = new GZipStream(byteBlock, CompressionMode.Compress, true)) + { + gZipStream.Write(buffer, offset, length); + gZipStream.Close(); + } + } + + /// + /// 压缩数据 + /// + /// + /// + /// + public static void Compress(ByteBlock byteBlock, byte[] buffer) + { + Compress(byteBlock, buffer, 0, buffer.Length); + } + + /// + /// 压缩数据 + /// + /// + /// + /// + /// + public static byte[] Compress(byte[] buffer, int offset, int length) + { + using (ByteBlock byteBlock = new ByteBlock(length)) + { + Compress(byteBlock, buffer, offset, length); + return byteBlock.ToArray(); + } + } + + /// + /// 压缩数据 + /// + /// + /// + public static byte[] Compress(byte[] buffer) + { + return Compress(buffer, 0, buffer.Length); + } + + /// + /// 解压数据 + /// + /// + /// + /// + /// + /// + public static void Decompress(ByteBlock byteBlock, byte[] data, int offset, int length) + { + using (GZipStream gZipStream = new GZipStream(new MemoryStream(data, offset, length), CompressionMode.Decompress)) + { + byte[] bytes = BytePool.Default.GetByteCore(1024 * 64); + try + { + int r; + while ((r = gZipStream.Read(bytes, 0, bytes.Length)) != 0) + { + byteBlock.Write(bytes, 0, r); + } + gZipStream.Close(); + } + finally + { + BytePool.Default.Recycle(bytes); + } + } + } + + /// + /// 解压数据 + /// + /// + /// + public static void Decompress(ByteBlock byteBlock, byte[] data) + { + Decompress(byteBlock, data, 0, data.Length); + } + + /// + /// 解压数据 + /// + /// + /// + /// + /// + public static byte[] Decompress(byte[] data, int offset, int length) + { + using (ByteBlock byteBlock = new ByteBlock(length)) + { + Decompress(byteBlock, data, offset, length); + return byteBlock.ToArray(); + } + } + + /// + /// 解压数据 + /// + /// + /// + public static byte[] Decompress(byte[] data) + { + return Decompress(data, 0, data.Length); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs.meta new file mode 100644 index 0000000..729269a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/GZip.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 253db0b1414c41940b7c8de1555b9e67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs new file mode 100644 index 0000000..c5e7f4f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs @@ -0,0 +1,85 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Text; + +namespace TouchSocket.Core +{ + /// + /// MD5相关操作类 + /// + public static class MD5 + { + /// + /// 从字符串获取MD5值 + /// + /// + /// + public static string GetMD5Hash(string str) + { + StringBuilder sb = new StringBuilder(); + using (var md5 = System.Security.Cryptography.MD5.Create()) + { + byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(str)); + int length = data.Length; + for (int i = 0; i < length; i++) + sb.Append(data[i].ToString("X2")); + } + return sb.ToString(); + } + + /// + /// 从字节获取MD5值 + /// + /// + /// + /// + /// + public static string GetMD5Hash(byte[] buffer, int offset, int length) + { + StringBuilder sb = new StringBuilder(); + using (var md5 = System.Security.Cryptography.MD5.Create()) + { + byte[] data = md5.ComputeHash(buffer, offset, length); + int count = data.Length; + for (int i = 0; i < count; i++) + sb.Append(data[i].ToString("X2")); + } + return sb.ToString(); + } + + /// + /// 从字节获取MD5值 + /// + /// + /// + public static string GetMD5Hash(byte[] buffer) + { + return GetMD5Hash(buffer, 0, buffer.Length); + } + + /// + /// 验证MD5值。 + /// + /// + /// + /// + public static bool VerifyMD5Hash(string str, string hash) + { + string hashOfInput = GetMD5Hash(str); + if (hashOfInput.CompareTo(hash) == 0) + return true; + else + return false; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs.meta new file mode 100644 index 0000000..37d88e7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/MD5.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ae592fe3b8496a48ba90bac1abc1d26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security.meta new file mode 100644 index 0000000..ca179ec --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a8d66cccd730b6498e5c7d4f1d7a5e2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs new file mode 100644 index 0000000..c09011a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs @@ -0,0 +1,161 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace TouchSocket.Core +{ + /// + /// 数据安全加密 + /// + public static class DataSecurity + { + /// + /// 自定义加密密钥。 + /// + private static byte[] Keys { get; set; } = { 0x12, 0x34, 4, 0x78, 0x90, 255, 0xCD, 0xEF };//自定义密匙 + + /// + /// 使用3DES加密 + /// + /// 待加密字节 + /// 加密口令(长度为8) + /// + public static byte[] EncryptDES(byte[] data, string encryptKey) + { + if (encryptKey.IsNullOrEmpty()) + { + throw new ArgumentNullException(nameof(encryptKey)); + } + if (encryptKey.Length < 8) + { + throw new Exception("密钥长度不足8位。"); + } + byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); + using (var des = DES.Create()) + { + using (MemoryStream mStream = new MemoryStream()) + { + using (CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(rgbKey, Keys), CryptoStreamMode.Write)) + { + cStream.Write(data, 0, data.Length); + cStream.FlushFinalBlock(); + return mStream.ToArray(); + } + } + } + } + + /// + /// 使用3DES解密 + /// + /// 待解密字节 + /// 解密口令(长度为8) + /// + public static byte[] DecryptDES(byte[] data, string encryptKey) + { + if (encryptKey.IsNullOrEmpty()) + { + throw new ArgumentNullException(nameof(encryptKey)); + } + if (encryptKey.Length < 8) + { + throw new Exception("密钥长度不足8位。"); + } + byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey); + using (var des = DES.Create()) + { + using (MemoryStream mStream = new MemoryStream()) + { + using (CryptoStream cStream = new CryptoStream(mStream, des.CreateDecryptor(rgbKey, Keys), CryptoStreamMode.Write)) + { + cStream.Write(data, 0, data.Length); + cStream.FlushFinalBlock(); + return mStream.ToArray(); + } + } + } + } + + /// + /// 使用3DES流数据加密。 + /// 注意:数据会从开始 + /// + /// + /// + /// 加密口令(长度为8) + /// + public static void StreamEncryptDES(Stream inStream, Stream outStream, string encryptKey) + { + if (encryptKey.IsNullOrEmpty()) + { + throw new ArgumentNullException(nameof(encryptKey)); + } + if (encryptKey.Length < 8) + { + throw new Exception("密钥长度不足8位。"); + } + byte[] rgbKeys = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); + byte[] byteIn = new byte[1024 * 64]; + long readLen = 0; + long totalLen = inStream.Length - inStream.Position; + using (var des = DES.Create()) + { + CryptoStream encStream = new CryptoStream(new WrapStream(outStream), des.CreateEncryptor(rgbKeys, Keys), CryptoStreamMode.Write); + while (readLen < totalLen) + { + int r = inStream.Read(byteIn, 0, byteIn.Length); + encStream.Write(byteIn, 0, r); + readLen += r; + } + encStream.Close(); + } + } + + /// + /// 使用3DES流数据解密 + /// 注意:数据会从开始 + /// + /// + /// + /// 解密口令(长度为8) + public static void StreamDecryptDES(Stream inStream, Stream outStream, string encryptKey) + { + if (encryptKey.IsNullOrEmpty()) + { + throw new ArgumentNullException(nameof(encryptKey)); + } + if (encryptKey.Length < 8) + { + throw new Exception("密钥长度不足8位。"); + } + byte[] rgbKeys = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); + byte[] byteIn = new byte[1024 * 64]; + long readLen = 0; + long totalLen = inStream.Length - inStream.Position; + using (DES des = DES.Create()) + { + CryptoStream encStream = new CryptoStream(new WrapStream(outStream), des.CreateDecryptor(rgbKeys, Keys), CryptoStreamMode.Write); + while (readLen < totalLen) + { + int r = inStream.Read(byteIn, 0, byteIn.Length); + encStream.Write(byteIn, 0, r); + readLen = readLen + r; + } + encStream.Close(); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs.meta new file mode 100644 index 0000000..c7cc005 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Security/DataSecurity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b37da279cafaa184faa4441858dcd341 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs new file mode 100644 index 0000000..e9cc583 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// 交换类。功能类似:a=1,b=2,交换后a=2,b=1。 + /// + public static class Swap + { + /// + /// 执行交换 + /// + /// + /// + /// + public static void Execute(ref T x, ref T y) + { +#if NET45_OR_GREATER + T temp = x; + x = y; + y = temp; +#else + (y, x) = (x, y); +#endif + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs.meta new file mode 100644 index 0000000..3c13f4b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/Swap.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca5ca8afa347d2f478842ac99c28aa76 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML.meta new file mode 100644 index 0000000..729f673 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 774ac4f463e9a644dbe56aaf106eeaaf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs new file mode 100644 index 0000000..764fa65 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs @@ -0,0 +1,721 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml; + +namespace TouchSocket.Core +{ + /// + /// xml主类 + /// + public class XmlTool + { + /// + /// 构造函数 + /// + /// 文件路径,包含文件名 + public XmlTool(string path) + { + this.path = path; + } + + private readonly string path = null; + + #region 存储 + + /// + /// 单节点,单属性储存 + /// + /// 节点名 + /// 属性名 + /// 属性值 + public void AttributeStorage(string NodeName, string Attribute_name, string Attribute_value) + { + if (File.Exists(path)) + {//存在Xml的文件 + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + bool N = false;//节点判断变量 + foreach (XmlNode item in nodeList) + {//判断是否存在该节点 + if (item.Name == NodeName) + { + N = true; + break; + } + } + if (N == false) + {//不存在节点,属性,建立节点,属性 + XmlElement PointName = xml.CreateElement(NodeName); + PointName.SetAttribute(Attribute_name, Attribute_value); + root.AppendChild(PointName); + } + else + {//存在属性进行赋值 + XmlNode PointName = xml.SelectSingleNode("Root/" + NodeName); + PointName.Attributes[Attribute_name].Value = Attribute_value; + } + xml.Save(path); + } + else + { + XmlDocument xml = new XmlDocument(); + XmlDeclaration dec = xml.CreateXmlDeclaration("1.0", "UTF-8", null); + XmlElement root = xml.CreateElement("Root"); + xml.AppendChild(root);//根元素 + + XmlElement PointName = xml.CreateElement(NodeName); + PointName.SetAttribute(Attribute_name, Attribute_value); + root.AppendChild(PointName); + xml.Save(path); + } + } + + /// + /// 单节点,多属性存储 + /// + /// 节点名 + /// 属性集合 + /// 属性值集合 + public void AttributeStorage(string NodeName, string[] Attribute_name, string[] Attribute_value) + { + if (Attribute_name.Length != Attribute_value.Length) + { + Console.WriteLine("属性名数量和属性值数量不一致,无法储存"); + return; + } + if (File.Exists(path)) + {//存在Xml的文件 + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + bool N = false;//节点变量 + foreach (XmlNode item in nodeList) + {//判断是否存在该节点 + if (item.Name == NodeName) + { + N = true; + break; + } + } + if (N == false) + {//不存在节点,属性,建立节点,属性 + XmlElement PointName = xml.CreateElement(NodeName); + for (int i = 0; i < Attribute_name.Length; i++) + { + PointName.SetAttribute(Attribute_name[i], Attribute_value[i]); + root.AppendChild(PointName); + } + } + else + {//存在属性进行赋值 + XmlNode PointName = xml.SelectSingleNode("Root/" + NodeName); + for (int i = 0; i < Attribute_name.Length; i++) + { + PointName.Attributes[Attribute_name[i]].Value = Attribute_value[i]; + } + } + xml.Save(path); + } + else + { + XmlDocument xml = new XmlDocument(); + XmlDeclaration dec = xml.CreateXmlDeclaration("1.0", "UTF-8", null); + XmlElement root = xml.CreateElement("Root"); + xml.AppendChild(root);//根元素 + + XmlElement PointName = xml.CreateElement(NodeName); + for (int i = 0; i < Attribute_name.Length; i++) + { + PointName.SetAttribute(Attribute_name[i], Attribute_value[i]); + root.AppendChild(PointName); + } + xml.Save(path); + } + } + + /// + /// 单节点,单属性多集合存储 + /// + /// 节点集合 + /// 属性名集合 + /// 属性值集合 + public void AttributeStorage(string[] NodeName, string[] Attribute_name, string[] Attribute_value) + { + if ((Attribute_name.Length != Attribute_value.Length) && NodeName.Length != Attribute_name.Length) + { + Console.WriteLine("属性名数量和属性值数量不一致,无法储存"); + return; + } + if (File.Exists(path)) + {//存在Xml的文件 + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + for (int i = 0; i < NodeName.Length; i++) + { + bool N = false;//节点变量 + foreach (XmlNode item in nodeList) + {//判断是否存在该节点 + if (item.Name == NodeName[i]) + { + N = true; + break; + } + } + if (N == false) + {//不存在节点,属性,建立节点,属性 + XmlElement PointName = xml.CreateElement(NodeName[i]); + + PointName.SetAttribute(Attribute_name[i], Attribute_value[i]); + root.AppendChild(PointName); + } + else + {//存在属性进行赋值 + XmlNode PointName = xml.SelectSingleNode("Root/" + NodeName); + + PointName.Attributes[Attribute_name[i]].Value = Attribute_value[i]; + } + xml.Save(path); + } + } + else + { + XmlDocument xml = new XmlDocument(); + XmlDeclaration dec = xml.CreateXmlDeclaration("1.0", "UTF-8", null); + XmlElement root = xml.CreateElement("Root"); + xml.AppendChild(root);//根元素 + for (int i = 0; i < NodeName.Length; i++) + { + XmlElement PointName = xml.CreateElement(NodeName[i]); + PointName.SetAttribute(Attribute_name[i], Attribute_value[i]); + root.AppendChild(PointName); + + xml.Save(path); + } + } + } + + /// + /// 多节点,多属性,多集合存储 + /// + /// 节点集合 + /// 属性集合 + /// 每个节点的属性数量 + /// 属性值集合 + public void AttributeStorage(string[] NodeName, string[] Attribute_name, int AttributeNumber, params string[][] Attribute_value) + { + if (File.Exists(path)) + { + //存在Xml的文件 + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + for (int i = 0; i < NodeName.Length; i++) + { + bool N = false;//节点变量 + foreach (XmlNode item in nodeList) + {//判断是否存在该节点 + if (item.Name == NodeName[i]) + { + N = true; + break; + } + } + if (N == false) + {//不存在节点,属性,建立节点,属性 + XmlElement PointName = xml.CreateElement(NodeName[i]); + for (int j = 0; j < AttributeNumber; j++) + { + PointName.SetAttribute(Attribute_name[j], Attribute_value[j][i]); + } + + root.AppendChild(PointName); + } + else + {//存在属性进行赋值 + XmlNode PointName = xml.SelectSingleNode("Root/" + NodeName[i]); + + for (int j = 0; j < AttributeNumber; j++) + { + PointName.Attributes[Attribute_name[j]].Value = Attribute_value[j][i]; + } + } + } + xml.Save(path); + } + else + { + XmlDocument xml = new XmlDocument(); + XmlDeclaration dec = xml.CreateXmlDeclaration("1.0", "UTF-8", null); + XmlElement root = xml.CreateElement("Root"); + xml.AppendChild(root);//根元素 + for (int i = 0; i < NodeName.Length; i++) + { + XmlElement PointName = xml.CreateElement(NodeName[i]); + for (int j = 0; j < AttributeNumber; j++) + { + PointName.SetAttribute(Attribute_name[j], Attribute_value[j][i]); + } + root.AppendChild(PointName); + + xml.Save(path); + } + } + } + + /// + /// 节点值存储 + /// + /// 节点名 + /// 文本 + public void NodeStorage(string NodeName, string Text) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + bool n = false; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + item.InnerText = Text; + n = true; + break; + } + } + if (n == false) + { + XmlElement other = xml.CreateElement(NodeName); + other.InnerText = Text; + root.AppendChild(other); + } + xml.Save(path); + } + else + { + XmlDocument doc = new XmlDocument(); + XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null); + XmlElement Root = doc.CreateElement("Root"); + doc.AppendChild(Root);//根元素 + + XmlElement Node = doc.CreateElement(NodeName); + Node.InnerText = Text; + Root.AppendChild(Node); + + doc.Save(path); + } + } + + #endregion 存储 + + #region + + /// + /// 通过节点取值 + /// + /// 节点名 + /// 取值失败返回null + public string SearchNode(string NodeName) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + return item.InnerText; + } + } + } + return null; + } + + /// + /// 查找数字 + /// + /// 节点名 + /// 属性名 + /// 取值失败返回0 + public int SearchNumber(string NodeName, string Attribute_name) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + if (item.Attributes[Attribute_name] != null) + { + return Convert.ToInt32(item.Attributes[Attribute_name].Value); + } + } + } + } + return 0; + } + + /// + /// 查找属性值 + /// + /// 节点名 + /// 属性名 + /// 取值失败返回null + public string SearchWords(string NodeName, string Attribute_name) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + if (item.Attributes[Attribute_name] != null) + { + return item.Attributes[Attribute_name].Value; + } + } + } + } + return null; + } + + /// + /// 查找布尔值 + /// + /// 节点名 + /// 属性值 + /// 返回查找结果,查询失败返回false + public bool SearchBoolean(string NodeName, string Attribute_name) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + if (item.Attributes[Attribute_name] != null) + { + try + { + return Convert.ToBoolean(item.Attributes[Attribute_name].Value); + } + catch + { + return false; + } + } + } + } + } + return false; + } + + /// + /// 查找属性值集合 + /// + /// 节点名集合 + /// 属性名集合 + /// 文件不在返回null,单个属性不在返回“空” + public string[] SearchWords(string[] NodeName, string[] Attribute_name) + { + if (File.Exists(path)) + { + string[] s = new string[NodeName.Length]; + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + for (int i = 0; i < NodeName.Length; i++) + { + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName[i]) + { + if (item.Attributes[Attribute_name[i]] != null) + { + s[i] = item.Attributes[Attribute_name[i]].Value; + } + else + { + s[i] = ""; + } + } + } + } + return s; + } + return null; + } + + /// + /// 通过确切属性值,属性名,查找其他属性值 + /// + /// 已知属性名 + /// 已知属性值 + /// 待查属性名 + /// 待查属性值 + public string[] SearchWords(string Attribute_name1, string Attribute_value, string Attribute_name2) + { + List values = new List(); + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Attributes[Attribute_name1] != null) + { + if (item.Attributes[Attribute_name1].Value == Attribute_value) + { + if (item.Attributes[Attribute_name2] != null) + { + values.Add(item.Attributes[Attribute_name2].Value); + } + } + } + } + } + return values.ToArray(); + } + + /// + /// 查找节点的所有属性值 + /// + /// 节点 名 + /// 返回查找键值对,查询失败返回null + public Dictionary SearchAllAttributes(string NodeName) + { + Dictionary Attributes = new Dictionary(); + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + XmlAttributeCollection attributeCollection = item.Attributes; + if (attributeCollection != null) + { + foreach (XmlAttribute attribute in attributeCollection) + { + Attributes.Add(attribute.Name, attribute.Value); + } + } + return Attributes; + } + } + } + return null; + } + + /// + /// 通过确切属性值,属性名,查找其他属性的布尔值 + /// + /// 已知属性名 + /// 已知属性值 + /// 待查属性名 + /// 待查布尔值,失败返回false + public bool SearchBoolean(string Attribute_name1, string Attribute_value, string Attribute_name2) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Attributes[Attribute_name1].Value == Attribute_value) + { + if (item.Attributes[Attribute_name2] != null) + { + try + { + return Convert.ToBoolean(item.Attributes[Attribute_name2].Value); + } + catch + { + return false; + } + } + } + } + } + return false; + } + + #endregion + + /// + /// 按节点名移除节点 + /// + /// 节点名 + /// 是否移除成功 + public bool RemoveNode(string NodeName) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + root.RemoveChild(item); + xml.Save(path); + return true; + } + } + } + return false; + } + + /// + /// 按确切的属性名,属性值删除节点 + /// + /// 属性名 + /// 属性值 + /// 是否移除成功 + public bool RemoveNode(string Attribute_name, string Attribute_value) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Attributes[Attribute_name] != null) + { + if (item.Attributes[Attribute_name].Value == Attribute_value) + { + root.RemoveChild(item); + xml.Save(path); + return true; + } + } + } + } + return false; + } + + /// + /// 如果节点中有日期属性,把日期之前的节点都删除 + /// + /// 属性名 + /// 截止时间 + /// 是否删除成功 + public bool RemoveNode(string Attribute_name, DateTime dateTime) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + for (int i = 0; i < nodeList.Count; i++) + { + if (nodeList[i].Attributes[Attribute_name] != null) + { + DateTime dt = Convert.ToDateTime(nodeList[i].Attributes[Attribute_name].Value); + if (DateTime.Compare(dt, dateTime) < 0) + { + root.RemoveChild(nodeList[i]); + } + } + } + xml.Save(path); + + return true; + } + return false; + } + + /// + /// 判断节点是否存在 + /// + /// 节点名 + /// 返回结果 + public bool NodeExist(string NodeName) + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + XmlNodeList nodeList = root.ChildNodes; + foreach (XmlNode item in nodeList) + { + if (item.Name == NodeName) + { + return true; + } + } + } + return false; + } + + /// + /// 删除所有节点,不包含子节点 + /// + /// 返回删除是否成功 + public bool RemoveAllNode() + { + if (File.Exists(path)) + { + XmlDocument xml = new XmlDocument(); + xml.Load(path); + XmlElement root = xml.DocumentElement; + root.RemoveAll(); + xml.Save(path); + + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs.meta new file mode 100644 index 0000000..1d2c3ea --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Data/XML/XmlTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 18e14b0ff2be20546a5d8d8096603deb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency.meta new file mode 100644 index 0000000..e46d9f6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e1da3d50025248b4a98c1895a36351f4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute.meta new file mode 100644 index 0000000..ee397b1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f1d42e56f4d13ed44863e2a30565b9e2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs new file mode 100644 index 0000000..86f9f67 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 依赖属性数据验证 + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public class DataValidationAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs.meta new file mode 100644 index 0000000..92a2be8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DataValidationAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 031389244d79f774aa9fc1a3f4e9dc4d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs new file mode 100644 index 0000000..a2dc57d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs @@ -0,0 +1,153 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 指定依赖类型。 + /// + [AttributeUsage(AttributeTargets.Class)] + public class DependencyTypeAttribute : Attribute + { + /// + /// 初始化一个依赖类型。当确定某个类型仅以某种特定方式注入时,可以过滤不必要的注入操作,以提高效率。 + /// + /// 可以叠加位域 + public DependencyTypeAttribute(DependencyType type) + { + Type = type; + } + + /// + /// 支持类型。 + /// + public DependencyType Type { get; } + } + + /// + /// 依赖注入类型。 + /// + public enum DependencyType + { + /// + /// 构造函数 + /// + Constructor = 1, + + /// + /// 属性 + /// + Property = 2, + + /// + /// 方法 + /// + Method = 4 + } + + /// + /// 指定依赖类型,构造函数,可用于构造函数,属性,方法。 + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Property | AttributeTargets.Method)] + public class DependencyInjectAttribute : Attribute + { + /// + /// 初始化一个依赖注入对象。并且指定构造参数。 + /// 当创建时也指定参数时,会覆盖该设定。 + /// + /// + public DependencyInjectAttribute(params object[] ps) + { + Ps = ps; + } + + /// + /// 构造函数 + /// + /// + public DependencyInjectAttribute(bool resolveNullIfNoRegistered) + { + ResolveNullIfNoRegistered = resolveNullIfNoRegistered; + } + + /// + /// 构造参数 + /// + public object[] Ps { get; } + + /// + /// 如果没有注册则返回为空 + /// + public bool ResolveNullIfNoRegistered { get; set; } + } + + /// + /// 参数,属性指定性注入。 + /// + [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] + public class DependencyParamterInjectAttribute : DependencyInjectAttribute + { + /// + /// 参数,属性指定性注入。 + /// + /// + /// + public DependencyParamterInjectAttribute(string key, params object[] ps) : base(ps) + { + Key = key; + } + + /// + /// 类型,参数,属性指定性注入。 + /// + /// + /// + /// + public DependencyParamterInjectAttribute(Type type, string key, params object[] ps) : base(ps) + { + Key = key; + Type = type; + } + + /// + /// 类型,参数,属性指定性注入。 + /// + /// + /// + public DependencyParamterInjectAttribute(Type type, params object[] ps) : base(ps) + { + Key = string.Empty; + Type = type; + } + + /// + /// 注入类型 + /// + public Type Type { get; } + + /// + /// 构造函数 + /// + /// + public DependencyParamterInjectAttribute(bool resolveNullIfNoRegistered) + { + ResolveNullIfNoRegistered = resolveNullIfNoRegistered; + } + + /// + /// 指定键。 + /// + public string Key { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs.meta new file mode 100644 index 0000000..a637b82 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Attribute/DependencyInjectionAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b7811e5a0bab1442a5028a89a30153c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs new file mode 100644 index 0000000..063c792 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs @@ -0,0 +1,371 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// IOC容器 + /// + public class Container : IContainer + { + private readonly ConcurrentDictionary m_registrations = new ConcurrentDictionary(); + + /// + /// 初始化一个IOC容器 + /// + public Container() + { + this.RegisterSingleton(this); + } + + /// + /// 返回迭代器 + /// + /// + public IEnumerator GetEnumerator() + { + return m_registrations.Values.ToList().GetEnumerator(); + } + + /// + /// + /// + /// + /// + /// + public bool IsRegistered(Type fromType, string key = "") + { + return m_registrations.ContainsKey($"{fromType.FullName}{key}"); + } + + /// + /// + /// + /// + /// + public void Register(DependencyDescriptor descriptor, string key = "") + { + string k = $"{descriptor.FromType.FullName}{key}"; + m_registrations.AddOrUpdate(k, descriptor, (k, v) => { return descriptor; }); + } + + /// + /// + /// + /// + /// + /// + /// + public object Resolve(Type fromType, object[] ps = null, string key = "") + { + if (fromType == typeof(IContainerProvider)) + { + return GetScopedContainer(); + } + string k; + DependencyDescriptor descriptor; + if (fromType.IsGenericType) + { + Type type = fromType.GetGenericTypeDefinition(); + k = $"{type.FullName}{key}"; + if (m_registrations.TryGetValue(k, out descriptor)) + { + if (descriptor.ImplementationFactory != null) + { + return descriptor.ImplementationFactory.Invoke(this); + } + if (descriptor.Lifetime == Lifetime.Singleton) + { + if (descriptor.ToInstance != null) + { + return descriptor.ToInstance; + } + lock (descriptor) + { + if (descriptor.ToInstance != null) + { + return descriptor.ToInstance; + } + if (descriptor.ToType.IsGenericType) + { + return descriptor.ToInstance = Create(descriptor.ToType.MakeGenericType(fromType.GetGenericArguments()), ps); + } + else + { + return descriptor.ToInstance = Create(descriptor.ToType, ps); + } + } + } + if (descriptor.ToType.IsGenericType) + { + return Create(descriptor.ToType.MakeGenericType(fromType.GetGenericArguments()), ps); + } + else + { + return Create(descriptor.ToType, ps); + } + } + } + k = $"{fromType.FullName}{key}"; + if (m_registrations.TryGetValue(k, out descriptor)) + { + if (descriptor.ImplementationFactory != null) + { + return descriptor.ImplementationFactory.Invoke(this); + } + if (descriptor.Lifetime == Lifetime.Singleton) + { + if (descriptor.ToInstance != null) + { + return descriptor.ToInstance; + } + lock (descriptor) + { + if (descriptor.ToInstance != null) + { + return descriptor.ToInstance; + } + return descriptor.ToInstance = Create(descriptor.ToType, ps); + } + } + return Create(descriptor.ToType, ps); + } + else if (fromType.IsPrimitive || fromType == typeof(string)) + { + return default; + } + else if (fromType.IsClass && !fromType.IsAbstract) + { + if (fromType.GetCustomAttribute() is DependencyInjectAttribute attribute) + { + if (attribute.ResolveNullIfNoRegistered && !IsRegistered(fromType, key)) + { + return default; + } + } + return Create(fromType, ps); + } + else + { + return default; + } + } + + /// + /// + /// + /// + /// + public void Unregister(DependencyDescriptor descriptor, string key = "") + { + string k = $"{descriptor.FromType.FullName}{key}"; + m_registrations.TryRemove(k, out _); + } + + /// + /// + /// + /// + /// + /// + private object Create(Type toType, object[] ops) + { + ConstructorInfo ctor = toType.GetConstructors().FirstOrDefault(x => x.IsDefined(typeof(DependencyInjectAttribute), true)); + if (ctor is null) + { + //如果没有被特性标记,那就取构造函数参数最多的作为注入目标 + if (toType.GetConstructors().Length == 0) + { + throw new Exception($"没有找到类型{toType.FullName}的公共构造函数。"); + } + ctor = toType.GetConstructors().OrderByDescending(x => x.GetParameters().Length).First(); + } + else + { + if (ops == null) + { + ops = ctor.GetCustomAttribute().Ps; + } + } + + DependencyTypeAttribute dependencyTypeAttribute = null; + if (toType.IsDefined(typeof(DependencyTypeAttribute), true)) + { + dependencyTypeAttribute = toType.GetCustomAttribute(); + } + + var parameters = ctor.GetParameters(); + object[] ps = new object[parameters.Length]; + + if (dependencyTypeAttribute == null || dependencyTypeAttribute.Type.HasFlag(DependencyType.Constructor)) + { + for (int i = 0; i < parameters.Length; i++) + { + if (ops != null && ops.Length - 1 >= i) + { + ps[i] = ops[i]; + } + else + { + if (parameters[i].ParameterType.IsPrimitive || parameters[i].ParameterType == typeof(string)) + { + if (parameters[i].HasDefaultValue) + { + ps[i] = parameters[i].DefaultValue; + } + else + { + ps[i] = default; + } + } + else + { + if (parameters[i].IsDefined(typeof(DependencyParamterInjectAttribute), true)) + { + DependencyParamterInjectAttribute attribute = parameters[i].GetCustomAttribute(); + Type type = attribute.Type == null ? parameters[i].ParameterType : attribute.Type; + + if (attribute.ResolveNullIfNoRegistered && !IsRegistered(type, attribute.Key)) + { + ps[i] = default; + } + else + { + ps[i] = Resolve(type, attribute.Ps, attribute.Key); + } + } + else + { + ps[i] = Resolve(parameters[i].ParameterType, null); + } + } + } + } + } + object instance = Activator.CreateInstance(toType, ps); + + if (dependencyTypeAttribute == null || dependencyTypeAttribute.Type.HasFlag(DependencyType.Property)) + { + var propetys = toType.GetProperties().Where(x => x.IsDefined(typeof(DependencyInjectAttribute), true)); + foreach (var item in propetys) + { + if (item.CanWrite) + { + object obj; + if (item.IsDefined(typeof(DependencyParamterInjectAttribute), true)) + { + DependencyParamterInjectAttribute attribute = item.GetCustomAttribute(); + Type type = attribute.Type == null ? item.PropertyType : attribute.Type; + if (attribute.ResolveNullIfNoRegistered && !IsRegistered(type, attribute.Key)) + { + obj = null; + } + else + { + obj = Resolve(type, attribute.Ps, attribute.Key); + } + } + else + { + obj = Resolve(item.PropertyType, null); + } + item.SetValue(instance, obj); + } + } + } + + if (dependencyTypeAttribute == null || dependencyTypeAttribute.Type.HasFlag(DependencyType.Method)) + { + var methods = toType.GetMethods( BindingFlags.Default| BindingFlags.Instance| BindingFlags.Static| BindingFlags.Public| BindingFlags.NonPublic).Where(x => x.IsDefined(typeof(DependencyInjectAttribute), true)).ToList(); + foreach (var item in methods) + { + parameters = item.GetParameters(); + ops = item.GetCustomAttribute().Ps; + ps = new object[parameters.Length]; + for (int i = 0; i < ps.Length; i++) + { + if (ops != null && ops.Length - 1 >= i) + { + ps[i] = ops[i]; + } + else + { + if (parameters[i].ParameterType.IsPrimitive || parameters[i].ParameterType == typeof(string)) + { + if (parameters[i].HasDefaultValue) + { + ps[i] = parameters[i].DefaultValue; + } + else + { + ps[i] = default; + } + } + else + { + if (parameters[i].IsDefined(typeof(DependencyParamterInjectAttribute), true)) + { + DependencyParamterInjectAttribute attribute = parameters[i].GetCustomAttribute(); + Type type = attribute.Type == null ? parameters[i].ParameterType : attribute.Type; + + if (attribute.ResolveNullIfNoRegistered && !IsRegistered(type, attribute.Key)) + { + ps[i] = default; + } + else + { + ps[i] = Resolve(type, attribute.Ps, attribute.Key); + } + } + else + { + ps[i] = Resolve(parameters[i].ParameterType, null); + } + } + } + } + item.Invoke(instance, ps); + } + } + return instance; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + private IContainerProvider GetScopedContainer() + { + Container container = new Container(); + foreach (var item in m_registrations) + { + if (item.Value.Lifetime == Lifetime.Scoped) + { + container.m_registrations.AddOrUpdate(item.Key, new DependencyDescriptor(item.Value.FromType, item.Value.ToType, Lifetime.Singleton), (k, v) => { return v; }); + } + else + { + container.m_registrations.AddOrUpdate(item.Key, item.Value, (k, v) => { return v; }); + } + } + return new ContainerProvider(container); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs.meta new file mode 100644 index 0000000..dc6af62 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Container.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: de3e23985160a8547975ae6ad6dc6cde +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs new file mode 100644 index 0000000..f0bd344 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs @@ -0,0 +1,360 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// IContainerExtensions + /// + public static class ContainerExtension + { + /// + /// 注册单例 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, TTo instance) + where TFrom : class + where TTo : class, TFrom + { + RegisterSingleton(container, typeof(TFrom), instance); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, object instance) + { + if (instance is null) + { + throw new ArgumentNullException(nameof(instance)); + } + + RegisterSingleton(container, instance.GetType(), instance); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, string key, TTo instance) + where TFrom : class + where TTo : class, TFrom + { + RegisterSingleton(container, typeof(TFrom), instance, key); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, Type fromType, object instance, string key = "") + { + container.Register(new DependencyDescriptor(fromType, instance), key); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, object instance, string key = "") + { + container.Register(new DependencyDescriptor(typeof(TFrom), instance), key); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, object instance, string key = "") + { + container.Register(new DependencyDescriptor(instance.GetType(), instance), key); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, string key = "") + { + container.Register(new DependencyDescriptor(typeof(TFrom), typeof(TFrom), Lifetime.Singleton), key); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, Type fromType, Type toType, string key = "") + { + container.Register(new DependencyDescriptor(fromType, toType, Lifetime.Singleton), key); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container) + where TFrom : class + where TTO : class, TFrom + { + RegisterSingleton(container, typeof(TFrom), typeof(TTO)); + return container; + } + + /// + /// 注册单例 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterSingleton(this IContainer container, string key) + where TFrom : class + where TTO : class, TFrom + { + RegisterSingleton(container, typeof(TFrom), typeof(TTO), key); + return container; + } + + #region Transient + + /// + /// 注册临时映射 + /// + /// + /// + /// + /// + public static IContainer RegisterTransient(this IContainer container) + where TFrom : class + where TTO : class, TFrom + { + RegisterTransient(container, typeof(TFrom), typeof(TTO)); + return container; + } + + /// + /// 注册临时映射 + /// + /// + /// + /// + public static IContainer RegisterTransient(this IContainer container) + where TFrom : class + { + RegisterTransient(container, typeof(TFrom), typeof(TFrom)); + return container; + } + + /// + /// 注册临时映射 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterTransient(this IContainer container, string key) + where TFrom : class + where TTO : class, TFrom + { + RegisterTransient(container, typeof(TFrom), typeof(TTO), key); + return container; + } + + /// + /// 注册临时映射 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterTransient(this IContainer container, Type fromType, Type toType, string key = "") + { + container.Register(new DependencyDescriptor(fromType, toType, Lifetime.Transient), key); + return container; + } + + #endregion Transient + + #region Scoped + + /// + /// 注册区域映射 + /// + /// + /// + /// + /// + public static IContainer RegisterScoped(this IContainer container) + where TFrom : class + where TTO : class, TFrom + { + RegisterScoped(container, typeof(TFrom), typeof(TTO)); + return container; + } + + /// + /// 注册区域映射 + /// + /// + /// + /// + public static IContainer RegisterScoped(this IContainer container) + where TFrom : class + { + RegisterScoped(container, typeof(TFrom), typeof(TFrom)); + return container; + } + + /// + /// 注册区域映射 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterScoped(this IContainer container, string key) + where TFrom : class + where TTO : class, TFrom + { + RegisterScoped(container, typeof(TFrom), typeof(TTO), key); + return container; + } + + /// + /// 注册区域映射 + /// + /// + /// + /// + /// + /// + public static IContainer RegisterScoped(this IContainer container, Type fromType, Type toType, string key = "") + { + container.Register(new DependencyDescriptor(fromType, toType, Lifetime.Scoped), key); + return container; + } + + #endregion Scoped + + /// + /// 创建类型对应的实例 + /// + /// + /// + /// + /// + /// + public static T Resolve(this IContainerProvider container, object[] ps, string key = "") + { + return (T)container.Resolve(typeof(T), ps, key); + } + + /// + /// 创建类型对应的实例 + /// + /// + /// + /// + public static T Resolve(this IContainerProvider container) + { + return Resolve(container, null); + } + + /// + /// 创建类型对应的实例 + /// + /// + /// + /// + /// + public static T Resolve(this IContainerProvider container, string key) + { + return Resolve(container, null, key); + } + + #region Unregister + + /// + /// 移除注册信息 + /// + /// + /// + /// + /// + public static IContainer Unregister(this IContainer container, Type fromType, string key = "") + { + container.Unregister(new DependencyDescriptor(fromType), key); + return container; + } + + /// + /// 移除注册信息 + /// + /// + /// + /// + public static IContainer Unregister(this IContainer container, string key = "") + { + container.Unregister(new DependencyDescriptor(typeof(TFrom)), key); + return container; + } + + #endregion Unregister + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs.meta new file mode 100644 index 0000000..15b5e83 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8bfb279cbc24e14bbfc6057d2e0aae5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs new file mode 100644 index 0000000..2f86e97 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + internal class ContainerProvider : IContainerProvider + { + private readonly Container m_container; + + public ContainerProvider(Container container) + { + m_container = container; + } + + public bool IsRegistered(Type fromType, string key = "") + { + return m_container.IsRegistered(fromType, key); + } + + public object Resolve(Type fromType, object[] ps = null, string key = "") + { + return m_container.Resolve(fromType, ps, key); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs.meta new file mode 100644 index 0000000..2e1d51d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/ContainerProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0264cb9c3033cd742839439d3aed5b7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs new file mode 100644 index 0000000..5ca012e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs @@ -0,0 +1,82 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 注入依赖对象 + /// + public class DependencyDescriptor + { + /// + /// 初始化一个单例实例。 + /// + /// + /// + public DependencyDescriptor(Type fromType, object instance) + { + FromType = fromType; + ToInstance = instance; + Lifetime = Lifetime.Singleton; + ToType = instance.GetType(); + } + + /// + /// 初始化一个完整的服务注册 + /// + /// + /// + /// + public DependencyDescriptor(Type fromType, Type toType, Lifetime lifetime) + { + FromType = fromType; + Lifetime = lifetime; + ToType = toType; + } + + /// + /// 初始化一个简单的的服务描述 + /// + /// + public DependencyDescriptor(Type fromType) + { + FromType = fromType; + } + + /// + /// 实例化工厂委托 + /// + public Func ImplementationFactory { get; set; } + + /// + /// 实例类型 + /// + public Type ToType { get; } + + /// + /// 实例 + /// + public object ToInstance { get; set; } + + /// + /// 生命周期 + /// + public Lifetime Lifetime { get; } + + /// + /// 注册类型 + /// + public Type FromType { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs.meta new file mode 100644 index 0000000..3749ed8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyDescriptor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f034cc669514ae4bac57c93c754d0a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs new file mode 100644 index 0000000..af93d05 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs @@ -0,0 +1,131 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; + +namespace TouchSocket.Core +{ + /// + /// 依赖对象接口 + /// + public interface IDependencyObject : IDisposable + { + /// + /// 获取依赖注入的值 + /// + /// + /// + /// + public TValue GetValue(IDependencyProperty dp); + + /// + /// 是否有值。 + /// + /// + /// + public bool HasValue(IDependencyProperty dp); + + /// + /// 重置属性值。 + /// + /// + /// + /// + public DependencyObject RemoveValue(IDependencyProperty dp); + + /// + /// 设置依赖注入的值 + /// + /// + /// + public DependencyObject SetValue(IDependencyProperty dp, TValue value); + } + + /// + /// 依赖项对象. + /// 线程安全。 + /// + public class DependencyObject : DisposableObject, IDependencyObject, System.IDisposable + { + [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)] + private readonly ConcurrentDictionary m_dp; + + /// + /// 构造函数 + /// + public DependencyObject() + { + m_dp = new ConcurrentDictionary(); + } + + /// + /// 获取依赖注入的值 + /// + /// + /// + public TValue GetValue(IDependencyProperty dp) + { + if (m_dp.TryGetValue(dp, out object value)) + { + return (TValue)value; + } + else + { + return dp.DefauleValue; + } + } + + /// + /// + /// + /// + /// + public bool HasValue(IDependencyProperty dp) + { + return m_dp.ContainsKey(dp); + } + + /// + /// 移除设定值。 + /// + /// + /// + /// + public DependencyObject RemoveValue(IDependencyProperty dp) + { + m_dp.TryRemove(dp, out _); + return this; + } + + /// + /// 设置依赖注入的值 + /// + /// + /// + public DependencyObject SetValue(IDependencyProperty dp, TValue value) + { + m_dp.AddOrUpdate(dp, value, (k, v) => v); + return this; + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + m_dp.Clear(); + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs.meta new file mode 100644 index 0000000..778c865 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7bd9ec7687966154388906e565c4f27f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs new file mode 100644 index 0000000..779a801 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs @@ -0,0 +1,100 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; + +namespace TouchSocket.Core +{ + /// + /// IDependencyProperty + /// + /// + public interface IDependencyProperty + { + /// + /// 默认值 + /// + TValue DefauleValue { get; } + + /// + /// 属性名称 + /// + string Name { get; } + + /// + /// 所属类型 + /// + Type Owner { get; } + } + + /// + /// 依赖项属性 + /// + [DebuggerDisplay("Name={Name},Type={ValueType}")] + public class DependencyProperty : IDependencyProperty + { + /// + /// 属性名称 + /// + protected string m_name; + + /// + /// 所属类型 + /// + protected Type m_owner; + + private TValue m_value; + + /// + /// 依赖项属性 + /// + protected DependencyProperty() + { + } + + /// + /// + /// + public TValue DefauleValue => m_value; + + /// + /// + /// + public string Name => m_name; + + /// + /// + /// + public Type Owner => m_owner; + + /// + /// 注册依赖项属性。 + /// 依赖属性的默认值,可能会应用于所有的 + /// + /// + /// + /// 依赖项属性值,一般该值应该是值类型,因为它可能会被用于多个依赖对象。 + /// + public static DependencyProperty Register(string propertyName, Type owner, TValue value) + { + DependencyProperty dp = new DependencyProperty + { + m_name = propertyName, + m_owner = owner, + m_value = value + }; + return dp; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs.meta new file mode 100644 index 0000000..9592825 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/DependencyProperty.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87a62c0d2b320fe478d78243f28f3fe7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs new file mode 100644 index 0000000..ec7d290 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Collections.Generic; + +namespace TouchSocket.Core +{ + /// + /// 注入容器接口 + /// + public interface IContainer : IContainerProvider, IEnumerable + { + /// + /// 添加类型描述符。 + /// + /// + /// + void Register(DependencyDescriptor descriptor, string key = ""); + + /// + /// 移除注册信息。 + /// + /// + /// + /// + void Unregister(DependencyDescriptor descriptor, string key = ""); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs.meta new file mode 100644 index 0000000..24591f4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 099d0eedf7cc0f642a198ed0b57606a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs new file mode 100644 index 0000000..5b8a7e6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 具有区域效应的容器。 + /// + public interface IContainerProvider + { + /// + /// 创建目标类型的对应实例。 + /// + /// + /// + /// + /// + object Resolve(Type fromType, object[] ps = null, string key = ""); + + /// + /// 判断某类型是否已经注册 + /// + /// + /// + /// + bool IsRegistered(Type fromType, string key = ""); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs.meta new file mode 100644 index 0000000..5d1ed85 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/IContainerProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29dce72fbb2a2da41ac8c1c4b1f0f06e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs new file mode 100644 index 0000000..8f7e195 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 注入项的生命周期。 + /// + public enum Lifetime + { + /// + /// 单例对象 + /// + Singleton, + + /// + /// 以接口为区域实例单例。 + /// + Scoped, + + /// + /// 瞬时对象 + /// + Transient + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs.meta new file mode 100644 index 0000000..faf0698 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Dependency/Lifetime.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33a429f6744d21742a54fe1780c5caad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics.meta new file mode 100644 index 0000000..f64972d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d195625f505972c418bfeb77f3c35ae5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs new file mode 100644 index 0000000..1dbcf0d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 时间测量器 + /// + public class TimeMeasurer + { + /// + /// 开始运行 + /// + /// + /// + public static TimeSpan Run(Action action) + { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); + action?.Invoke(); + stopwatch.Stop(); + return stopwatch.Elapsed; + } + + /// + /// 异步执行 + /// + /// + /// + public static Task RunAsync(Action action) + { + return EasyTask.Run(() => { return Run(action); }); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs.meta new file mode 100644 index 0000000..187662d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Diagnostics/TimeMeasurer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 73324003454d21844970caf2789b9bfa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event.meta new file mode 100644 index 0000000..b085567 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d51bd9f315c6e374a932022464f4a74a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs new file mode 100644 index 0000000..ed0c076 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Core +{ + /// + /// TouchSocketEventArgs + /// + public class TouchSocketEventArgs : EventArgs + { + /// + /// 是否允许操作 + /// + public bool IsPermitOperation { get; set; } + + /// + /// 是否已处理 + /// + public bool Handled { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs.meta new file mode 100644 index 0000000..558ea89 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Event/TouchSocketEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 13ed47e719b3f2847baeab85cfc6459a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions.meta new file mode 100644 index 0000000..1bc010d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 79a71efeac66fe04a80f95a9c6c15ea3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs new file mode 100644 index 0000000..7065102 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 未找到消息异常类 + /// + [Serializable] + public class MessageNotFoundException : Exception + { + /// + ///构造函数 + /// + /// + public MessageNotFoundException(string mes) : base(mes) + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs.meta new file mode 100644 index 0000000..642907d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageNotFoundException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89c549587907a324e8c28d7990d95e98 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs new file mode 100644 index 0000000..5619106 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 消息已注册 + /// + [Serializable] + public class MessageRegisteredException : Exception + { + /// + ///构造函数 + /// + /// + public MessageRegisteredException(string mes) : base(mes) + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs.meta new file mode 100644 index 0000000..eebad67 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Exceptions/MessageRegisteredException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ced5cf610cdb6c546be8e0c9e3083647 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions.meta new file mode 100644 index 0000000..9f817f1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6ba1a6e6ffb43c64383b70e6c6d1af5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs new file mode 100644 index 0000000..4a3ba10 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs @@ -0,0 +1,138 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; + +namespace TouchSocket.Core +{ + /// + /// BytesExtension + /// + public static class BytesExtension + { + #region 字节数组扩展 + + /// + /// 转Base64。 + /// + /// + /// + public static string ToBase64(this byte[] data) + { + return Convert.ToBase64String(data); + } + + /// + /// 索引包含数组。 + /// + /// 例如:在{0,1,2,3,1,2,3}中搜索{1,2},则会返回list:[2,5],均为最后索引的位置。 + /// + /// + /// + /// + /// + /// + /// + public static List IndexOfInclude(this byte[] srcByteArray, int offset, int length, byte[] subByteArray) + { + int subByteArrayLen = subByteArray.Length; + List indexes = new List(); + if (length < subByteArrayLen) + { + return indexes; + } + int hitLength = 0; + for (int i = offset; i < length; i++) + { + if (srcByteArray[i] == subByteArray[hitLength]) + { + hitLength++; + } + else + { + hitLength = 0; + } + + if (hitLength == subByteArray.Length) + { + hitLength = 0; + indexes.Add(i); + } + } + + return indexes; + } + + /// + /// 索引第一个包含数组的索引位置,例如:在{0,1,2,3,1,2,3}中索引{2,3},则返回3。 + /// 如果目标数组为null或长度为0,则直接返回offset的值 + /// + /// + /// + /// + /// + /// + public static int IndexOfFirst(this byte[] srcByteArray, int offset, int length, byte[] subByteArray) + { + if (length < subByteArray.Length) + { + return -1; + } + if (subByteArray == null || subByteArray.Length == 0) + { + return offset; + } + int hitLength = 0; + for (int i = offset; i < length + offset; i++) + { + if (srcByteArray[i] == subByteArray[hitLength]) + { + hitLength++; + } + else + { + hitLength = 0; + } + + if (hitLength == subByteArray.Length) + { + return i; + } + } + + return -1; + } + + /// + /// 字节数组转16进制字符 + /// + /// + /// + /// + /// + /// + public static string ByBytesToHexString(this byte[] buffer, int offset, int length, string splite = default) + { + if (string.IsNullOrEmpty(splite)) + { + return BitConverter.ToString(buffer, offset, length).Replace("-", string.Empty); + } + else + { + return BitConverter.ToString(buffer, offset, length).Replace("-", splite); + } + } + + #endregion 字节数组扩展 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs.meta new file mode 100644 index 0000000..2f8c244 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/BytesExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 667ac3320d2a61f4d9cacb0c0003dc2e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs new file mode 100644 index 0000000..e680ec9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs @@ -0,0 +1,122 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; + +namespace TouchSocket.Core +{ + /// + /// DictionaryExtension + /// + public static class DictionaryExtension + { + #region 字典扩展 + + /// + /// 移除满足条件的项目。 + /// + /// + /// + /// + /// + /// + public static int Remove(this ConcurrentDictionary pairs, Func, bool> func) + { + List list = new List(); + foreach (var item in pairs) + { + if (func?.Invoke(item) == true) + { + list.Add(item.Key); + } + } + + int count = 0; + foreach (var item in list) + { + if (pairs.TryRemove(item, out _)) + { + count++; + } + } + return count; + } + +#if NET45_OR_GREATER || NETSTANDARD2_0_OR_GREATER + + /// + /// 尝试添加 + /// + /// + /// + /// + /// + /// + /// + public static bool TryAdd(this Dictionary dictionary, Tkey tkey, TValue value) + { + if (dictionary.ContainsKey(tkey)) + { + return false; + } + dictionary.Add(tkey, value); + return true; + } + +#endif + + /// + /// 尝试添加 + /// + /// + /// + /// + /// + /// + /// + public static void AddOrUpdate(this Dictionary dictionary, Tkey tkey, TValue value) + { + if (dictionary.ContainsKey(tkey)) + { + dictionary[tkey] = value; + } + else + { + dictionary.Add(tkey, value); + } + } + + /// + /// 获取值。如果键不存在,则返回默认值。 + /// + /// + /// + /// + /// + /// + public static TValue GetValue(this Dictionary dictionary, Tkey tkey) + { + if (dictionary.TryGetValue(tkey, out TValue value)) + { + return value; + } + else + { + return default; + } + } + + #endregion 字典扩展 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs.meta new file mode 100644 index 0000000..0464127 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/DictionaryExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b762d8d27a4b36b49aeb4ce5e2d3a2d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs new file mode 100644 index 0000000..e246817 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ +#if NETCOREAPP3_1_OR_GREATER + /// + /// RangeExtension + /// + public static class RangeExtension + { + /// + /// 枚举扩展 + /// + /// + /// + public static CustomIntEnumerator GetEnumerator(this Range range) + { + return new CustomIntEnumerator(range); + } + } + + /// + /// CustomIntEnumerator + /// + public ref struct CustomIntEnumerator + { + private int m_current; + private readonly int m_end; + + /// + /// CustomIntEnumerator + /// + /// + public CustomIntEnumerator(Range range) + { + if (range.End.IsFromEnd) + { + throw new NotSupportedException("不支持无限枚举。"); + } + m_current = range.Start.Value - 1; + m_end = range.End.Value; + } + + /// + /// Current + /// + public int Current => m_current; + + /// + /// MoveNext + /// + /// + public bool MoveNext() + { + m_current++; + return m_current <= m_end; + } + } +#endif +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs.meta new file mode 100644 index 0000000..dd1e25e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/RangeExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: adb06f75961768a44b4bec46b1d0994e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs new file mode 100644 index 0000000..4cc3bb4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs @@ -0,0 +1,349 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; + +namespace TouchSocket.Core +{ + /// + /// StringExtension + /// + public static class StringExtension + { + /// + /// IsNullOrEmpty + /// + /// + /// + public static bool IsNullOrEmpty(this string str) + { + return string.IsNullOrEmpty(str); + } + + /// + /// IsNullOrWhiteSpace + /// + /// + /// + public static bool IsNullOrWhiteSpace(this string str) + { + return string.IsNullOrWhiteSpace(str); + } + + /// + /// 当不为null,且不为空。 + /// + /// + /// + public static bool HasValue(this string str) + { + return !string.IsNullOrWhiteSpace(str); + } + + /// + /// 将字符串格式化成指定的数据类型 + /// + /// + /// + /// + /// + /// + public static bool TryParseToType(string str, Type type, out object value, char[] splits = default) + { + if (string.IsNullOrEmpty(str)) + { + value = default; + return true; + } + + if (type == null) + { + value = str; + return true; + } + if (type.IsArray) + { + Type elementType = type.GetElementType(); + string[] strs; + if (splits == null) + { + strs = str.Split(new char[] { ' ', ';', '-', '/' }); + } + else + { + strs = str.Split(splits); + } + + Array array = Array.CreateInstance(elementType, strs.Length); + for (int i = 0, c = strs.Length; i < c; ++i) + { + object o; + if (ConvertSimpleType(strs[i], elementType, out o)) + { + array.SetValue(o, i); + } + else + { + value = default; + return false; + } + } + value = array; + return true; + } + return ConvertSimpleType(str, type, out value); + } + + private static bool ConvertSimpleType(string value, Type destinationType, out object returnValue) + { + if ((value == null) || destinationType.IsInstanceOfType(value)) + { + returnValue = value; + return true; + } + + if (string.IsNullOrEmpty(value)) + { + returnValue = default; + return true; + } + TypeConverter converter = TypeDescriptor.GetConverter(destinationType); + bool flag = converter.CanConvertFrom(value.GetType()); + if (!flag) + { + converter = TypeDescriptor.GetConverter(value.GetType()); + } + if (!flag && !converter.CanConvertTo(destinationType)) + { + returnValue = default; + return false; + } + try + { + returnValue = flag ? converter.ConvertFrom(null, null, value) : converter.ConvertTo(null, null, value, destinationType); + } + catch + { + returnValue = default; + return false; + } + return true; + } + + /// + /// 判断字符串compare 在 input字符串中出现的次数 + /// + /// 源字符串 + /// 用于比较的字符串 + /// 字符串compare 在 input字符串中出现的次数 + public static int HitStringCount(this string input, string compare) + { + int index = input.IndexOf(compare); + if (index != -1) + { + return 1 + HitStringCount(input.Substring(index + compare.Length), compare); + } + else + { + return 0; + } + } + + /// + /// 将字符转换为对应的基础类型类型。 + /// + /// + /// 目标类型必须为基础类型 + /// + public static object ParseToType(this string value, Type destinationType) + { + object returnValue; + if ((value == null) || destinationType.IsInstanceOfType(value)) + { + return value; + } + string str = value; + if ((str != null) && (str.Length == 0)) + { + return null; + } + TypeConverter converter = TypeDescriptor.GetConverter(destinationType); + bool flag = converter.CanConvertFrom(value.GetType()); + if (!flag) + { + converter = TypeDescriptor.GetConverter(value.GetType()); + } + if (!flag && !converter.CanConvertTo(destinationType)) + { + throw new InvalidOperationException("无法转换成类型:" + value.ToString() + "==>" + destinationType); + } + try + { + returnValue = flag ? converter.ConvertFrom(null, null, value) : converter.ConvertTo(null, null, value, destinationType); + } + catch (Exception e) + { + throw new InvalidOperationException(" 类型转换出错:" + value.ToString() + "==>" + destinationType, e); + } + return returnValue; + } + + /// + /// 只按第一个匹配项分割 + /// + /// + /// + /// + public static string[] SplitFirst(this string str, char split) + { + List s = new List(); + int index = str.IndexOf(split); + if (index > 0) + { + s.Add(str.Substring(0, index).Trim()); + s.Add(str.Substring(index + 1, str.Length - index - 1).Trim()); + } + + return s.ToArray(); + } + + /// + /// 按字符串分割 + /// + /// + /// + /// + public static string[] Split(this string str, string pattern) + { + return Regex.Split(str, pattern); + } + + /// + /// 只按最后一个匹配项分割 + /// + /// + /// + /// + public static string[] SplitLast(this string str, char split) + { + List s = new List(); + int index = str.LastIndexOf(split); + if (index > 0) + { + s.Add(str.Substring(0, index).Trim()); + s.Add(str.Substring(index + 1, str.Length - index - 1).Trim()); + } + + return s.ToArray(); + } + + /// + /// 按格式填充 + /// + /// + /// + /// + public static string Format(this string str, params object[] ps) + { + if (ps == null || ps.Length == 0) + { + return str; + } + try + { + return string.Format(str, ps); + } + catch + { + return str; + } + } + + /// + /// 转换为SHA1。 + /// + /// + /// + /// + public static byte[] ToSha1(this string value, Encoding encoding) + { + using (SHA1 sha1 = SHA1.Create()) + { + return sha1.ComputeHash(encoding.GetBytes(value)); + } + } + + /// + /// 转换为UTF-8数据,效果等于 + /// + /// + /// + public static byte[] ToUTF8Bytes(this string value) + { + return Encoding.UTF8.GetBytes(value); + } + + /// + /// 将16进制的字符转换为数组。 + /// + /// + /// + /// + public static byte[] ByHexStringToBytes(this string hexString, string splite = default) + { + if (!string.IsNullOrEmpty(splite)) + { + hexString = hexString.Replace(splite, string.Empty); + } + + if ((hexString.Length % 2) != 0) + { + hexString += " "; + } + byte[] returnBytes = new byte[hexString.Length / 2]; + for (int i = 0; i < returnBytes.Length; i++) + { + returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); + } + return returnBytes; + } + + /// + /// 将16进制的字符转换为int32。 + /// + /// + /// + public static int ByHexStringToInt32(this string hexString) + { + if (string.IsNullOrEmpty(hexString)) + { + return default; + } + return int.Parse(hexString, System.Globalization.NumberStyles.HexNumber); + } + + /// + /// 从Base64转到数组。 + /// + /// + /// + public static byte[] ByBase64ToBytes(this string value) + { + return Convert.FromBase64String(value); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs.meta new file mode 100644 index 0000000..5a3fac2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/StringExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c372b0b63ec90a84f91d670dfa3a4081 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs new file mode 100644 index 0000000..89e8a7d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs @@ -0,0 +1,172 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Globalization; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// 为System提供扩展。 + /// + public static class SystemExtensions + { + #region 其他 + + /// + /// 安全性释放(不用判断对象是否为空)。不会抛出任何异常。 + /// + /// + /// + public static void SafeDispose(this IDisposable dis) + { + if (dis == default) + { + return; + } + try + { + dis.Dispose(); + } + catch + { + } + } + + #endregion 其他 + + /// + /// 获取自定义attribute + /// + /// + /// + /// + public static T GetAttribute(this Enum enumObj) where T : Attribute + { + Type type = enumObj.GetType(); + Attribute attr = null; + string enumName = Enum.GetName(type, enumObj); //获取对应的枚举名 + FieldInfo field = type.GetField(enumName); + attr = field.GetCustomAttribute(typeof(T), false); + return (T)attr; + } + + /// + /// 格林尼治标准时间 + /// + /// + /// + /// + public static string ToGMTString(this DateTime dt, string v) + { + return dt.ToString("r", CultureInfo.InvariantCulture); + } + +#if !NETCOREAPP3_1_OR_GREATER + + /// + /// 清除所有成员 + /// + /// + /// + public static void Clear(this ConcurrentQueue queue) + { + while (queue.TryDequeue(out _)) + { + } + } + +#endif + + /// + /// 清除所有成员 + /// + /// + /// + /// + public static void Clear(this ConcurrentQueue queue, Action action) + { + while (queue.TryDequeue(out T t)) + { + action?.Invoke(t); + } + } + + /// + /// 获取字节中的指定Bit的值 + /// + /// 字节 + /// Bit的索引值(0-7) + /// + public static int GetBit(this byte @this, short index) + { + byte x; + switch (index) + { + case 0: { x = 0x01; } break; + case 1: { x = 0x02; } break; + case 2: { x = 0x04; } break; + case 3: { x = 0x08; } break; + case 4: { x = 0x10; } break; + case 5: { x = 0x20; } break; + case 6: { x = 0x40; } break; + case 7: { x = 0x80; } break; + default: { return 0; } + } + return (@this & x) == x ? 1 : 0; + } + + /// + /// 设置字节中的指定Bit的值 + /// + /// 字节 + /// Bit的索引值(0-7) + /// Bit值(0,1) + /// + public static byte SetBit(this byte @this, short index, int bitvalue) + { + var _byte = @this; + if (bitvalue == 1) + { + switch (index) + { + case 0: { return _byte |= 0x01; } + case 1: { return _byte |= 0x02; } + case 2: { return _byte |= 0x04; } + case 3: { return _byte |= 0x08; } + case 4: { return _byte |= 0x10; } + case 5: { return _byte |= 0x20; } + case 6: { return _byte |= 0x40; } + case 7: { return _byte |= 0x80; } + default: { return _byte; } + } + } + else + { + switch (index) + { + case 0: { return _byte &= 0xFE; } + case 1: { return _byte &= 0xFD; } + case 2: { return _byte &= 0xFB; } + case 3: { return _byte &= 0xF7; } + case 4: { return _byte &= 0xEF; } + case 5: { return _byte &= 0xDF; } + case 6: { return _byte &= 0xBF; } + case 7: { return _byte &= 0x7F; } + default: { return _byte; } + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs.meta new file mode 100644 index 0000000..a3056a1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f993384dba1663b48885d71456789851 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs new file mode 100644 index 0000000..a9b65ad --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs @@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Net; + +namespace TouchSocket.Core +{ + /// + /// 其他扩展 + /// + public static class SystemNetExtension + { + /// + /// 从中获得IP地址。 + /// + /// + /// + public static string GetIP(this EndPoint endPoint) + { + int r = endPoint.ToString().LastIndexOf(":"); + return endPoint.ToString().Substring(0, r); + } + + /// + /// 从中获得Port。 + /// + /// + /// + public static int GetPort(this EndPoint endPoint) + { + int r = endPoint.ToString().LastIndexOf(":"); + return Convert.ToInt32(endPoint.ToString().Substring(r + 1, endPoint.ToString().Length - (r + 1))); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs.meta new file mode 100644 index 0000000..9424278 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/SystemNetExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d39f30142d2e52b46a6c67313614eeb8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs new file mode 100644 index 0000000..225fe3c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// TaskExtension + /// + public static class TaskExtension + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs.meta new file mode 100644 index 0000000..09722ea --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TaskExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71eeda66e8a7cec49a690c2c888246d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs new file mode 100644 index 0000000..e9fcd72 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 元组扩展 + /// + public static class TupleExtension + { + /// + /// 获取元组的名称列表。 + /// + /// + /// + public static IEnumerable GetTupleElementNames(this ParameterInfo parameter) + { + return ((dynamic)parameter.GetCustomAttribute(Type.GetType("System.Runtime.CompilerServices.TupleElementNamesAttribute")))?.TransformNames; + } + + /// + /// 获取元组的名称列表。 + /// + /// + /// + public static IEnumerable GetTupleElementNames(this MemberInfo memberInfo) + { + return ((dynamic)memberInfo.GetCustomAttribute(Type.GetType("System.Runtime.CompilerServices.TupleElementNamesAttribute")))?.TransformNames; + } + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs.meta new file mode 100644 index 0000000..dc0fde5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TupleExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9598972fcc5848b49ab9164178b7dbe7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs new file mode 100644 index 0000000..b38d6e7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs @@ -0,0 +1,140 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Linq; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// TypeExtension + /// + public static class TypeExtension + { + #region Type扩展 + + /// + /// 获取类型 + /// + /// + /// + public static Type GetRefOutType(this Type type) + { + if (type.IsByRef) + { + return type.GetElementType(); + } + else + { + return type; + } + } + + /// + /// 获取默认值 + /// + /// + /// + public static object GetDefault(this Type targetType) + { + return targetType.IsValueType ? Activator.CreateInstance(targetType) : null; + } + + /// + /// 判断是否为静态类。 + /// + /// + /// + public static bool IsStatic(this Type targetType) + { + return targetType.IsAbstract && targetType.IsSealed; + } + + /// + /// 判断为结构体 + /// + /// + /// + public static bool IsStruct(this Type targetType) + { + if (!targetType.IsPrimitive && !targetType.IsClass && !targetType.IsEnum && targetType.IsValueType) + { + return true; + } + return false; + } + + /// + /// 判断该类型是否为可空类型 + /// + /// + /// + public static bool IsNullableType(this Type theType) + { + return (theType.IsGenericType && theType. + GetGenericTypeDefinition().Equals + (TouchSocketCoreUtility.nullableType)); + } + + /// + /// 判断该类型是否为可空类型 + /// + /// + /// + public static bool IsNullableType(this PropertyInfo propertyInfo) + { + var att = propertyInfo.CustomAttributes.FirstOrDefault(a => a.AttributeType.FullName == "System.Runtime.CompilerServices.NullableAttribute"); + if (att!=null) + { + return true; + } + + return (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType. + GetGenericTypeDefinition().Equals + (TouchSocketCoreUtility.nullableType)); + } + + /// + /// 判断该类型是否为可空类型 + /// + /// + /// + public static bool IsNullableType(this FieldInfo fieldInfo) + { + var att = fieldInfo.CustomAttributes.FirstOrDefault(a => a.AttributeType.FullName == "System.Runtime.CompilerServices.NullableAttribute"); + if (att != null) + { + return true; + } + + return (fieldInfo.FieldType.IsGenericType && fieldInfo.FieldType. + GetGenericTypeDefinition().Equals + (TouchSocketCoreUtility.nullableType)); + } + + /// + /// 判断该类型是否为值元组类型 + /// + /// + /// + public static bool IsValueTuple(this Type theType) + { + return theType.IsValueType && + theType.IsGenericType && + theType.FullName.StartsWith("System.ValueTuple"); + } + + #endregion Type扩展 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs.meta new file mode 100644 index 0000000..ff3e50c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Extensions/TypeExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 64cae39c99cc66f46a72eb371110ace1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO.meta new file mode 100644 index 0000000..39bf3e6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 852b3a2c82724c54d8cdc6007563fba0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs new file mode 100644 index 0000000..c92dea9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs @@ -0,0 +1,216 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 阻塞式单项读取流。 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public abstract partial class BlockReadStream : Stream, IWrite + { + private readonly AutoResetEvent m_inputEvent; + private readonly AutoResetEvent m_readEvent; + private byte[] m_buffer; + private bool m_dis; + private volatile int m_length; + private volatile int m_offset; + + /// + /// 构造函数 + /// + public BlockReadStream() + { + m_readEvent = new AutoResetEvent(false); + m_inputEvent = new AutoResetEvent(false); + ReadTimeout = 5000; + } + + /// + /// + /// + /// + public virtual void Write(byte[] buffer) + { + Write(buffer, 0, buffer.Length); + } + + /// + /// 还剩余的未读取的长度 + /// + public int CanReadLen + { + get + { + if (m_dis) + { + return 0; + } + return m_length - m_offset; + } + } + + /// + /// 不可使用 + /// + public override bool CanSeek => false; + + /// + /// 不可使用 + /// + public override long Length => throw new NotImplementedException(); + + /// + /// 不可使用 + /// + public override long Position { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + /// + /// + /// + public override int ReadTimeout { get; set; } + + /// + /// 阻塞读取。 + /// + /// + /// + /// + /// + public override int Read(byte[] buffer, int offset, int count) + { + if (!CanRead) + { + throw new Exception("该流不允许读取。"); + } + int r; + if (m_length > 0) + { + if (m_length > count) + { + //按count读取 + Array.Copy(m_buffer, m_offset, buffer, offset, count); + m_length -= count; + m_offset += count; + r = count; + } + else + { + //会读完本次 + Array.Copy(m_buffer, m_offset, buffer, offset, m_length); + r = m_length; + Reset(); + } + } + else + { + //无数据,须等待 + if (m_readEvent.WaitOne(ReadTimeout)) + { + if (m_length == 0) + { + Reset(); + r = 0; + } + else if (m_length > count) + { + //按count读取 + Array.Copy(m_buffer, m_offset, buffer, offset, count); + m_length -= count; + m_offset += count; + r = count; + } + else + { + //会读完本次 + Array.Copy(m_buffer, m_offset, buffer, offset, m_length); + r = m_length; + Reset(); + } + } + else + { + throw new TimeoutException(); + } + } + return r; + } + + /// + /// 不可使用 + /// + /// + /// + /// + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + /// + /// 不可使用 + /// + /// + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (m_dis) + { + return; + } + m_dis = true; + Reset(); + m_readEvent.SafeDispose(); + m_inputEvent.SafeDispose(); + base.Dispose(disposing); + } + + /// + /// 传输输入. + /// 必须以length为0结束。读取端会超时。 + /// + /// + /// + /// + /// + protected bool Input(byte[] buffer, int offset, int length) + { + m_inputEvent.Reset(); + m_buffer = buffer; + m_offset = offset; + m_length = length; + m_readEvent.Set(); + return m_inputEvent.WaitOne(ReadTimeout); + } + + private void Reset() + { + m_buffer = null; + m_offset = 0; + m_length = 0; + m_readEvent.Reset(); + m_inputEvent.Set(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs.meta new file mode 100644 index 0000000..8a97d72 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReadStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c41fb3e25f562a14dbe3a55919bc1962 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs new file mode 100644 index 0000000..6f2f4db --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs @@ -0,0 +1,206 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 阻塞式读取。 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public abstract partial class BlockReader : DisposableObject + { + private byte[] m_buffer; + private readonly AutoResetEvent m_inputEvent; + private volatile int m_offset; + private readonly AutoResetEvent m_readEvent; + private volatile int m_surLength; + + /// + /// 构造函数 + /// + public BlockReader() + { + m_readEvent = new AutoResetEvent(false); + m_inputEvent = new AutoResetEvent(false); + ReadTimeout = 5000; + } + + /// + /// 可读 + /// + public abstract bool CanRead { get; } + + /// + /// + /// + public int ReadTimeout { get; set; } + + /// + /// 阻塞读取,但不会移动游标。 + /// + /// + /// + /// + /// + public virtual int PeekRead(byte[] buffer, int offset, int count) + { + return PrivateRead(true, buffer, offset, count); + } + + /// + /// 阻塞读取。 + /// + /// + /// + /// + /// + public virtual int Read(byte[] buffer, int offset, int count) + { + return PrivateRead(false, buffer, offset, count); + } + + private int PrivateRead(bool peek, byte[] buffer, int offset, int count) + { + if (!CanRead) + { + throw new Exception("该流不允许读取。"); + } + int r; + if (m_surLength > 0) + { + if (m_surLength > count) + { + //按count读取 + Array.Copy(m_buffer, m_offset, buffer, offset, count); + if (!peek) + { + m_surLength -= count; + m_offset += count; + } + r = count; + } + else + { + //会读完本次 + Array.Copy(m_buffer, m_offset, buffer, offset, m_surLength); + r = m_surLength; + if (!peek) + { + Reset(); + } + } + } + else + { + //无数据,须等待 + if (m_readEvent.WaitOne(ReadTimeout)) + { + if (m_surLength == 0) + { + Reset(); + r = 0; + } + else if (m_surLength > count) + { + //按count读取 + Array.Copy(m_buffer, m_offset, buffer, offset, count); + if (!peek) + { + m_surLength -= count; + m_offset += count; + } + r = count; + } + else + { + //会读完本次 + Array.Copy(m_buffer, m_offset, buffer, offset, m_surLength); + r = m_surLength; + if (!peek) + { + Reset(); + } + } + } + else + { + throw new TimeoutException(); + } + } + return r; + } + + /// + /// 传输输入. + /// 当以length为0结束。 + /// 否则读取端会超时。 + /// + /// + /// + /// + /// + protected bool Input(byte[] buffer, int offset, int length) + { + //if (this.disposedValue) + //{ + // return false; + //} + m_inputEvent.Reset(); + m_buffer = buffer; + m_offset = offset; + m_surLength = length; + m_readEvent.Set(); + return m_inputEvent.WaitOne(ReadTimeout); + } + + /// + /// 输入完成 + /// + protected bool InputComplate() + { + return Input(new byte[0], 0, 0); + } + + private void Reset() + { + m_buffer = null; + m_offset = 0; + m_surLength = 0; + m_readEvent.Reset(); + m_inputEvent.Set(); + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + Reset(); + m_readEvent.SafeDispose(); + m_inputEvent.SafeDispose(); + base.Dispose(disposing); + } + + /// + /// 析构函数 + /// + ~BlockReader() + { + // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 + Dispose(disposing: false); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs.meta new file mode 100644 index 0000000..9374cf1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/BlockReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07155df3ffae6224280dc4d98559d594 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs new file mode 100644 index 0000000..ae77eb0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs @@ -0,0 +1,160 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace TouchSocket.Core +{ + /// + /// 控制台行为 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial class ConsoleAction + { + private readonly string helpOrder; + + /// + /// 构造函数 + /// + /// 帮助信息指令,如:"h|help|?" + public ConsoleAction(string helpOrder = "h|help|?") + { + this.helpOrder = helpOrder; + + Add(helpOrder, "帮助信息", ShowAll); + + string title = $@" + + _______ _ _____ _ _ + |__ __| | | / ____| | | | | + | | ___ _ _ ___ | |__ | (___ ___ ___ | | __ ___ | |_ + | | / _ \ | | | | / __|| '_ \ \___ \ / _ \ / __|| |/ // _ \| __| + | || (_) || |_| || (__ | | | | ____) || (_) || (__ | <| __/| |_ + |_| \___/ \__,_| \___||_| |_||_____/ \___/ \___||_|\_\\___| \__| + + ------------------------------------------------------------------- + Author : 若汝棋茗 + Version : {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()} + Gitee : https://gitee.com/rrqm_home + Github : https://github.com/rrqm + API : https://www.yuque.com/rrqm/touchsocket/index + ------------------------------------------------------------------- +"; + Console.WriteLine(title); + } + + /// + /// 显示所有注册指令 + /// + public void ShowAll() + { + int max = actions.Values.Max(a => a.FullOrder.Length) + 8; + + List s = new List(); + foreach (var item in actions) + { + if (!s.Contains(item.Value.FullOrder.ToLower())) + { + s.Add(item.Value.FullOrder.ToLower()); + Console.Write($"[{item.Value.FullOrder}]"); + for (int i = 0; i < max - item.Value.FullOrder.Length; i++) + { + Console.Write("-"); + } + Console.WriteLine(item.Value.Description); + } + } + } + + /// + /// 帮助信息指令 + /// + public string HelpOrder => helpOrder; + + private readonly Dictionary actions = new Dictionary(); + + /// + /// 添加 + /// + /// 指令,多个指令用“|”分割 + /// 描述 + /// + public void Add(string order, string description, Action action) + { + string[] orders = order.ToLower().Split('|'); + foreach (var item in orders) + { + actions.Add(item, new VAction(description, order, action)); + } + } + + /// + /// 执行异常 + /// + public event Action OnException; + + /// + /// 执行,返回值仅表示是否有这个指令,异常获取请使用 + /// + /// + /// + public bool Run(string order) + { + if (actions.TryGetValue(order.ToLower(), out VAction vAction)) + { + try + { + vAction.Action.Invoke(); + } + catch (Exception ex) + { + OnException?.Invoke(ex); + } + return true; + } + else + { + return false; + } + } + } + + internal struct VAction + { + private readonly Action action; + + public Action Action => action; + + private readonly string fullOrder; + + public string FullOrder => fullOrder; + + private readonly string description; + + /// + /// 构造函数 + /// + /// + /// + /// + public VAction(string description, string fullOrder, Action action) + { + this.fullOrder = fullOrder; + this.action = action ?? throw new ArgumentNullException(nameof(action)); + this.description = description ?? throw new ArgumentNullException(nameof(description)); + } + + public string Description => description; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs.meta new file mode 100644 index 0000000..ef43a8f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/ConsoleAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bfbf708129fcd8b4eb86280cf05db254 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs new file mode 100644 index 0000000..a8e3c88 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.IO; +using System.Linq; + +namespace TouchSocket.Core +{ + /// + /// DirectoryUtility + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public static partial class DirectoryUtility + { + /// + /// 复制文件夹及文件 + /// + /// 原文件路径 + /// 目标文件路径 + /// + public static void CopyDirectory(string sourceFolder, string destFolder) + { + //如果目标路径不存在,则创建目标路径 + if (!Directory.Exists(destFolder)) + { + Directory.CreateDirectory(destFolder); + } + //得到原文件根目录下的所有文件 + string[] files = Directory.GetFiles(sourceFolder); + foreach (string file in files) + { + string name = Path.GetFileName(file); + string dest = Path.Combine(destFolder, name); + File.Copy(file, dest);//复制文件 + } + //得到原文件根目录下的所有文件夹 + string[] folders = Directory.GetDirectories(sourceFolder); + foreach (string folder in folders) + { + string name = Path.GetFileName(folder); + string dest = Path.Combine(destFolder, name); + CopyDirectory(folder, dest);//构建目标路径,递归复制文件 + } + } + + /// + /// 获取文件夹下的一级文件夹目录名称,不含子文件夹。 + /// + /// + public static string[] GetDirectories(string sourceFolder) + { + return Directory.GetDirectories(sourceFolder) + .Select(s => Path.GetFileName(s)) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs.meta new file mode 100644 index 0000000..a077b5f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/DirectoryUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a171e63ffe1c564ab32ab60cdf34778 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO.meta new file mode 100644 index 0000000..cec201f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a13097dbf6814d48bb1cd58e9dc4682 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs new file mode 100644 index 0000000..b2d1150 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs @@ -0,0 +1,341 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using TouchSocket.Resources; + +namespace TouchSocket.Core +{ + /// + /// 文件池。 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public static partial class FilePool + { + private static readonly object m_locker = new object(); + + private static readonly ConcurrentDictionary m_pathStorage = new ConcurrentDictionary(); + + private static readonly Timer m_timer; + + static FilePool() + { + m_timer = new Timer(OnTimer, null, 60000, 60000); + } + + /// + /// 获取所有的路径。 + /// + /// + public static string[] GetAllPaths() + { + return m_pathStorage.Keys.ToArray(); + } + + /// + /// 加载文件为读取流 + /// + /// + /// + /// + /// + public static FileStorage GetFileStorageForRead(string path) + { + if (string.IsNullOrEmpty(path)) + { + throw new System.ArgumentException($"“{nameof(path)}”不能为 null 或空。", nameof(path)); + } + return GetFileStorageForRead(new FileInfo(path)); + } + + /// + /// 加载文件为读取流 + /// + /// + /// + /// + public static FileStorage GetFileStorageForRead(FileInfo fileInfo) + { + if (m_pathStorage.TryGetValue(fileInfo.FullName, out FileStorage storage)) + { + if (storage.FileAccess != FileAccess.Read) + { + throw new Exception("该路径的文件已经被加载为仅写入模式。"); + } + Interlocked.Increment(ref storage.m_reference); + return storage; + } + lock (m_locker) + { + storage = new FileStorage(fileInfo, FileAccess.Read); + if (m_pathStorage.TryAdd(fileInfo.FullName, storage)) + { + Interlocked.Increment(ref storage.m_reference); + return storage; + } + else + { + return GetFileStorageForRead(fileInfo); + } + + } + } + + /// + /// 加载文件为写流 + /// + /// + /// + /// + /// + public static FileStorage GetFileStorageForWrite(string path) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentException($"“{nameof(path)}”不能为 null 或空。", nameof(path)); + } + return GetFileStorageForWrite(new FileInfo(path)); + } + + /// + /// 加载文件为写流 + /// + /// + /// + /// + /// + public static FileStorage GetFileStorageForWrite(FileInfo fileInfo) + { + if (m_pathStorage.TryGetValue(fileInfo.FullName, out FileStorage storage)) + { + if (storage.FileAccess != FileAccess.Write) + { + throw new Exception("该路径的文件已经被加载为仅读取模式。"); + } + Interlocked.Increment(ref storage.m_reference); + return storage; + } + lock (m_locker) + { + storage = new FileStorage(fileInfo, FileAccess.Write); + if (m_pathStorage.TryAdd(fileInfo.FullName, storage)) + { + Interlocked.Increment(ref storage.m_reference); + return storage; + } + else + { + return GetFileStorageForWrite(fileInfo); + } + } + } + + /// + /// 获取一个可读可写的Stream对象。 + /// + /// + /// + /// + /// + public static FileStorageStream GetFileStorageStream(string path) + { + return new FileStorageStream(GetFileStorageForWrite(path)); + } + + /// + /// 获取一个可读可写的Stream对象。 + /// + /// + /// + /// + /// + public static FileStorageStream GetFileStorageStream(FileInfo fileInfo) + { + return new FileStorageStream(GetFileStorageForWrite(fileInfo)); + } + + /// + /// 获取一个文件读取访问器 + /// + /// + /// + /// + /// + public static FileStorageReader GetReader(string path) + { + return new FileStorageReader(GetFileStorageForRead(path)); + } + + /// + /// 获取一个文件读取访问器 + /// + /// + /// + /// + /// + public static FileStorageReader GetReader(FileInfo fileInfo) + { + return new FileStorageReader(GetFileStorageForRead(fileInfo)); + } + + /// + /// 获取引用次数。 + /// + /// 必须是全路径。 + /// + /// + /// + public static int GetReferenceCount(string path) + { + if (string.IsNullOrEmpty(path)) + { + return 0; + } + if (m_pathStorage.TryGetValue(path, out FileStorage fileStorage)) + { + return fileStorage.m_reference; + } + return 0; + } + + /// + /// 获取一个文件写入访问器 + /// + /// 路径 + /// + /// + /// + public static FileStorageWriter GetWriter(string path) + { + return new FileStorageWriter(GetFileStorageForWrite(path)); + } + + /// + /// 获取一个文件写入访问器 + /// + /// + /// + /// + /// + public static FileStorageWriter GetWriter(FileInfo fileInfo) + { + return new FileStorageWriter(GetFileStorageForWrite(fileInfo)); + } + + /// + /// 加载文件为缓存读取流 + /// + /// + /// + /// + /// + public static void LoadFileForCacheRead(string path) + { + if (string.IsNullOrEmpty(path)) + { + throw new System.ArgumentException($"“{nameof(path)}”不能为 null 或空。", nameof(path)); + } + + path = Path.GetFullPath(path); + if (m_pathStorage.TryGetValue(path, out FileStorage storage)) + { + if (storage.FileAccess != FileAccess.Read || !storage.Cache) + { + throw new Exception("该路径的文件已经被加载为其他模式。"); + } + return; + } + if (FileStorage.TryCreateCacheFileStorage(path, out FileStorage fileStorage, out string msg)) + { + m_pathStorage.TryAdd(path, fileStorage); + } + else + { + throw new Exception(msg); + } + } + + /// + /// 减少引用次数,并尝试释放流。 + /// + /// + /// 延迟释放时间。当设置为0时,立即释放,单位毫秒。 + /// + /// + /// + public static Result TryReleaseFile(string path, int delayTime = 0) + { + if (string.IsNullOrEmpty(path)) + { + return new Result(ResultCode.Error, TouchSocketStatus.ArgumentNull.GetDescription(nameof(path))); + } + path = Path.GetFullPath(path); + if (m_pathStorage.TryGetValue(path, out FileStorage fileStorage)) + { + if (Interlocked.Decrement(ref fileStorage.m_reference) <= 0) + { + if (delayTime > 0) + { + EasyTask.DelayRun(delayTime, path, (p) => + { + if (GetReferenceCount(p) == 0) + { + if (m_pathStorage.TryRemove((string)p, out fileStorage)) + { + fileStorage.Dispose(); + } + } + }); + return new Result(ResultCode.Success, $"如果在{delayTime}ms后引用仍然为0的话,即被释放。"); + } + else + { + if (m_pathStorage.TryRemove(path, out fileStorage)) + { + fileStorage.Dispose(); + } + return new Result(ResultCode.Success, "流成功释放。"); + } + } + else + { + return new Result(ResultCode.Error, TouchSocketStatus.StreamReferencing.GetDescription(path, fileStorage.m_reference)); + } + } + else + { + return new Result(ResultCode.Success, TouchSocketStatus.StreamNotFind.GetDescription(path)); + } + } + + private static void OnTimer(object state) + { + var keys = new List(); + foreach (KeyValuePair item in m_pathStorage) + { + if (DateTime.Now - item.Value.AccessTime > item.Value.AccessTimeout) + { + keys.Add(item.Key); + } + } + foreach (string item in keys) + { + TryReleaseFile(item); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs.meta new file mode 100644 index 0000000..b6fc31e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FilePool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb9936bb69c614c45af16009af2e4bf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs new file mode 100644 index 0000000..7706ae7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs @@ -0,0 +1,229 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; +using TouchSocket.Resources; + +namespace TouchSocket.Core +{ + /// + /// 文件存储器。在该存储器中,读写线程安全。 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial class FileStorage + { + internal volatile int m_reference; + private readonly ReaderWriterLockSlim m_lockSlim; + private bool m_disposedValue; + private byte[] m_fileData; + + /// + /// 初始化一个文件存储器。在该存储器中,读写线程安全。 + /// + internal FileStorage(FileInfo fileInfo, FileAccess fileAccess) : this() + { + this.FileAccess = fileAccess; + this.FileInfo = fileInfo; + this.Path = fileInfo.FullName; + this.m_reference = 0; + this.FileStream = fileAccess == FileAccess.Read ? fileInfo.OpenRead() : fileInfo.OpenWrite(); + this.m_lockSlim = new ReaderWriterLockSlim(); + } + + private FileStorage() + { + this.AccessTime = DateTime.Now; + this.AccessTimeout = TimeSpan.FromSeconds(60); + } + + /// + /// 最后访问时间。 + /// + public DateTime AccessTime { get; private set; } + + /// + /// 访问超时时间。默认10s + /// + public TimeSpan AccessTimeout { get; set; } + + /// + /// 是否为缓存型。为false时,意味着该文件句柄正在被该程序占用。 + /// + public bool Cache { get; private set; } + + /// + /// 访问属性 + /// + public FileAccess FileAccess { get; private set; } + + /// + /// 文件信息 + /// + public FileInfo FileInfo { get; private set; } + + /// + /// 文件流。 + /// 一般情况下,请不要直接访问该对象。否则有可能会产生不可预测的错误。 + /// + public FileStream FileStream { get; private set; } + + /// + /// 文件长度 + /// + public long Length => this.FileStream.Length; + + /// + /// 文件路径 + /// + public string Path { get; private set; } + + /// + /// 引用次数。 + /// + public int Reference => this.m_reference; + + /// + /// 创建一个只读的、已经缓存的文件信息。该操作不会占用文件句柄。 + /// + /// + /// + /// + /// + public static bool TryCreateCacheFileStorage(string path, out FileStorage fileStorage, out string msg) + { + path = System.IO.Path.GetFullPath(path); + if (!File.Exists(path)) + { + fileStorage = null; + msg = TouchSocketStatus.FileNotExists.GetDescription(path); + return false; + } + try + { + fileStorage = new FileStorage() + { + Cache = true, + FileAccess = FileAccess.Read, + FileInfo = new FileInfo(path), + Path = path, + m_reference = 0, + m_fileData = File.ReadAllBytes(path) + }; + msg = null; + return true; + } + catch (Exception ex) + { + fileStorage = null; + msg = ex.Message; + return false; + } + } + + /// + /// 写入时清空缓存区 + /// + public void Flush() + { + this.AccessTime = DateTime.Now; + this.FileStream.Flush(); + } + + /// + /// 从指定位置,读取数据到缓存区。线程安全。 + /// + /// + /// + /// + /// + /// + public int Read(long stratPos, byte[] buffer, int offset, int length) + { + this.AccessTime = DateTime.Now; + using (var writeLock = new WriteLock(this.m_lockSlim)) + { + if (this.m_disposedValue) + { + throw new ObjectDisposedException(this.GetType().FullName); + } + if (this.FileAccess == FileAccess.Write) + { + throw new Exception("该流不允许读取。"); + } + if (this.Cache) + { + int r = (int)Math.Min(this.m_fileData.Length - stratPos, length); + Array.Copy(this.m_fileData, stratPos, buffer, offset, r); + return r; + } + else + { + this.FileStream.Position = stratPos; + return this.FileStream.Read(buffer, offset, length); + } + } + } + + /// + /// 减少引用次数,并尝试释放流。 + /// + /// 延迟释放时间。当设置为0时,立即释放,单位毫秒。 + /// + /// + /// + public Result TryReleaseFile(int delayTime = 0) + { + return FilePool.TryReleaseFile(this.Path, delayTime); + } + + /// + /// 从指定位置,写入数据到存储区。线程安全。 + /// + /// + /// + /// + /// + public void Write(long stratPos, byte[] buffer, int offset, int length) + { + this.AccessTime = DateTime.Now; + using (var writeLock = new WriteLock(this.m_lockSlim)) + { + if (this.m_disposedValue) + { + throw new ObjectDisposedException(this.GetType().FullName); + } + if (this.FileAccess == FileAccess.Read) + { + throw new Exception("该流不允许写入。"); + } + this.FileStream.Position = stratPos; + this.FileStream.Write(buffer, offset, length); + } + } + + internal void Dispose() + { + if (this.m_disposedValue) + { + return; + } + using (var writeLock = new WriteLock(this.m_lockSlim)) + { + this.m_disposedValue = true; + this.FileStream.SafeDispose(); + this.m_fileData = null; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs.meta new file mode 100644 index 0000000..e76601b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b3f96444ce26074a8125318ae2502cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs new file mode 100644 index 0000000..19badf2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs @@ -0,0 +1,91 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Core +{ + /// + /// 文件读取器 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial class FileStorageReader : DisposableObject + { + + /// + /// 构造函数 + /// + /// + public FileStorageReader(FileStorage fileStorage) + { + this.FileStorage = fileStorage ?? throw new System.ArgumentNullException(nameof(fileStorage)); + } + + /// + /// 析构函数 + /// + ~FileStorageReader() + { + // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 + this.Dispose(disposing: false); + } + + /// + /// 文件存储器 + /// + public FileStorage FileStorage { get; private set; } + + /// + /// 游标位置 + /// + public int Pos + { + get => (int)this.Position; + set => this.Position = value; + } + + /// + /// 游标位置 + /// + public long Position { get; set; } + + /// + /// 读取数据到缓存区 + /// + /// + /// + /// + /// + public int Read(byte[] buffer, int offset, int length) + { + int r = this.FileStorage.Read(this.Position, buffer, offset, length); + this.Position += r; + return r; + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (this.DisposedValue) + { + return; + } + FilePool.TryReleaseFile(this.FileStorage.Path); + this.FileStorage = null; + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs.meta new file mode 100644 index 0000000..3962e34 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59d48b22e5698834785cd77b9d6f2bed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs new file mode 100644 index 0000000..d870648 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs @@ -0,0 +1,152 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.IO; + +namespace TouchSocket.Core +{ + /// + /// FileStorageStream。非线程安全。 + /// + //IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial class FileStorageStream : Stream + { + private long m_position; + + /// + /// 构造函数 + /// + /// + public FileStorageStream(FileStorage fileStorage) + { + this.FileStorage = fileStorage ?? throw new System.ArgumentNullException(nameof(fileStorage)); + } + + /// + /// 析构函数 + /// + ~FileStorageStream() + { + // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 + this.Dispose(disposing: false); + } + + /// + /// + /// + public override bool CanRead => this.FileStorage.FileStream.CanRead; + + /// + /// + /// + public override bool CanSeek => this.FileStorage.FileStream.CanSeek; + + /// + /// + /// + public override bool CanWrite => this.FileStorage.FileStream.CanWrite; + + /// + /// 文件存储器 + /// + public FileStorage FileStorage { get; private set; } + + /// + /// + /// + public override long Length => this.FileStorage.FileStream.Length; + + /// + /// + /// + public override long Position { get => this.m_position; set => this.m_position = value; } + + /// + /// + /// + //[IntelligentCoder.AsyncMethodIgnore] + public override void Flush() + { + this.FileStorage.Flush(); + } + + /// + /// + /// + /// + /// + /// + /// + public override int Read(byte[] buffer, int offset, int count) + { + int r = this.FileStorage.Read(this.m_position, buffer, offset, count); + this.m_position += r; + return r; + } + + /// + /// + /// + /// + /// + /// + public override long Seek(long offset, SeekOrigin origin) + { + switch (origin) + { + case SeekOrigin.Begin: + this.m_position = offset; + break; + + case SeekOrigin.Current: + this.m_position += offset; + break; + + case SeekOrigin.End: + this.m_position = this.Length + offset; + break; + } + return this.m_position; + } + + /// + /// + /// + /// + public override void SetLength(long value) + { + this.FileStorage.FileStream.SetLength(value); + } + + /// + /// + /// + /// + /// + /// + public override void Write(byte[] buffer, int offset, int count) + { + this.FileStorage.Write(this.m_position, buffer, offset, count); + this.m_position += count; + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + FilePool.TryReleaseFile(this.FileStorage.Path); + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs.meta new file mode 100644 index 0000000..fc63407 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5e14e7d2add048b42bf71baf731724c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs new file mode 100644 index 0000000..4f270a8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 文件写入器。 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial class FileStorageWriter : DisposableObject, IWrite + { + + /// + /// 构造函数 + /// + /// + public FileStorageWriter(FileStorage fileStorage) + { + this.FileStorage = fileStorage ?? throw new System.ArgumentNullException(nameof(fileStorage)); + } + + /// + /// + /// + /// + public virtual void Write(byte[] buffer) + { + this.Write(buffer, 0, buffer.Length); + } + + /// + /// 析构函数 + /// + ~FileStorageWriter() + { + // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 + this.Dispose(disposing: false); + } + + /// + /// 文件存储器 + /// + public FileStorage FileStorage { get; private set; } + + /// + /// 游标位置 + /// + public int Pos + { + get => (int)this.Position; + set => this.Position = value; + } + + /// + /// 游标位置 + /// + public long Position { get; set; } + + /// + /// 移动Pos到流末尾 + /// + /// + public long SeekToEnd() + { + return this.Position = this.FileStorage.Length; + } + + /// + /// 读取数据到缓存区 + /// + /// + /// + /// + /// + public void Write(byte[] buffer, int offset, int length) + { + this.FileStorage.Write(this.Position, buffer, offset, length); + this.Position += length; + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (this.DisposedValue) + { + return; + } + FilePool.TryReleaseFile(this.FileStorage.Path); + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs.meta new file mode 100644 index 0000000..a4bb342 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileIO/FileStorageWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65f6c374ae0af4a4799d8c448d1d89fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs new file mode 100644 index 0000000..05488a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs @@ -0,0 +1,313 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security.Cryptography; + +namespace TouchSocket.Core +{ + /// + /// 文件操作 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public static partial class FileUtility + { + /// + /// 获取不重复文件名。 + /// 例如:New.txt已存在时,会返回New(1).txt + /// + /// + /// + public static string GetDuplicateFileName(string fileName) + { + if (!File.Exists(fileName)) + { + return fileName; + } + + int index = 0; + while (true) + { + index++; + string newPath = Path.Combine(Path.GetDirectoryName(fileName), $"{Path.GetFileNameWithoutExtension(fileName)}({index}){Path.GetExtension(fileName)}"); + if (!File.Exists(newPath)) + { + return newPath; + } + } + } + + /// + /// 获取不重复文件夹名称. + /// 例如:NewDir已存在时,会返回NewDir(1) + /// + /// + /// + public static string GetDuplicateDirectoryName(string dirName) + { + if (!Directory.Exists(dirName)) + { + return dirName; + } + + int index = 0; + while (true) + { + index++; + string newPath = Path.Combine(Path.GetDirectoryName(dirName), $"{Path.GetFileNameWithoutExtension(dirName)}({index})"); + if (!System.IO.Directory.Exists(newPath)) + { + return newPath; + } + } + } + + /// + /// 转化为文件大小的字符串,类似10B,10Kb,10Mb,10Gb。 + /// + /// + /// + public static string ToFileLengthString(long length) + { + if (length < 1024) + { + return $"{length}B"; + } + else if (length < 1024 * 1024) + { + return $"{(length / 1024.0).ToString("0.00")}Kb"; + } + else if (length < 1024 * 1024 * 1024) + { + return $"{(length / (1024.0 * 1024)).ToString("0.00")}Mb"; + } + else + { + return $"{(length / (1024.0 * 1024 * 1024)).ToString("0.00")}Gb"; + } + } + + /// + /// 获取文件MD5 + /// + /// + /// + public static string GetFileMD5(string path) + { + using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + return GetStreamMD5(fileStream); + } + } + + /// + /// 获取流MD5 + /// + /// + /// + public static string GetStreamMD5(Stream fileStream) + { + using (HashAlgorithm hash = System.Security.Cryptography.MD5.Create()) + { + return GetStreamHash(fileStream, hash); + } + } + + /// + /// 获得文件Hash值 + /// + /// 文件路径 + /// + public static string GetFileHash256(string filePath) + { + try + { + HashAlgorithm hash = SHA256.Create(); + using (FileStream fileStream = File.OpenRead(filePath)) + { + byte[] HashValue = hash.ComputeHash(fileStream); + return BitConverter.ToString(HashValue).Replace("-", ""); + } + } + catch + { + return null; + } + } + + /// + /// 获得流Hash值 + /// + /// + /// + public static string GetStreamHash256(Stream stream) + { + try + { + HashAlgorithm hash = SHA256.Create(); + byte[] HashValue = hash.ComputeHash(stream); + return BitConverter.ToString(HashValue).Replace("-", ""); + } + catch + { + return null; + } + } + + /// + /// 获得文件Hash值 + /// + /// 文件路径 + /// + /// + public static string GetFileHash(string filePath, HashAlgorithm hash) + { + try + { + using (FileStream fileStream = File.OpenRead(filePath)) + { + byte[] HashValue = hash.ComputeHash(fileStream); + return BitConverter.ToString(HashValue).Replace("-", ""); + } + } + catch + { + return null; + } + } + + /// + /// 获得流Hash值 + /// + /// + /// + /// + public static string GetStreamHash(Stream stream, HashAlgorithm hash) + { + try + { + byte[] HashValue = hash.ComputeHash(stream); + return BitConverter.ToString(HashValue).Replace("-", ""); + } + catch + { + return null; + } + } + + /// + /// 获取仅当前文件夹中包含的文件名称,不含全路径。 + /// + /// + /// + public static string[] GetIncludeFileNames(string dirPath) + { + return Directory.GetFiles(dirPath).Select(s => Path.GetFileName(s)).ToArray(); + } + + /// + /// 获取相对路径。 + /// + /// + /// + /// + /// + public static string GetRelativePath(string relativeTo, string path) + { + if (string.IsNullOrEmpty(relativeTo)) throw new ArgumentNullException(nameof(relativeTo)); + if (string.IsNullOrEmpty(path)) throw new ArgumentNullException(nameof(path)); + + var fromUri = new Uri(relativeTo); + var toUri = new Uri(path); + + if (fromUri.Scheme != toUri.Scheme) + { + // 不是同一种路径,无法转换成相对路径。 + return path; + } + + if (fromUri.Scheme.Equals("file", StringComparison.InvariantCultureIgnoreCase) + && !relativeTo.EndsWith("/", StringComparison.OrdinalIgnoreCase) + && !relativeTo.EndsWith("\\", StringComparison.OrdinalIgnoreCase)) + { + // 如果是文件系统,则视来源路径为文件夹。 + fromUri = new Uri(relativeTo + Path.DirectorySeparatorChar); + } + + var relativeUri = fromUri.MakeRelativeUri(toUri); + var relativePath = Uri.UnescapeDataString(relativeUri.ToString()); + + if (toUri.Scheme.Equals("file", StringComparison.InvariantCultureIgnoreCase)) + { + relativePath = relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); + } + + return relativePath; + } + + /// + /// 删除路径文件 + /// + /// + public static void Delete(string path) + { + if (File.Exists(path)) + { + File.SetAttributes(path, FileAttributes.Normal); + File.Delete(path); + } + } + +# if NET45_OR_GREATER + + [DllImport("kernel32.dll")] + private static extern IntPtr _lopen(string lpPathName, int iReadWrite); + + [DllImport("kernel32.dll")] + private static extern bool CloseHandle(IntPtr hObject); + + private const int OF_READWRITE = 2; + + private const int OF_SHARE_DENY_NONE = 0x40; + + private static readonly IntPtr HFILE_ERROR = new IntPtr(-1); + + /// + /// 判断文件是否被已打开 + /// + /// + /// + public static bool FileIsOpen(string fileFullName) + { + if (!File.Exists(fileFullName)) + { + return false; + } + + IntPtr handle = _lopen(fileFullName, OF_READWRITE | OF_SHARE_DENY_NONE); + + if (handle == HFILE_ERROR) + { + return true; + } + + CloseHandle(handle); + + return false; + } + +#endif + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs.meta new file mode 100644 index 0000000..49ad849 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/FileUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91534d324a6b6e7488e345cca5f1e4c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs new file mode 100644 index 0000000..bef1eaf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs @@ -0,0 +1,126 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.IO; + +namespace TouchSocket.Core +{ + /// + /// 包装的流。为避免该流释放时,内部流也会被释放的问题 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public partial class WrapStream : Stream + { + private readonly Stream m_stream; + + /// + /// 包装的流。为避免该流释放时,内部流也会被释放的问题 + /// + /// + public WrapStream(Stream stream) + { + m_stream = stream; + } + + /// + /// + /// + public override bool CanRead => m_stream.CanRead; + + /// + /// + /// + public override bool CanSeek => m_stream.CanSeek; + + /// + /// + /// + public override bool CanWrite => m_stream.CanWrite; + + /// + /// + /// + public override long Length => m_stream.Length; + + /// + /// + /// + public override long Position { get => m_stream.Position; set => m_stream.Position = value; } + + /// + /// + /// + //[IntelligentCoder.AsyncMethodIgnore] + public override void Flush() + { + m_stream.Flush(); + } + + /// + /// + /// + /// + /// + /// + /// + public override int Read(byte[] buffer, int offset, int count) + { + return m_stream.Read(buffer, offset, count); + } + + /// + /// + /// + /// + /// + /// + public override long Seek(long offset, SeekOrigin origin) + { + return m_stream.Seek(offset, origin); + } + + /// + /// + /// + /// + public override void SetLength(long value) + { + m_stream.SetLength(value); + } + + /// + /// + /// + /// + /// + /// + public override void Write(byte[] buffer, int offset, int count) + { + m_stream.Write(buffer, offset, count); + } + + /// + /// 没有关闭效果 + /// + public override void Close() + { + } + + /// + /// 没有释放效果 + /// + /// + protected override void Dispose(bool disposing) + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs.meta new file mode 100644 index 0000000..6dd8eb4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/IO/WrapStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d32395460d1ec544a48386a8995586a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger.meta new file mode 100644 index 0000000..ccdd43d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 991d90fd8ebba3345a8007bca10caee6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs new file mode 100644 index 0000000..a39ff7e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs @@ -0,0 +1,90 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 控制台日志记录器 + /// + public class ConsoleLogger : LoggerBase + { + static ConsoleLogger() + { + Default = new ConsoleLogger(); + } + private readonly ConsoleColor m_consoleBackgroundColor; + + private readonly ConsoleColor m_consoleForegroundColor; + + /// + /// 初始化一个日志记录器 + /// + public ConsoleLogger() + { + m_consoleForegroundColor = Console.ForegroundColor; + m_consoleBackgroundColor = Console.BackgroundColor; + } + + /// + /// 默认的实例 + /// + public static ConsoleLogger Default { get; } + + /// + /// + /// + /// + /// + /// + /// + protected override void WriteLog(LogType logType, object source, string message, Exception exception) + { + lock (typeof(ConsoleLogger)) + { + Console.Write(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")); + Console.Write(" | "); + switch (logType) + { + case LogType.Warning: + Console.ForegroundColor = ConsoleColor.Yellow; + break; + + case LogType.Error: + Console.ForegroundColor = ConsoleColor.Red; + break; + + case LogType.Info: + default: + Console.ForegroundColor = m_consoleForegroundColor; + break; + } + Console.Write(logType.ToString()); + Console.ForegroundColor = m_consoleForegroundColor; + Console.Write(" | "); + Console.Write(message); + + if (exception != null) + { + Console.Write(" | "); + Console.Write($"【异常消息】:{exception.Message}"); + Console.Write($"【堆栈】:{(exception == null ? "未知" : exception.StackTrace)}"); + } + Console.WriteLine(); + + Console.ForegroundColor = m_consoleForegroundColor; + Console.BackgroundColor = m_consoleBackgroundColor; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs.meta new file mode 100644 index 0000000..1fc3bd8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ConsoleLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e6343d70f872b9a4f86ec8f8d850b290 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs new file mode 100644 index 0000000..7be80a1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs @@ -0,0 +1,85 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Text; + +namespace TouchSocket.Core +{ + /// + /// 快捷日志 + /// + public class EasyLogger : LoggerBase + { + private readonly Action m_action; + private readonly Action m_action1; + + /// + /// 构造函数 + /// + /// 参数依次为:日志类型,触发源,消息,异常 + public EasyLogger(Action action) + { + m_action = action; + } + + /// + /// 构造函数 + /// + /// 参数为日志消息输出。 + public EasyLogger(Action action) + { + m_action1 = action; + } + + /// + /// + /// + /// + /// + /// + /// + protected override void WriteLog(LogType logType, object source, string message, Exception exception) + { + try + { + if (m_action != null) + { + m_action.Invoke(logType, source, message, exception); + return; + } + if (m_action1 != null) + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")); + stringBuilder.Append(" | "); + stringBuilder.Append(logType.ToString()); + stringBuilder.Append(" | "); + stringBuilder.Append(message); + + if (exception != null) + { + stringBuilder.Append(" | "); + stringBuilder.Append($"【异常消息】:{exception.Message}"); + stringBuilder.Append($"【堆栈】:{(exception == null ? "未知" : exception.StackTrace)}"); + } + stringBuilder.AppendLine(); + m_action1.Invoke(stringBuilder.ToString()); + return; + } + } + catch + { + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs.meta new file mode 100644 index 0000000..012f8fb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/EasyLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d99ad5e01b6bbd540840b433ae935637 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs new file mode 100644 index 0000000..231aec7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs @@ -0,0 +1,118 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Text; + +namespace TouchSocket.Core +{ + /// + /// 文件日志记录器 + /// 会在指定目录下,生成logs文件夹,然后按[yyyy-MM-dd].log的形式,每日生成日志 + /// + public class FileLogger : LoggerBase + { + private static string m_rootPath; + + /// + /// 构造函数 + /// + /// 日志根目录 + public FileLogger(string rootPath = null) + { + lock (typeof(FileLogger)) + { + rootPath ??= AppDomain.CurrentDomain.BaseDirectory; + + if (m_rootPath.IsNullOrEmpty()) + { + m_rootPath = Path.Combine(rootPath, "logs"); + } + else if (m_rootPath != Path.Combine(rootPath, "logs")) + { + throw new Exception($"{GetType().Name}无法指向不同的根路径。"); + } + } + } + + /// + /// + /// + /// + /// + /// + /// + protected override void WriteLog(LogType logType, object source, string message, Exception exception) + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")); + stringBuilder.Append(" | "); + stringBuilder.Append(logType.ToString()); + stringBuilder.Append(" | "); + stringBuilder.Append(message); + + if (exception != null) + { + stringBuilder.Append(" | "); + stringBuilder.Append($"【异常消息】:{exception.Message}"); + stringBuilder.Append($"【堆栈】:{(exception == null ? "未知" : exception.StackTrace)}"); + } + stringBuilder.AppendLine(); + + Print(stringBuilder.ToString()); + } + + private static FileStorageWriter m_writer; + + private void Print(string logString) + { + try + { + lock (typeof(FileLogger)) + { + string dir = Path.Combine(m_rootPath, DateTime.Now.ToString("[yyyy-MM-dd]")); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + if (m_writer == null) + { + int count = 0; + string path = null; + while (true) + { + path = Path.Combine(dir, $"{count:0000}" + ".log"); + if (!File.Exists(path)) + { + m_writer = FilePool.GetWriter(path); + break; + } + count++; + } + } + m_writer.Write(Encoding.UTF8.GetBytes(logString)); + if (m_writer.FileStorage.Length > 1024 * 1024) + { + m_writer.SafeDispose(); + m_writer = null; + } + } + } + catch + { + m_writer.SafeDispose(); + m_writer = null; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs.meta new file mode 100644 index 0000000..0909542 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/FileLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bacf989dcabdb924eabfc934a8046934 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs new file mode 100644 index 0000000..b7c0886 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Core +{ + /// + /// 日志接口 + /// + public interface ILog + { + /// + /// 日志输出类型。 + /// 当的类型,在该设置之内时,才会真正输出日志。 + /// + LogType LogType { get; set; } + + /// + /// 日志记录 + /// + /// + /// + /// + /// + void Log(LogType logType, object source, string message, Exception exception); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs.meta new file mode 100644 index 0000000..9c66125 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/ILog.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d157cf03c95fd4d499afeeeb5cfbc757 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs new file mode 100644 index 0000000..a9d22fc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 日志类型。 + /// + public enum LogType + { + /// + /// 不使用日志类输出 + /// + None = 0, + + /// + /// 更为详细的步骤型日志输出 + /// + Trace = 1, + + /// + /// 调试信息日志 + /// + Debug = 2, + + /// + /// 消息类日志输出 + /// + Info = 4, + + /// + /// 警告类日志输出 + /// + Warning = 8, + + /// + /// 错误类日志输出 + /// + Error = 16, + + /// + /// 不可控中断类日输出 + /// + Critical = 32 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs.meta new file mode 100644 index 0000000..83f520f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LogType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5eb78da955415854caa678307ca1bc27 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs new file mode 100644 index 0000000..c23727d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs @@ -0,0 +1,65 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 日志基类 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public abstract partial class LoggerBase : ILog + { + /// + /// 全部的日志类型 + /// + public const LogType All = LogType.None | LogType.Trace | LogType.Debug | LogType.Info | LogType.Warning | LogType.Error | LogType.Critical; + + /// + /// 日志基类 + /// + protected LoggerBase() + { + LogType = All; + } + + /// + /// + /// + public LogType LogType { get; set; } + + /// + /// + /// + /// + /// + /// + /// + public void Log(LogType logType, object source, string message, Exception exception) + { + if (LogType.HasFlag(logType)) + { + WriteLog(logType, source, message, exception); + } + } + + /// + /// 筛选日志后输出 + /// + /// + /// + /// + /// + protected abstract void WriteLog(LogType logType, object source, string message, Exception exception); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs.meta new file mode 100644 index 0000000..86a7f7d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82c08969fc1173e44920889e26eb6518 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs new file mode 100644 index 0000000..4a836d6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs @@ -0,0 +1,125 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Core +{ + /// + /// LoggerContainerExtension + /// + public static class LoggerContainerExtension + { + /// + /// 设置日志。 + /// + /// + /// + /// + public static IContainer SetLogger(this IContainer container) + where TLogger : class, ILog + { + container.RegisterTransient(); + return container; + } + + /// + /// 设置单例日志。 + /// + /// + /// + /// + public static IContainer SetSingletonLogger(this IContainer container) where TLogger : class, ILog + { + container.RegisterSingleton(); + return container; + } + + /// + /// 设置实例日志。 + /// + /// + /// + /// + /// + public static IContainer SetSingletonLogger(this IContainer container, TLogger logger) where TLogger : class, ILog + { + container.RegisterSingleton(logger); + return container; + } + + /// + /// 添加控制台日志到日志组。 + /// + /// + /// + public static IContainer AddConsoleLogger(this IContainer container) + { + LoggerGroup loggerGroup = (LoggerGroup)container.Resolve(); + loggerGroup.AddLogger(new ConsoleLogger()); + return container; + } + + /// + /// 添加委托日志到日志组。 + /// + /// + /// + /// + public static IContainer AddEasyLogger(this IContainer container, Action action) + { + LoggerGroup loggerGroup = (LoggerGroup)container.Resolve(); + loggerGroup.AddLogger(new EasyLogger(action)); + return container; + } + + /// + /// 添加委托日志到日志组。 + /// + /// + /// + /// + public static IContainer AddEasyLogger(this IContainer container, Action action) + { + LoggerGroup loggerGroup = (LoggerGroup)container.Resolve(); + loggerGroup.AddLogger(new EasyLogger(action)); + return container; + } + + /// + /// 添加文件日志到日志组。 + /// + /// + /// + /// + public static IContainer AddFileLogger(this IContainer container, string rootPath = null) + { + LoggerGroup loggerGroup = (LoggerGroup)container.Resolve(); + loggerGroup.AddLogger(new FileLogger(rootPath)); + return container; + } + + /// + /// 添加日志到日志组。 + /// + /// + /// + /// + public static IContainer AddLogger(this IContainer container, ILog logger) + { + LoggerGroup loggerGroup = (LoggerGroup)container.Resolve(); + loggerGroup.AddLogger(logger); + return container; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs.meta new file mode 100644 index 0000000..a42a9ba --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerContainerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29cc4c62811922f49a933418a4776c0b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs new file mode 100644 index 0000000..5b47e5f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs @@ -0,0 +1,274 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// + /// + public static class LoggerExtensions + { + #region LoggerGroup日志 + + /// + /// 指定在中的特定日志类型中输出中断日志 + /// + /// + /// + public static void Critical(this ILog logger, string msg) where TLog : ILog + { + logger.Log(LogType.Critical, null, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出调试日志 + /// + /// + /// + public static void Debug(this ILog logger, string msg) where TLog : ILog + { + logger.Log(LogType.Debug, null, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出错误日志 + /// + /// + /// + public static void Error(this ILog logger, string msg) where TLog : ILog + { + logger.Log(LogType.Error, null, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出错误日志 + /// + /// + /// + /// + public static void Error(this ILog logger, object source, string msg) where TLog : ILog + { + logger.Log(LogType.Error, source, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出异常日志 + /// + /// + /// + public static void Exception(this ILog logger, Exception ex) where TLog : ILog + { + logger.Log(LogType.Error, null, ex.Message, ex); + } + + /// + /// 指定在中的特定日志类型中输出异常日志 + /// + /// + /// + /// + public static void Exception(this ILog logger, object source, Exception ex) where TLog : ILog + { + logger.Log(LogType.Error, source, ex.Message, ex); + } + + /// + /// 指定在中的特定日志类型中输出消息日志 + /// + /// + /// + public static void Info(this ILog logger, string msg) where TLog : ILog + { + logger.Log(LogType.Info, null, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出消息日志 + /// + /// + /// + /// + public static void Info(this ILog logger, object source, string msg) where TLog : ILog + { + logger.Log(LogType.Info, source, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出日志 + /// + /// + /// + /// + /// + /// + public static void Log(this ILog logger, LogType logType, object source, string message, Exception exception) where TLog : ILog + { + if (logger is LoggerGroup loggerGroup) + { + loggerGroup.Log(logType, source, message, exception); + } + } + + /// + /// 指定在中的特定日志类型中输出详细日志 + /// + /// + /// + public static void Trace(this ILog logger, string msg) where TLog : ILog + { + logger.Log(LogType.Trace, null, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出警示日志 + /// + /// + /// + public static void Warning(this ILog logger, string msg) where TLog : ILog + { + logger.Log(LogType.Warning, null, msg, null); + } + + /// + /// 指定在中的特定日志类型中输出警示日志 + /// + /// + /// + /// + public static void Warning(this ILog logger, object source, string msg) where TLog : ILog + { + logger.Log(LogType.Warning, source, msg, null); + } + + #endregion LoggerGroup日志 + + #region 日志 + + /// + /// 输出中断日志 + /// + /// + /// + public static void Critical(this ILog logger, string msg) + { + logger.Log(LogType.Critical, null, msg, null); + } + + /// + /// 输出调试日志 + /// + /// + /// + public static void Debug(this ILog logger, string msg) + { + logger.Log(LogType.Debug, null, msg, null); + } + + /// + /// 输出错误日志 + /// + /// + /// + public static void Error(this ILog logger, string msg) + { + logger.Log(LogType.Error, null, msg, null); + } + + /// + /// 输出错误日志 + /// + /// + /// + /// + public static void Error(this ILog logger, object source, string msg) + { + logger.Log(LogType.Error, source, msg, null); + } + + /// + /// 输出异常日志 + /// + /// + /// + public static void Exception(this ILog logger, Exception ex) + { + logger.Log(LogType.Error, null, ex.Message, ex); + } + + /// + /// 输出异常日志 + /// + /// + /// + /// + public static void Exception(this ILog logger, object source, Exception ex) + { + logger.Log(LogType.Error, source, ex.Message, ex); + } + + /// + /// 输出消息日志 + /// + /// + /// + public static void Info(this ILog logger, string msg) + { + logger.Log(LogType.Info, null, msg, null); + } + + /// + /// 输出消息日志 + /// + /// + /// + /// + public static void Info(this ILog logger, object source, string msg) + { + logger.Log(LogType.Info, source, msg, null); + } + + /// + /// 输出详细日志 + /// + /// + /// + public static void Trace(this ILog logger, string msg) + { + logger.Log(LogType.Trace, null, msg, null); + } + + /// + /// 输出警示日志 + /// + /// + /// + public static void Warning(this ILog logger, string msg) + { + logger.Log(LogType.Warning, null, msg, null); + } + + /// + /// 输出警示日志 + /// + /// + /// + /// + public static void Warning(this ILog logger, object source, string msg) + { + logger.Log(LogType.Warning, source, msg, null); + } + + #endregion 日志 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs.meta new file mode 100644 index 0000000..cfd8537 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 73751d9f7cfcca1418caf85717d8f858 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs new file mode 100644 index 0000000..f3745f3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs @@ -0,0 +1,252 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace TouchSocket.Core +{ + /// + /// 一组日志记录器 + /// + public class LoggerGroup : LoggerBase + { + private readonly Dictionary m_logs = new Dictionary(); + + /// + /// 一组日志记录器 + /// + /// + public LoggerGroup(params ILog[] logs) + { + if (logs is null) + { + throw new ArgumentNullException(nameof(logs)); + } + foreach (var log in logs) + { + this.AddLogger(log); + } + } + + /// + /// 一组日志记录器 + /// + [DependencyInject] + public LoggerGroup() + { + } + + /// + /// 组内的日志记录器 + /// + public ILog[] Logs => m_logs.Values.ToArray(); + + /// + /// 添加日志组件 + /// + /// + /// + public void AddLogger(string key, ILog logger) + { + m_logs.Add(key, logger); + } + + /// + /// 添加日志组件 + /// + /// + public void AddLogger(ILog logger) + { + m_logs.Add(logger.GetType().FullName, logger); + } + + /// + /// 指定输出中的特定类型的日志 + /// + /// + /// + /// + /// + public void Log(LogType logType, object source, string message, Exception exception) where TLog : ILog + { + try + { + for (int i = 0; i < m_logs.Count; i++) + { + ILog log = Logs[i]; + if (log.GetType() == typeof(TLog)) + { + log.Log(logType, source, message, exception); + } + } + } + catch + { + } + } + + /// + /// 移除日志 + /// + /// + public bool RemoveLogger(ILog logger) + { + return this.RemoveLogger(logger.GetType().FullName); + } + + /// + /// 移除日志 + /// + public bool RemoveLogger(Type loggerType) + { + return this.RemoveLogger(loggerType.FullName); + } + + /// + /// 移除对应键的日志 + /// + /// + /// + public bool RemoveLogger(string key) + { + return m_logs.Remove(key); + } + + /// + /// + /// + /// + /// + /// + /// + protected override void WriteLog(LogType logType, object source, string message, Exception exception) + { + try + { + for (int i = 0; i < m_logs.Count; i++) + { + Logs[i].Log(logType, source, message, exception); + } + } + catch + { + } + } + } + + /// + /// 一组日志记录器 + /// + /// + /// + public class LoggerGroup : LoggerGroup + where TLog1 : ILog + where TLog2 : ILog + { + /// + /// 一组日志记录器 + /// + public LoggerGroup(TLog1 log1, TLog2 log2) : base(log1, log2) + { + } + } + + /// + /// 一组日志记录器 + /// + /// + /// + /// + public class LoggerGroup : LoggerGroup + where TLog1 : ILog + where TLog2 : ILog + where TLog3 : ILog + { + /// + /// 一组日志记录器 + /// + public LoggerGroup(TLog1 log1, TLog2 log2, TLog3 log3) : base(log1, log2, log3) + { + } + } + + /// + /// 一组日志记录器 + /// + /// + /// + /// + /// + public class LoggerGroup : LoggerGroup + where TLog1 : ILog + where TLog2 : ILog + where TLog3 : ILog + where TLog4 : ILog + { + /// + /// 一组日志记录器 + /// + public LoggerGroup(TLog1 log1, TLog2 log2, TLog3 log3, TLog4 log4) : base(log1, log2, log3, log4) + { + } + } + + /// + /// 一组日志记录器 + /// + /// + /// + /// + /// + /// + public class LoggerGroup : LoggerGroup + where TLog1 : ILog + where TLog2 : ILog + where TLog3 : ILog + where TLog4 : ILog + where TLog5 : ILog + { + /// + /// 一组日志记录器 + /// + public LoggerGroup(TLog1 log1, TLog2 log2, TLog3 log3, TLog4 log4, TLog5 log5) : base(log1, log2, log3, log4, log5) + { + } + } + + /// + /// 一组日志记录器 + /// + /// + /// + /// + /// + /// + /// + public class LoggerGroup : LoggerGroup + where TLog1 : ILog + where TLog2 : ILog + where TLog3 : ILog + where TLog4 : ILog + where TLog5 : ILog + where TLog6 : ILog + { + /// + /// 一组日志记录器 + /// + public LoggerGroup(TLog1 log1, TLog2 log2, TLog3 log3, TLog4 log4, TLog5 log5, TLog6 log6) : base(log1, log2, log3, log4, log5, log6) + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs.meta new file mode 100644 index 0000000..3141c67 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Logger/LoggerGroup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24700df811aa3044f8ab150de28a2b41 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper.meta new file mode 100644 index 0000000..07ef4a0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba85cd40759f92840bb8a5d27889c67b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs new file mode 100644 index 0000000..943da9f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs @@ -0,0 +1,189 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// 映射数据 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public static partial class Mapper + { + private static readonly ConcurrentDictionary> m_typeToProperty = new ConcurrentDictionary>(); + + /// + /// 简单映射 + /// + /// + /// + /// + /// + public static TTarget Map(this object source, MapperOption option = default) where TTarget : class, new() + { + return (TTarget)Map(source, typeof(TTarget), option); + } + + /// + /// 简单映射 + /// + /// + /// + /// + /// + public static TTarget Map(this TTarget source, MapperOption option = default) where TTarget : class, new() + { + return (TTarget)Map(source, typeof(TTarget), option); + } + + /// + /// 简单映射 + /// + /// + /// + /// + /// + /// + public static TTarget Map(this TSource source, MapperOption option = default) where TTarget : class, new() + { + return (TTarget)Map(source, typeof(TTarget), option); + } + + /// + /// 简单对象映射 + /// + /// + /// + /// + /// + public static object Map(this object source, Type targetType, MapperOption option = default) + { + return Map(source, Activator.CreateInstance(targetType), option); + } + + /// + /// 简单对象映射 + /// + /// + /// + /// + /// + public static object Map(this object source, object target, MapperOption option = default) + { + if (source is null) + { + return default; + } + var sourceType = source.GetType(); + if (sourceType.IsPrimitive || sourceType.IsEnum || sourceType == TouchSocketCoreUtility.stringType) + { + return source; + } + var sourcePairs = m_typeToProperty.GetOrAdd(sourceType, (k) => + { + Dictionary pairs = new Dictionary(); + var ps = k.GetProperties(BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + foreach (var item in ps) + { + pairs.Add(item.Name, new Property(item)); + } + return pairs; + }); + + var targetPairs = m_typeToProperty.GetOrAdd(target.GetType(), (k) => + { + Dictionary pairs = new Dictionary(); + var ps = k.GetProperties(BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + foreach (var item in ps) + { + pairs.Add(item.Name, new Property(item)); + } + return pairs; + }); + + foreach (var item in sourcePairs) + { + if (item.Value.CanRead) + { + string pkey = item.Key; + if (option != null && option.MapperProperties != null && option.MapperProperties.ContainsKey(pkey)) + { + pkey = option.MapperProperties[pkey]; + } + + if (option?.IgnoreProperties?.Contains(pkey) == true) + { + continue; + } + if (targetPairs.TryGetValue(pkey, out Property property)) + { + if (property.CanWrite) + { + property.SetValue(target, item.Value.GetValue(source)); + } + } + } + } + return target; + } + + /// + /// 映射List + /// + /// + /// + /// + /// + /// + public static IEnumerable MapList(this IEnumerable list, MapperOption option = default) where T : class where T1 : class, new() + { + if (list is null) + { + throw new ArgumentNullException(nameof(list)); + } + + List result = new List(); + foreach (var item in list) + { + result.Add(Map(item, option)); + } + return result; + } + + /// + /// 映射List + /// + /// + /// + /// + /// + /// + public static IEnumerable MapList(this IEnumerable list, MapperOption option = default) where T1 : class, new() + { + if (list is null) + { + throw new ArgumentNullException(nameof(list)); + } + + List result = new List(); + foreach (var item in list) + { + result.Add(Map(item, option)); + } + return result; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs.meta new file mode 100644 index 0000000..89d0661 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/Mapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 295fde9b1d4138a4b8c2e948c58f3e4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs new file mode 100644 index 0000000..05c595b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 映射配置 + /// + public class MapperOption + { + /// + /// 需要忽略的属性名称 + /// + public List IgnoreProperties { get; set; } + + /// + /// 映射属性名称 + /// + public Dictionary MapperProperties { get; set; } + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs.meta new file mode 100644 index 0000000..afba001 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Mapper/MapperOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ec97565082b60a4ca5e9bd88d81e5d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_.meta new file mode 100644 index 0000000..97a2340 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 81bb1761bcee3cf4f9e544710bf1ab76 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs new file mode 100644 index 0000000..22a9973 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs @@ -0,0 +1,34 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// 包接口规范 + /// + public interface IPackage + { + /// + /// 打包。 + /// 重写的话,约定基类方法必须先执行 + /// + /// + void Package(ByteBlock byteBlock); + + /// + /// 解包。 + /// 重写的话,约定基类方法必须先执行 + /// + /// + void Unpackage(ByteBlock byteBlock); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs.meta new file mode 100644 index 0000000..f31a87d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/IPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca637a79e065b8847b6e0ee8ed1f58f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs new file mode 100644 index 0000000..439f76e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 可承载消息的路由包 + /// + public class MsgRouterPackage : RouterPackage + { + /// + /// 消息 + /// + public string Message { get; set; } + + /// + public override void PackageBody(ByteBlock byteBlock) + { + byteBlock.Write(Message); + } + + /// + public override void UnpackageBody(ByteBlock byteBlock) + { + this.Message = byteBlock.ReadString(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs.meta new file mode 100644 index 0000000..0e60717 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/MsgRouterPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ade749f9b67ad6949a189661c9de49e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs new file mode 100644 index 0000000..9be8fa0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// PackageBase包结构数据。 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public abstract partial class PackageBase : IPackage + { + /// + public abstract void Package(ByteBlock byteBlock); + + /// + public abstract void Unpackage(ByteBlock byteBlock); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs.meta new file mode 100644 index 0000000..f6f3770 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f7fefb1aa59e1e941a61cbad8abb53a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs new file mode 100644 index 0000000..7dbe202 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs @@ -0,0 +1,34 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// PackageExtensions + /// + public static class PackageExtensions + { + /// + /// 打包为字节 + /// + /// + /// + public static byte[] PackageAsBytes(this PackageBase packageBase) + { + using (ByteBlock byteBlock = new ByteBlock()) + { + packageBase.Package(byteBlock); + return byteBlock.ToArray(); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs.meta new file mode 100644 index 0000000..445e1c7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/PackageExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 13c4a97c588eabb46ba5c13adc03b658 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs new file mode 100644 index 0000000..ebfa095 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs @@ -0,0 +1,104 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// 具有目标id和源id的路由包 + /// + public class RouterPackage : PackageBase + { + /// + /// 标识是否路由 + /// + public bool Route { get; set; } + + /// + /// 源Id + /// + public string SourceId { get; set; } + + /// + /// 目标Id + /// + public string TargetId { get; set; } + + /// + /// 打包所有的路由包信息。顺序为:先调用,然后 + /// + /// + public override sealed void Package(ByteBlock byteBlock) + { + PackageRouter(byteBlock); + PackageBody(byteBlock); + } + + /// + /// 打包数据体。一般不需要单独调用该方法。 + /// 重写的话,约定基类方法必须先执行 + /// + /// + public virtual void PackageBody(ByteBlock byteBlock) + { + } + + /// + /// 打包路由。 + /// 重写的话,约定基类方法必须先执行 + /// + /// + public virtual void PackageRouter(ByteBlock byteBlock) + { + byteBlock.Write(Route); + byteBlock.Write(SourceId); + byteBlock.Write(TargetId); + } + + /// + /// 转换目标和源的id。 + /// + public void SwitchId() + { + string value = SourceId; + SourceId = TargetId; + TargetId = value; + } + + /// + public override sealed void Unpackage(ByteBlock byteBlock) + { + UnpackageRouter(byteBlock); + UnpackageBody(byteBlock); + } + + /// + /// 解包数据体。一般不需要单独调用该方法。 + /// 重写的话,约定基类方法必须先执行 + /// + /// + public virtual void UnpackageBody(ByteBlock byteBlock) + { + } + + /// + /// 只解包路由部分。一般不需要单独调用该方法。 + /// 重写的话,约定基类方法必须先执行 + /// + /// + public virtual void UnpackageRouter(ByteBlock byteBlock) + { + Route = byteBlock.ReadBoolean(); + SourceId = byteBlock.ReadString(); + TargetId = byteBlock.ReadString(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs.meta new file mode 100644 index 0000000..828d93b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/RouterPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ba9b75fc09f338f44a2eb9c3b06ce0c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs new file mode 100644 index 0000000..0902eed --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// WaitPackage + /// + public class WaitPackage : PackageBase, IWaitResult + { + /// + /// + /// + public string Message { get; set; } + + /// + /// + /// + public long Sign { get; set; } + + /// + /// + /// + public byte Status { get; set; } + + /// + public override void Package(ByteBlock byteBlock) + { + byteBlock.Write(Sign); + byteBlock.Write(Status); + byteBlock.Write(Message); + } + + /// + public override void Unpackage(ByteBlock byteBlock) + { + Sign = byteBlock.ReadInt64(); + Status = (byte)byteBlock.ReadByte(); + Message = byteBlock.ReadString(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs.meta new file mode 100644 index 0000000..d6a3602 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e59ebe00eaf06048af5887ec3088d17 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs new file mode 100644 index 0000000..d6ee510 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// 可等待的路由包。 + /// + public class WaitRouterPackage : MsgRouterPackage, IWaitResult + { + /// + public long Sign { get; set; } + + /// + public byte Status { get; set; } + + /// + public override void PackageBody(ByteBlock byteBlock) + { + base.PackageBody(byteBlock); + byteBlock.Write(Sign); + byteBlock.Write(Status); + } + + /// + public override void UnpackageBody(ByteBlock byteBlock) + { + base.UnpackageBody(byteBlock); + Sign = byteBlock.ReadInt64(); + Status = (byte)byteBlock.ReadByte(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs.meta new file mode 100644 index 0000000..7b31d52 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Packages_/WaitRouterPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9fb0008266b1bb4c83bd3a78bd05943 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins.meta new file mode 100644 index 0000000..9c3f434 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: caeceea9fe69e5b49ac3aa219b0b586b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs new file mode 100644 index 0000000..3903ccf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 标识该接口应当还会触发异步接口。 + /// 异步接口方法的返回值应该为Task,且必须以Async结尾。 + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public sealed class AsyncRaiserAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs.meta new file mode 100644 index 0000000..8981519 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/AsyncRaiserAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f59e2cd23917914e9feec7ced04aef4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs new file mode 100644 index 0000000..ed9e723 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 插件接口 + /// + public interface IPlugin : IDisposable + { + /// + /// 插件执行顺序 + /// 该属性值越大,越靠前执行。值相等时,按添加先后顺序 + /// 该属性效果,仅在之前设置有效。 + /// + int Order { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs.meta new file mode 100644 index 0000000..5a8d5f1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89576af373becde4db03c9bdb401767e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs new file mode 100644 index 0000000..570356b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 具有插件功能的对象 + /// + public interface IPluginObject + { + /// + /// 内置IOC容器 + /// + IContainer Container { get; } + + /// + /// 插件管理器 + /// + IPluginsManager PluginsManager { get; } + + /// + /// 是否已启用插件 + /// + bool UsePlugin { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs.meta new file mode 100644 index 0000000..931fd64 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b7cb4ceba0656c4c94f7c4dbc53d613 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs new file mode 100644 index 0000000..44ecd18 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; + +namespace TouchSocket.Core +{ + /// + /// 插件管理器接口 + /// + public interface IPluginsManager : IEnumerable + { + /// + /// 标识该插件是否可用。当不可用时,仅可以添加和删除插件,但不会触发插件 + /// + bool Enable { get; set; } + + /// + /// 内置IOC容器 + /// + IContainer Container { get; } + + /// + /// 添加插件 + /// + /// 插件 + /// + void Add(IPlugin plugin); + + /// + /// 移除插件 + /// + /// + void Remove(IPlugin plugin); + + /// + /// 移除插件 + /// + /// + void Remove(Type type); + + /// + /// 清除所有插件 + /// + void Clear(); + + /// + /// 触发对应方法 + /// + /// 接口类型 + /// 触发名称 + /// + /// + bool Raise(string name, object sender, TouchSocketEventArgs e) where TPlugin : IPlugin; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs.meta new file mode 100644 index 0000000..6c991ea --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/IPluginsManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8d6f95d6165aca4d86f715063ded5e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs new file mode 100644 index 0000000..80e5fb3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs @@ -0,0 +1,75 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// PlguinObjectExtension + /// + public static class PlguinObjectExtension + { + /// + /// 添加插件 + /// + /// 插件类型 + /// 插件类型实例 + public static TPlugin AddPlugin(this IPluginObject plguinObject) where TPlugin : class, IPlugin + { + plguinObject.Container.RegisterSingleton(); + var obj = plguinObject.Container.Resolve(); + AddPlugin(plguinObject, obj); + return obj; + } + + /// + /// 添加插件 + /// + /// + /// 插件 + /// + public static void AddPlugin(this IPluginObject plguinObject, IPlugin plugin) + { + plguinObject.Container.RegisterSingleton(plugin); + plguinObject.PluginsManager.Add(plugin); + } + + /// + /// 清空插件 + /// + public static void ClearPlugins(this IPluginObject plguinObject) + { + plguinObject.PluginsManager.Clear(); + } + + /// + /// 移除插件 + /// + /// + /// + public static void RemovePlugin(this IPluginObject plguinObject, IPlugin plugin) + { + plguinObject.PluginsManager.Remove(plugin); + } + + /// + /// 移除插件 + /// + /// + /// + public static void RemovePlugin(this IPluginObject plguinObject) where T : IPlugin + { + plguinObject.PluginsManager.Remove(typeof(T)); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs.meta new file mode 100644 index 0000000..7fec84e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PlguinObjectExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb5a7ab7910cf044e9d75d7cecdb9025 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs new file mode 100644 index 0000000..6a7c8b5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// PluginBase + /// + public class PluginBase : DisposableObject, IPlugin + { + /// + public int Order { get ; set ; } + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs.meta new file mode 100644 index 0000000..49c0a62 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cae21e3d3a8865845bc77d2cb09ad607 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs new file mode 100644 index 0000000..abf2394 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs @@ -0,0 +1,275 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 表示插件管理器。 + /// + public class PluginsManager : IPluginsManager + { + private readonly Dictionary> m_pluginInfoes = new Dictionary>(); + private readonly List m_plugins = new List(); + + /// + /// 构造函数 + /// + /// + public PluginsManager(IContainer container) + { + Container = container; + } + + /// + /// + /// + public IContainer Container { get; } + + /// + /// + /// + public bool Enable { get; set; } = true; + + /// + /// 添加插件 + /// + /// 插件 + /// + void IPluginsManager.Add(IPlugin plugin) + { + lock (this) + { + if (plugin == null) + { + throw new ArgumentNullException(); + } + if (plugin.GetType().GetCustomAttribute() is SingletonPluginAttribute singletonPlugin) + { + foreach (var item in m_plugins) + { + if (item.PluginType == plugin.GetType()) + { + throw new InvalidOperationException($"插件{plugin.GetType()}不能重复使用。"); + } + } + } + m_plugins.Add(new PluginModel(plugin, plugin.GetType())); + var types = plugin.GetType().GetInterfaces().Where(a => typeof(IPlugin).IsAssignableFrom(a)).ToArray(); + foreach (var type in types) + { + if (!m_pluginInfoes.ContainsKey(type)) + { + Dictionary pairs = new Dictionary(); + var ms = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + foreach (var item in ms) + { + if (item.GetParameters().Length == 2 && typeof(TouchSocketEventArgs).IsAssignableFrom(item.GetParameters()[1].ParameterType)) + { + if (pairs.ContainsKey(item.Name)) + { + throw new Exception("插件的接口方法不允许重载"); + } + PluginMethod pluginMethod = new PluginMethod(type); + if (item.GetCustomAttribute() != null) + { + var asyncMethod = type.GetMethod($"{item.Name}Async", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + if (asyncMethod == null) + { + throw new Exception("当接口标识为异步时,还应当定义其异步方法,以“Async”结尾"); + } + + if (asyncMethod.GetParameters().Length != 2 && typeof(TouchSocketEventArgs).IsAssignableFrom(asyncMethod.GetParameters()[1].ParameterType)) + { + throw new Exception("异步接口方法不符合设定"); + } + if (asyncMethod.ReturnType != typeof(Task)) + { + throw new Exception("异步接口方法返回值必须为Task。"); + } + pluginMethod.MethodAsync=new Method(asyncMethod); + } + pluginMethod.Method = new Method(item); + pairs.Add(item.Name, pluginMethod); + } + } + m_pluginInfoes.Add(type, pairs); + } + } + + m_plugins.Sort(delegate (PluginModel x, PluginModel y) + { + if (x.Plugin.Order == y.Plugin.Order) return 0; + else if (x.Plugin.Order < y.Plugin.Order) return 1; + else return -1; + }); + + Container.RegisterSingleton(plugin); + } + } + + /// + /// 清除所有插件 + /// + void IPluginsManager.Clear() + { + lock (this) + { + foreach (var item in m_plugins) + { + item.Plugin.SafeDispose(); + } + m_plugins.Clear(); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + lock (this) + { + return m_plugins.Select(a => a.Plugin).GetEnumerator(); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + lock (this) + { + return m_plugins.Select(a => a.Plugin).GetEnumerator(); + } + } + + /// + /// 触发对应方法 + /// + /// 接口类型,此处也必须是接口类型 + /// 触发名称 + /// + /// + bool IPluginsManager.Raise(string name, object sender, TouchSocketEventArgs e) + { + if (!Enable) + { + return false; + } + if (m_pluginInfoes.TryGetValue(typeof(TPlugin), out var value)) + { + if (value.TryGetValue(name, out PluginMethod pluginMethod)) + { + for (int i = 0; i < m_plugins.Count; i++) + { + if (e.Handled) + { + return true; + } + if (pluginMethod.Type.IsAssignableFrom(m_plugins[i].PluginType)) + { + try + { + pluginMethod.Method.Invoke(m_plugins[i].Plugin, sender, e); + } + catch (Exception ex) + { + Container.Resolve()?.Exception(ex); + } + + try + { + pluginMethod.MethodAsync?.InvokeAsync(m_plugins[i].Plugin, sender, e); + } + catch (Exception ex) + { + Container.Resolve()?.Exception(ex); + } + } + } + } + } + return false; + } + + /// + /// 移除插件 + /// + /// + void IPluginsManager.Remove(IPlugin plugin) + { + lock (this) + { + if (plugin == null) + { + throw new ArgumentNullException(); + } + foreach (var item in m_plugins) + { + if (plugin == item.Plugin) + { + if (m_plugins.Remove(item)) + { + plugin.SafeDispose(); + return; + } + } + } + } + } + + /// + /// 移除插件 + /// + /// + void IPluginsManager.Remove(Type type) + { + lock (this) + { + for (int i = m_plugins.Count - 1; i >= 0; i--) + { + IPlugin plugin = m_plugins[i].Plugin; + if (plugin.GetType() == type) + { + m_plugins.RemoveAt(i); + plugin.SafeDispose(); + } + } + } + } + } + + internal class PluginMethod + { + public PluginMethod(Type type) + { + this.Type = type; + } + public Method Method; + public Method MethodAsync; + public readonly Type Type; + } + + internal class PluginModel + { + public PluginModel(IPlugin plugin, Type pluginType) + { + Plugin = plugin; + PluginType = pluginType; + } + + public IPlugin Plugin; + public Type PluginType; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs.meta new file mode 100644 index 0000000..382d6d0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2015389c305b10644a3e5b68067543f6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs new file mode 100644 index 0000000..074f6d3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs @@ -0,0 +1,77 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// PluginsManagerExtension + /// + public static class PluginsManagerExtension + { + /// + /// 添加插件 + /// + /// 插件类型 + /// 插件类型实例 + public static TPlugin Add(this IPluginsManager pluginsManager) where TPlugin : class, IPlugin + { + pluginsManager.Container.RegisterSingleton(); + var obj = pluginsManager.Container.Resolve(); + pluginsManager.Add(obj); + return obj; + } + + /// + /// 添加插件 + /// + /// 插件类型 + /// + /// 创建插件相关构造函数插件 + /// 插件类型实例 + public static TPlugin Add(this IPluginsManager pluginsManager, params object[] ps) where TPlugin : class, IPlugin + { + pluginsManager.Container.RegisterSingleton(); + var obj = pluginsManager.Container.Resolve(ps); + pluginsManager.Add(obj); + return obj; + } + + /// + /// 清空插件 + /// + public static void Clear(this IPluginsManager pluginsManager) + { + pluginsManager.Clear(); + } + + /// + /// 移除插件 + /// + /// + /// + public static void Remove(this IPluginsManager pluginsManager, IPlugin plugin) + { + pluginsManager.Remove(plugin); + } + + /// + /// 移除插件 + /// + /// + /// + public static void Remove(this IPluginsManager pluginsManager) where T : IPlugin + { + pluginsManager.Remove(typeof(T)); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs.meta new file mode 100644 index 0000000..9d93fc8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/PluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 073e6369f79e2364abfb40e75f62b320 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs new file mode 100644 index 0000000..9353168 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 标识插件只能注册一次。 + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)] + public sealed class SingletonPluginAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs.meta new file mode 100644 index 0000000..88725d1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Plugins/SingletonPluginAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a660df34ec350fc4aae27114e597442a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool.meta new file mode 100644 index 0000000..1bf022f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63562f46124e8844e865932b49b20dcb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool.meta new file mode 100644 index 0000000..97a8e1b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 60e9228b6c601e5488052939d13a79f7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs new file mode 100644 index 0000000..5b5a59c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 对象池接口 + /// + public interface IObjectPool : IDisposable + { + /// + /// 可使用数量 + /// + int FreeSize { get; } + + /// + /// 清空池中对象 + /// + void Clear(); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs.meta new file mode 100644 index 0000000..6466bd5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IObjectPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d9ecb5cf2001e8f47804f64b57ef3721 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs new file mode 100644 index 0000000..8a8ef01 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 对象池单位接口 + /// + public interface IPoolObject + { + /// + /// 是否为新建对象 + /// + bool NewCreate { get; set; } + + /// + /// 初创建对象 + /// + void Create(); + + /// + /// 重新创建对象 + /// + void Recreate(); + + /// + /// 销毁对象 + /// + void Destroy(); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs.meta new file mode 100644 index 0000000..5b18a24 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/IPoolObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1d0b567f8b9b2864fb84f9cc492f6dfd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs new file mode 100644 index 0000000..9861f84 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs @@ -0,0 +1,145 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 对象池 + /// + /// + public class ObjectPool : IObjectPool where T : IPoolObject + { + private readonly ConcurrentQueue m_queue = new ConcurrentQueue(); + + private bool m_autoCreate = true; + + private int m_freeSize; + + /// + /// 构造函数 + /// + /// + public ObjectPool(int capacity) + { + Capacity = capacity; + } + + /// + /// 构造函数 + /// + public ObjectPool() + { + } + + /// + /// 是否自动生成 + /// + public bool AutoCreate + { + get => m_autoCreate; + set => m_autoCreate = value; + } + + /// + /// 对象池容量 + /// + public int Capacity { get; set; } + + /// + /// 可使用(创建)数量 + /// + public int FreeSize => m_freeSize; + + /// + /// 清除池中所有对象 + /// + public void Clear() + { + while (m_queue.TryDequeue(out _)) + { + } + } + + /// + /// 注销对象 + /// + /// + public void DestroyObject(T t) + { + t.Destroy(); + if (m_freeSize < Capacity) + { + Interlocked.Increment(ref m_freeSize); + m_queue.Enqueue(t); + } + } + + /// + /// 释放对象 + /// + public void Dispose() + { + Clear(); + } + + /// + /// 获取所有对象 + /// + /// + public T[] GetAllObject() + { + List ts = new List(); + while (m_queue.TryDequeue(out T t)) + { + ts.Add(t); + } + return ts.ToArray(); + } + + /// + /// 获取对象T + /// + /// + public T GetObject() + { + if (m_queue.TryDequeue(out T t)) + { + t.Recreate(); + t.NewCreate = false; + Interlocked.Decrement(ref m_freeSize); + return t; + } + if (m_autoCreate) + { + t = (T)Activator.CreateInstance(typeof(T)); + t.Create(); + t.NewCreate = true; + } + return t; + } + + /// + /// 预获取 + /// + /// + public T PreviewGetObject() + { + m_queue.TryPeek(out T t); + return t; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs.meta new file mode 100644 index 0000000..2377a34 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Pool/ObjectPool/ObjectPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a27782f8feb525943a41aeb2d96b43b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection.meta new file mode 100644 index 0000000..7cd2853 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3f2a302ae10ec884a8b1c4936a768c89 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs new file mode 100644 index 0000000..b03cd22 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// DynamicMethodMemberAccessor + /// + public class DynamicMethodMemberAccessor : IMemberAccessor + { + private static ConcurrentDictionary classAccessors = new ConcurrentDictionary(); + + /// + /// 获取属性 + /// + public Func OnGetProperties { get; set; } + + /// + /// 获取字段 + /// + public Func OnGetFieldInfes { get; set; } + + /// + public object GetValue(object instance, string memberName) + { + return FindClassAccessor(instance).GetValue(instance, memberName); + } + + /// + public void SetValue(object instance, string memberName, object newValue) + { + FindClassAccessor(instance).SetValue(instance, memberName, newValue); + } + + private IMemberAccessor FindClassAccessor(object instance) + { + var typekey = instance.GetType(); + if (!classAccessors.TryGetValue(typekey, out IMemberAccessor classAccessor)) + { + MemberAccessor memberAccessor = new MemberAccessor(instance.GetType()); + if (this.OnGetFieldInfes != null) + { + memberAccessor.OnGetFieldInfes = this.OnGetFieldInfes; + } + + if (this.OnGetProperties != null) + { + memberAccessor.OnGetProperties = this.OnGetProperties; + } + memberAccessor.Build(); + classAccessor = memberAccessor; + classAccessors.TryAdd(typekey, classAccessor); + } + return classAccessor; + } + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs.meta new file mode 100644 index 0000000..6b87762 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/DynamicMethodMemberAccessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a912e5a7cd8305a46bdd806190dd87a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs new file mode 100644 index 0000000..ae93834 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace TouchSocket.Core +{ + /// + /// 表达式复制 + /// + public class ExpressionMapper + { + private static readonly Dictionary m_dic = new Dictionary(); + + /// + /// 字典缓存表达式树 + /// + public static TOut Trans(TIn tIn) + { + string key = string.Format("funckey_{0}_{1}", typeof(TIn).FullName, typeof(TOut).FullName); + if (!m_dic.ContainsKey(key)) + { + ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p"); + List memberBindingList = new List(); + foreach (var item in typeof(TOut).GetProperties()) + { + MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name)); + MemberBinding memberBinding = Expression.Bind(item, property); + memberBindingList.Add(memberBinding); + } + foreach (var item in typeof(TOut).GetFields()) + { + MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name)); + MemberBinding memberBinding = Expression.Bind(item, property); + memberBindingList.Add(memberBinding); + } + MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray()); + Expression> lambda = Expression.Lambda>(memberInitExpression, parameterExpression); + Func func = lambda.Compile();//拼装是一次性的 + m_dic[key] = func; + } + return ((Func)m_dic[key]).Invoke(tIn); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs.meta new file mode 100644 index 0000000..8c47c9a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/ExpressionMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0925c0ca6a68abe479e2b20137bffdca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs new file mode 100644 index 0000000..a1738da --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 一个成员访问接口 + /// + public interface IMemberAccessor + { + /// + /// 获取指定成员的值 + /// + /// + /// + /// + object GetValue(object instance, string memberName); + + /// + ///设置指定成员的值 + /// + /// + /// + /// + void SetValue(object instance, string memberName, object newValue); + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs.meta new file mode 100644 index 0000000..630dcb1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/IMemberAccessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a67fa375de7e6b45b4a1acc08a3bc18 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs new file mode 100644 index 0000000..d08aba8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 用于表达式树的成员 + /// + public abstract class Member + { + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs.meta new file mode 100644 index 0000000..baa349c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Member.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c71c4b09f9aa8e14293788bfb3b627f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs new file mode 100644 index 0000000..deb4513 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// 动态成员访问器 + /// + /// + public class MemberAccessor : MemberAccessor + { + /// + /// 动态成员访问器 + /// + public MemberAccessor() : base(typeof(T)) + { + + } + } + + /// + /// 动态成员访问器 + /// + public class MemberAccessor : IMemberAccessor + { + Func GetValueDelegate; + + Action SetValueDelegate; + + /// + /// 动态成员访问器 + /// + /// + public MemberAccessor(Type type) + { + Type = type; + this.OnGetFieldInfes = (t) => { return t.GetFields(); }; + this.OnGetProperties = (t) => { return t.GetProperties(); }; + } + + private Dictionary dicFieldInfes; + private Dictionary dicProperties; + /// + /// 构建 + /// + public void Build() + { + if (GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + dicFieldInfes = this.OnGetFieldInfes.Invoke(Type).ToDictionary(a => a.Name); + dicProperties = this.OnGetProperties.Invoke(Type).ToDictionary(a => a.Name); + } + + GetValueDelegate = GenerateGetValue(); + SetValueDelegate = GenerateSetValue(); + } + + /// + /// 获取属性 + /// + public Func OnGetProperties { get; set; } + + /// + /// 获取字段 + /// + public Func OnGetFieldInfes { get; set; } + + /// + /// 所属类型 + /// + public Type Type { get; } + + /// + public object GetValue(object instance, string memberName) + { + return GetValueDelegate(instance, memberName); + } + + /// + public void SetValue(object instance, string memberName, object newValue) + { + SetValueDelegate(instance, memberName, newValue); + } + + private Func GenerateGetValue() + { + if (GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + return (obj, key) => + { + if (dicFieldInfes.TryGetValue(key, out var value1)) + { + return value1.GetValue(obj); + } + if (dicProperties.TryGetValue(key, out var value2)) + { + return value2.GetValue(obj); + } + return default; + }; + } + + var instance = Expression.Parameter(typeof(object), "instance"); + var memberName = Expression.Parameter(typeof(string), "memberName"); + var nameHash = Expression.Variable(typeof(int), "nameHash"); + var calHash = Expression.Assign(nameHash, Expression.Call(memberName, typeof(object).GetMethod("GetHashCode"))); + var cases = new List(); + foreach (var propertyInfo in this.OnGetFieldInfes.Invoke(Type)) + { + var property = Expression.Field(Expression.Convert(instance, Type), propertyInfo.Name); + var propertyHash = Expression.Constant(propertyInfo.Name.GetHashCode(), typeof(int)); + + cases.Add(Expression.SwitchCase(Expression.Convert(property, typeof(object)), propertyHash)); + } + foreach (var propertyInfo in this.OnGetProperties.Invoke(Type)) + { + var property = Expression.Property(Expression.Convert(instance, Type), propertyInfo.Name); + var propertyHash = Expression.Constant(propertyInfo.Name.GetHashCode(), typeof(int)); + + cases.Add(Expression.SwitchCase(Expression.Convert(property, typeof(object)), propertyHash)); + } + if (cases.Count == 0) + { + return (a, b) => default; + } + var switchEx = Expression.Switch(nameHash, Expression.Constant(null), cases.ToArray()); + var methodBody = Expression.Block(typeof(object), new[] { nameHash }, calHash, switchEx); + + return Expression.Lambda>(methodBody, instance, memberName).Compile(); + } + + private Action GenerateSetValue() + { + if (GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + return (obj, key, value) => + { + if (dicFieldInfes.TryGetValue(key, out var value1)) + { + value1.SetValue(obj, value); + } + if (dicProperties.TryGetValue(key, out var value2)) + { + value2.SetValue(obj, value); + } + }; + } + + var instance = Expression.Parameter(typeof(object), "instance"); + var memberName = Expression.Parameter(typeof(string), "memberName"); + var newValue = Expression.Parameter(typeof(object), "newValue"); + var nameHash = Expression.Variable(typeof(int), "nameHash"); + var calHash = Expression.Assign(nameHash, Expression.Call(memberName, typeof(object).GetMethod("GetHashCode"))); + var cases = new List(); + foreach (var propertyInfo in this.OnGetFieldInfes.Invoke(Type)) + { + var property = Expression.Field(Expression.Convert(instance, Type), propertyInfo.Name); + var setValue = Expression.Assign(property, Expression.Convert(newValue, propertyInfo.FieldType)); + var propertyHash = Expression.Constant(propertyInfo.Name.GetHashCode(), typeof(int)); + + cases.Add(Expression.SwitchCase(Expression.Convert(setValue, typeof(object)), propertyHash)); + } + foreach (var propertyInfo in this.OnGetProperties(Type)) + { + if (!propertyInfo.CanWrite) + { + continue; + } + var property = Expression.Property(Expression.Convert(instance, Type), propertyInfo.Name); + var setValue = Expression.Assign(property, Expression.Convert(newValue, propertyInfo.PropertyType)); + var propertyHash = Expression.Constant(propertyInfo.Name.GetHashCode(), typeof(int)); + + cases.Add(Expression.SwitchCase(Expression.Convert(setValue, typeof(object)), propertyHash)); + } + if (cases.Count == 0) + { + return (a, b, c) => { }; + } + var switchEx = Expression.Switch(nameHash, Expression.Constant(null), cases.ToArray()); + var methodBody = Expression.Block(typeof(object), new[] { nameHash }, calHash, switchEx); + + return Expression.Lambda>(methodBody, instance, memberName, newValue).Compile(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs.meta new file mode 100644 index 0000000..0237686 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberAccessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2bf24af4564b0f4d87e48bee07c5a40 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs new file mode 100644 index 0000000..e1321d1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// 表示属性的Getter + /// + public class MemberGetter + { + /// + /// get方法委托 + /// + private readonly Func m_getFunc; + + /// + /// 表示属性的Getter + /// + /// 属性 + /// + public MemberGetter(PropertyInfo property) + { + m_getFunc = CreateGetterDelegate(property); + } + + /// + /// 表示类型字段或属性的Getter + /// + /// + public MemberGetter(FieldInfo fieldInfo) + { + m_getFunc = CreateGetterDelegate(fieldInfo); + } + + /// + /// 获取属性的值 + /// + /// 实例 + /// + public object Invoke(object instance) + { + return m_getFunc.Invoke(instance); + } + + private static Func CreateGetterDelegate(PropertyInfo property) + { + var param_instance = Expression.Parameter(typeof(object)); + var body_instance = Expression.Convert(param_instance, property.DeclaringType); + var body_property = Expression.Property(body_instance, property); + var body_return = Expression.Convert(body_property, typeof(object)); + + return Expression.Lambda>(body_return, param_instance).Compile(); + } + + private static Func CreateGetterDelegate(FieldInfo fieldInfo) + { + var param_instance = Expression.Parameter(typeof(object)); + var body_instance = Expression.Convert(param_instance, fieldInfo.DeclaringType); + var body_field = Expression.Field(body_instance, fieldInfo); + var body_return = Expression.Convert(body_field, typeof(object)); + + return Expression.Lambda>(body_return, param_instance).Compile(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs.meta new file mode 100644 index 0000000..5d9683b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberGetter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7bcf3b7be4f0baa458b4138cb63d84c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs new file mode 100644 index 0000000..8dc8faf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// 表示属性的设置器 + /// + public class MemberSetter + { + /// + /// set方法委托 + /// + private readonly Action setFunc; + + /// + /// 表示属性的Getter + /// + /// 属性 + /// + public MemberSetter(PropertyInfo property) + { + if (property == null) + { + throw new ArgumentNullException(nameof(property)); + } + setFunc = CreateSetterDelegate(property); + } + + /// + /// 设置属性的值 + /// + /// 实例 + /// 值 + /// + public void Invoke(object instance, object value) + { + setFunc.Invoke(instance, value); + } + + private static Action CreateSetterDelegate(PropertyInfo property) + { + var param_instance = Expression.Parameter(typeof(object)); + var param_value = Expression.Parameter(typeof(object)); + + var body_instance = Expression.Convert(param_instance, property.DeclaringType); + var body_value = Expression.Convert(param_value, property.PropertyType); + var body_call = Expression.Call(body_instance, property.GetSetMethod(true), body_value); + + return Expression.Lambda>(body_call, param_instance, param_value).Compile(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs.meta new file mode 100644 index 0000000..bbfc2cc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/MemberSetter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7324c5a5c77206469eedd6abc1ece12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs new file mode 100644 index 0000000..2514240 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs @@ -0,0 +1,360 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// Task类型 + /// + public enum TaskReturnType + { + /// + /// 没有Task + /// + None, + + /// + /// 仅返回Task + /// + Task, + + /// + /// 返回Task的值 + /// + TaskObject + } + + /// + /// 表示方法 + /// + public class Method + { + private readonly MethodInfo m_info; + + /// + /// 方法执行委托 + /// + private readonly Func m_invoker; + + private readonly bool m_isByRef; + + /// + /// 方法 + /// + /// 方法信息 + public Method(MethodInfo method) + { + m_info = method ?? throw new ArgumentNullException(nameof(method)); + Name = method.Name; + Static = method.IsStatic; + foreach (var item in method.GetParameters()) + { + if (item.ParameterType.IsByRef) + { + m_isByRef = true; + } + } + if (this.m_isByRef||GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + if (method.ReturnType == typeof(Task)) + { + HasReturn = false; + TaskType = TaskReturnType.Task; + } + else if (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)) + { + HasReturn = true; + ReturnType = method.ReturnType.GetGenericArguments()[0]; + TaskType = TaskReturnType.TaskObject; + } + else if (method.ReturnType == typeof(void)) + { + HasReturn = false; + TaskType = TaskReturnType.None; + } + else + { + HasReturn = true; + TaskType = TaskReturnType.None; + ReturnType = method.ReturnType; + } + } + else + { + m_invoker = CreateInvoker(method); + } + } + + /// + /// 是否具有返回值 + /// + public bool HasReturn { get; private set; } + + /// + /// 方法信息 + /// + public MethodInfo Info => m_info; + + /// + /// 是否有引用类型 + /// + public bool IsByRef => m_isByRef; + + /// + /// 获取方法名 + /// + public string Name { get; protected set; } + + /// + /// 返回值类型。 + /// 当方法为void或task时,为null + /// 当方法为task泛型时,为泛型元素类型 + /// + public Type ReturnType { get; private set; } + + /// + /// 是否为静态函数 + /// + public bool Static { get; private set; } + + /// + /// 返回值的Task类型。 + /// + public TaskReturnType TaskType { get; private set; } + + /// + /// 执行方法。 + /// 当方法为void或task时,会返回null + /// 当方法为task泛型时,会wait后的值 + /// 注意:当调用方为UI主线程时,调用异步方法,则极有可能发生死锁。 + /// + /// 实例 + /// 参数 + /// + public object Invoke(object instance, params object[] parameters) + { + switch (TaskType) + { + case TaskReturnType.None: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + return re; + } + case TaskReturnType.Task: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + Task task = (Task)re; + task.Wait(); + return default; + } + case TaskReturnType.TaskObject: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + Task task = (Task)re; + task.Wait(); + return task.GetType().GetProperty("Result").GetValue(task); + } + default: + return default; + } + } + + /// + /// 异步调用 + /// + /// + /// + /// + public Task InvokeAsync(object instance, params object[] parameters) + { + switch (TaskType) + { + case TaskReturnType.None: + { + throw new Exception("该方法不包含Task。"); + } + case TaskReturnType.Task: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + return (Task)re; + } + case TaskReturnType.TaskObject: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + return (Task)re; + } + default: + return default; + } + } + + /// + /// 调用异步结果 + /// + /// + /// + /// + public async Task InvokeObjectAsync(object instance, params object[] parameters) + { + switch (TaskType) + { + case TaskReturnType.None: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + return re; + } + case TaskReturnType.Task: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + Task task = (Task)re; + await task; + return default; + } + case TaskReturnType.TaskObject: + { + object re; + if (m_isByRef || GlobalEnvironment.OptimizedPlatforms.HasFlag(OptimizedPlatforms.Unity)) + { + re = m_info.Invoke(instance, parameters); + } + else + { + re = m_invoker.Invoke(instance, parameters); + } + Task task = (Task)re; + await task; + return task.GetType().GetProperty("Result").GetValue(task); + } + default: + return default; + } + } + + /// + /// 生成方法的调用委托 + /// + /// 方法成员信息 + /// + /// + private Func CreateInvoker(MethodInfo method) + { + var instance = Expression.Parameter(typeof(object), "instance"); + var parameters = Expression.Parameter(typeof(object[]), "parameters"); + + var instanceCast = method.IsStatic ? null : Expression.Convert(instance, method.DeclaringType); + var parametersCast = method.GetParameters().Select((p, i) => + { + var parameter = Expression.ArrayIndex(parameters, Expression.Constant(i)); + return Expression.Convert(parameter, p.ParameterType); + }); + + var body = Expression.Call(instanceCast, method, parametersCast); + + if (method.ReturnType == typeof(Task)) + { + HasReturn = false; + TaskType = TaskReturnType.Task; + var bodyCast = Expression.Convert(body, typeof(object)); + return Expression.Lambda>(bodyCast, instance, parameters).Compile(); + } + else if (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)) + { + TaskType = TaskReturnType.TaskObject; + HasReturn = true; + ReturnType = method.ReturnType.GetGenericArguments()[0]; + var bodyCast = Expression.Convert(body, typeof(object)); + return Expression.Lambda>(bodyCast, instance, parameters).Compile(); + } + else if (method.ReturnType == typeof(void)) + { + HasReturn = false; + TaskType = TaskReturnType.None; + var action = Expression.Lambda>(body, instance, parameters).Compile(); + return (_instance, _parameters) => + { + action.Invoke(_instance, _parameters); + return null; + }; + } + else + { + HasReturn = true; + TaskType = TaskReturnType.None; + ReturnType = method.ReturnType; + var bodyCast = Expression.Convert(body, typeof(object)); + return Expression.Lambda>(bodyCast, instance, parameters).Compile(); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs.meta new file mode 100644 index 0000000..52d6045 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Method.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 49a2db1f1e1253a4885bfe14f365ddcb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs new file mode 100644 index 0000000..2ee7133 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs @@ -0,0 +1,121 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// 表示属性 + /// + public class Property: Member + { + /// + /// 类型属性的Setter缓存 + /// + private static readonly ConcurrentDictionary m_cached = new ConcurrentDictionary(); + + /// + /// 获取器 + /// + private readonly MemberGetter m_geter; + + /// + /// 设置器 + /// + private readonly MemberSetter m_seter; + + /// + /// 属性 + /// + /// 属性信息 + public Property(PropertyInfo property) + { + Name = property.Name; + Info = property; + + if (property.CanRead == true) + { + CanRead = true; + m_geter = new MemberGetter(property); + } + if (property.CanWrite == true) + { + CanWrite = true; + m_seter = new MemberSetter(property); + } + } + + /// + /// 是否可以读取 + /// + public bool CanRead { get; private set; } + + /// + /// 是否可以写入 + /// + public bool CanWrite { get; private set; } + + /// + /// 获取属性信息 + /// + public PropertyInfo Info { get; private set; } + + /// + /// 获取属性名称 + /// + public string Name { get; protected set; } + + /// + /// 从类型的属性获取属性 + /// + /// 类型 + /// + public static Property[] GetProperties(Type type) + { + return m_cached.GetOrAdd(type, t => t.GetProperties().Select(p => new Property(p)).ToArray()); + } + + /// + /// 获取属性的值 + /// + /// 实例 + /// + /// + public object GetValue(object instance) + { + if (m_geter == null) + { + throw new NotSupportedException(); + } + return m_geter.Invoke(instance); + } + + /// + /// 设置属性的值 + /// + /// 实例 + /// 值 + /// + public void SetValue(object instance, object value) + { + if (m_seter == null) + { + throw new NotSupportedException($"{Name}不允许赋值"); + } + m_seter.Invoke(instance, value); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs.meta new file mode 100644 index 0000000..efa6893 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Reflection/Property.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a693227a37af7742b5abdb8af8b3936 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run.meta new file mode 100644 index 0000000..144a9e6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c085d9b92b66de3479ae1449d1aa53a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action.meta new file mode 100644 index 0000000..a72654d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a7df423db8cf3564db39009168c054a2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs new file mode 100644 index 0000000..822d9d6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs @@ -0,0 +1,152 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 易用组件 + /// + public class EasyTask + { + static EasyTask() + { + InitCompletedTask(); + } + + private static readonly ConcurrentDictionary timers = new ConcurrentDictionary(); + +#if DEBUG + + /// + /// Timers + /// + public static ConcurrentDictionary Timers => timers; + +#endif + + /// + /// 延迟执行 + /// + /// + /// + public static void DelayRun(TimeSpan delayTimeSpan, Action action) + { + DelayRun(delayTimeSpan.Milliseconds, action); + } + + /// + /// 延迟执行 + /// + /// + /// + /// + public static void DelayRun(TimeSpan delayTimeSpan, T status, Action action) + { + DelayRun(delayTimeSpan.Milliseconds, status, action); + } + + /// + /// 延迟执行 + /// + /// + /// + public static void DelayRun(int delay, Action action) + { + object obj = new object(); + Timer timer = new Timer((o) => + { + if (timers.TryRemove(o, out Timer timer1)) + { + timer1.Dispose(); + } + action?.Invoke(); + }, obj, delay, Timeout.Infinite); + timers.TryAdd(obj, timer); + } + + /// + /// 延迟执行 + /// + /// + /// + /// + public static void DelayRun(int delay, T status, Action action) + { + object obj = new object(); + Timer timer = new Timer((o) => + { + if (timers.TryRemove(o, out Timer timer1)) + { + timer1.Dispose(); + } + action?.Invoke(status); + }, obj, delay, Timeout.Infinite); + timers.TryAdd(obj, timer); + } + + /// + /// Task异步 + /// + /// + /// + public static Task Run(T statu, Action action) + { + return Task.Factory.StartNew(() => + { + action.Invoke(statu); + }); + } + + /// + /// Task异步 + /// + /// + /// + /// + public static Task Run(Func function) + { + return Task.Factory.StartNew(function); + } + + /// + /// Task异步 + /// + /// + /// + public static Task Run(Action action) + { + return Task.Factory.StartNew(action); + } + + /// + /// 已完成的Task + /// + public static Task CompletedTask { get; private set; } + + private static void InitCompletedTask() + { +#if NET45_OR_GREATER + Task task = new Task(() => { }); + task.Start(); + task.Wait(); + CompletedTask = task; +#else + CompletedTask = Task.CompletedTask; +#endif + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs.meta new file mode 100644 index 0000000..21dbb5b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/EasyTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3179ec9e73b4554c8152270c3893059 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs new file mode 100644 index 0000000..8bda09c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs @@ -0,0 +1,259 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 循环动作 + /// + public class LoopAction : EasyTask, IDisposable + { + /// + /// 析构函数 + /// + ~LoopAction() + { + Dispose(); + } + + private int executedCount; + + private readonly TimeSpan m_interval; + + private readonly int m_loopCount; + + private readonly EventWaitHandle m_waitHandle; + + private LoopAction(int count, TimeSpan interval, Action action) + { + m_loopCount = count; + this.action = action; + m_interval = interval; + m_waitHandle = new AutoResetEvent(false); + } + + /// + /// 创建可循环操作体 + /// + /// 循环次数,设为-1时一直循环 + /// 每次循环间隔 + /// 执行委托 + /// + public static LoopAction CreateLoopAction(int count, TimeSpan interval, Action action) + { + return new LoopAction(count, interval, action); + } + + /// + /// 创建可循环操作体 + /// + /// 循环次数,设为-1时一直循环 + /// 每次循环间隔,毫秒 + /// 执行委托 + /// + public static LoopAction CreateLoopAction(int count, int intervalMS, Action action) + { + return new LoopAction(count, TimeSpan.FromMilliseconds(intervalMS), action); + } + + /// + /// 创建可循环操作体 + /// + /// 循环次数,设为-1时一直循环 + /// 执行委托 + /// + public static LoopAction CreateLoopAction(int count, Action action) + { + return CreateLoopAction(count, TimeSpan.Zero, action); + } + + /// + /// 创建可循环操作体 + /// + /// 每次循环间隔 + /// 执行委托 + /// + public static LoopAction CreateLoopAction(TimeSpan interval, Action action) + { + return CreateLoopAction(-1, interval, action); + } + + /// + /// 创建可循环操作体 + /// + /// 执行委托 + /// + public static LoopAction CreateLoopAction(Action action) + { + return CreateLoopAction(-1, TimeSpan.Zero, action); + } + + /// + /// 已执行次数 + /// + public int ExecutedCount => executedCount; + + /// + /// 执行间隔 + /// + public TimeSpan Interval => m_interval; + + /// + /// 循环次数 + /// + public int LoopCount => m_loopCount; + + private readonly Action action; + + /// + /// 执行委托 + /// + public Action ExecuteAction => action; + + private RunStatus runStatus; + + /// + /// 是否在运行 + /// + public RunStatus RunStatus => runStatus; + + /// + /// 运行 + /// + public void Run() + { + if (runStatus == RunStatus.None) + { + runStatus = RunStatus.Running; + if (m_loopCount >= 0) + { + for (int i = 0; i < m_loopCount; i++) + { + if (runStatus == RunStatus.Disposed) + { + return; + } + action.Invoke(this); + executedCount++; + if (runStatus == RunStatus.Paused) + { + m_waitHandle.WaitOne(); + } + m_waitHandle.WaitOne(m_interval); + } + } + else + { + while (true) + { + if (runStatus == RunStatus.Disposed) + { + return; + } + action.Invoke(this); + executedCount++; + if (runStatus == RunStatus.Paused) + { + m_waitHandle.WaitOne(); + } + m_waitHandle.WaitOne(m_interval); + } + } + runStatus = RunStatus.Completed; + } + } + + /// + /// 重新运行 + /// + public void Rerun() + { + if (runStatus == RunStatus.Disposed) + { + throw new Exception("无法利用已释放的资源"); + } + runStatus = RunStatus.None; + Run(); + } + + /// + /// 以异步重新运行 + /// + /// + public Task RerunAsync() + { + if (runStatus == RunStatus.Disposed) + { + throw new Exception("无法利用已释放的资源"); + } + runStatus = RunStatus.None; + return RunAsync(); + } + + /// + /// 以异步运行 + /// + /// + public Task RunAsync() + { + return EasyTask.Run(() => + { + Run(); + }); + } + + /// + /// 暂停 + /// + public void Pause() + { + if (runStatus == RunStatus.Running) + { + m_waitHandle.Reset(); + runStatus = RunStatus.Paused; + } + } + + /// + /// 回复 + /// + public void Resume() + { + if (runStatus == RunStatus.Paused) + { + runStatus = RunStatus.Running; + m_waitHandle.Set(); + } + } + + /// + /// 释放资源 + /// + public void Dispose() + { + if (runStatus == RunStatus.Disposed) + { + return; + } + if (runStatus == RunStatus.Completed) + { + m_waitHandle.Dispose(); + } + runStatus = RunStatus.Disposed; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs.meta new file mode 100644 index 0000000..243b4a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/LoopAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 473377e3314815c40bb2e21648259c9b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs new file mode 100644 index 0000000..8fba5fc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// 运行状态 + /// + public enum RunStatus : byte + { + /// + /// None + /// + None, + + /// + /// Running + /// + Running, + + /// + /// Completed + /// + Completed, + + /// + /// Pause + /// + Paused, + + /// + /// Disposed + /// + Disposed + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs.meta new file mode 100644 index 0000000..9a48225 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Action/RunStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2709ecf94bbcbbf47b8056ec72f0cdd4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message.meta new file mode 100644 index 0000000..22082f9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69d78f07fd85e8c4c869af48313e45b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs new file mode 100644 index 0000000..e45f437 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 注册为消息 + /// + [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] + public sealed class AppMessageAttribute : Attribute + { + /// + /// 构造函数 + /// + public AppMessageAttribute() + { + } + + /// + /// 构造函数 + /// + /// + public AppMessageAttribute(string token) + { + Token = token; + } + + /// + /// 标识 + /// + public string Token { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs.meta new file mode 100644 index 0000000..3949467 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessageAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a401b4661ff75c94babae6ce9df2769c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs new file mode 100644 index 0000000..75f1303 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs @@ -0,0 +1,269 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Resources; + +namespace TouchSocket.Core +{ + /// + /// 消息通知类。内部全为弱引用。 + /// + public class AppMessenger + { + private static AppMessenger m_instance; + private readonly ReaderWriterLockSlim m_lockSlim = new ReaderWriterLockSlim(); + private readonly Dictionary> m_tokenAndInstance = new Dictionary>(); + + /// + /// 默认单例实例 + /// + public static AppMessenger Default + { + get + { + if (m_instance != null) + { + return m_instance; + } + lock (typeof(AppMessenger)) + { + if (m_instance != null) + { + return m_instance; + } + m_instance = new AppMessenger(); + return m_instance; + } + } + } + + /// + /// 允许多广播注册 + /// + public bool AllowMultiple { get; set; } + + /// + /// 添加 + /// + /// + /// + /// + public void Add(string token, MessageInstance messageInstance) + { + using (WriteLock writeLock = new WriteLock(m_lockSlim)) + { + if (m_tokenAndInstance.ContainsKey(token)) + { + if (!AllowMultiple) + { + throw new MessageRegisteredException(TouchSocketStatus.TokenExisted.GetDescription(token)); + } + m_tokenAndInstance[token].Add(messageInstance); + } + else + { + m_tokenAndInstance.Add(token, new List() + { + messageInstance + }); + } + } + } + + /// + /// 判断能否触发该消息,意味着该消息是否已经注册。 + /// + /// + /// + public bool CanSendMessage(string token) + { + using (ReadLock readLock = new ReadLock(m_lockSlim)) + { + return m_tokenAndInstance.ContainsKey(token); + } + } + + /// + /// 清除所有消息 + /// + public void Clear() + { + using (WriteLock writeLock = new WriteLock(m_lockSlim)) + { + m_tokenAndInstance.Clear(); + } + } + + /// + /// 获取所有消息 + /// + /// + public string[] GetAllMessage() + { + using (ReadLock readLock = new ReadLock(m_lockSlim)) + { + return m_tokenAndInstance.Keys.ToArray(); + } + } + + /// + /// 移除 + /// + /// + public void Remove(string token) + { + using (WriteLock writeLock = new WriteLock(m_lockSlim)) + { + m_tokenAndInstance.Remove(token); + } + } + + /// + /// 按对象移除 + /// + /// + public void Remove(IMessageObject messageObject) + { + using (WriteLock writeLock = new WriteLock(m_lockSlim)) + { + List key = new List(); + + foreach (var item in m_tokenAndInstance.Keys) + { + foreach (var item2 in m_tokenAndInstance[item].ToArray()) + { + if (messageObject == item2.MessageObject) + { + m_tokenAndInstance[item].Remove(item2); + if (m_tokenAndInstance[item].Count == 0) + { + key.Add(item); + } + } + } + } + + foreach (var item in key) + { + m_tokenAndInstance.Remove(item); + } + } + } + + /// + /// 发送消息 + /// + /// + /// + /// + public Task SendAsync(string token, params object[] parameters) + { + return EasyTask.Run(() => + { + using (ReadLock readLock = new ReadLock(m_lockSlim)) + { + if (m_tokenAndInstance.TryGetValue(token, out List list)) + { + List clear = new List(); + + foreach (var item in list) + { + if (!item.Static && !item.WeakReference.TryGetTarget(out _)) + { + clear.Add(item); + continue; + } + try + { + item.Invoke(item.MessageObject, parameters); + } + catch + { + } + } + + foreach (var item in clear) + { + list.Remove(item); + } + } + else + { + throw new MessageNotFoundException(TouchSocketStatus.MessageNotFound.GetDescription(token)); + } + } + }); + } + + /// + /// 发送消息,当多播时,只返回最后一个返回值 + /// + /// 返回值类型 + /// + /// + /// + /// + public Task SendAsync(string token, params object[] parameters) + { + return EasyTask.Run(() => + { + using (ReadLock readLock = new ReadLock(m_lockSlim)) + { + if (m_tokenAndInstance.TryGetValue(token, out List list)) + { + T result = default; + List clear = new List(); + for (int i = 0; i < list.Count; i++) + { + var item = list[i]; + if (!item.Static && !item.WeakReference.TryGetTarget(out _)) + { + clear.Add(item); + continue; + } + + try + { + if (i == list.Count - 1) + { + result = (T)item.Invoke(item.MessageObject, parameters); + } + else + { + item.Invoke(item.MessageObject, parameters); + } + } + catch + { + } + } + + foreach (var item in clear) + { + list.Remove(item); + } + return result; + } + else + { + throw new MessageNotFoundException(TouchSocketStatus.MessageNotFound.GetDescription(token)); + } + } + }); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs.meta new file mode 100644 index 0000000..bba5bc3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessenger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2f17f8dd94c9a39418769d9e2f4030da +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs new file mode 100644 index 0000000..e704258 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs @@ -0,0 +1,321 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// AppMessengerExtensions + /// + public static class AppMessengerExtensions + { + /// + /// 注册类的静态消息 + /// + /// + public static void Register(this AppMessenger appMessenger) where T : IMessageObject + { + Type type = typeof(T); + Register(appMessenger, type); + } + + /// + /// 注册类的静态消息 + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Type type) + { + MethodInfo[] methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Default); + foreach (var method in methods) + { + IEnumerable attributes = method.GetCustomAttributes(); + foreach (var attribute in attributes) + { + if (attribute is AppMessageAttribute att) + { + if (string.IsNullOrEmpty(att.Token)) + { + Register(appMessenger, null, method.Name, method); + } + else + { + Register(appMessenger, null, att.Token, method); + } + } + } + } + } + + /// + /// 注册消息 + /// + /// + /// + public static void Register(this AppMessenger appMessenger, IMessageObject messageObject) + { + MethodInfo[] methods = messageObject.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Default); + foreach (var method in methods) + { + IEnumerable attributes = method.GetCustomAttributes(); + foreach (var attribute in attributes) + { + if (attribute is AppMessageAttribute att) + { + if (string.IsNullOrEmpty(att.Token)) + { + Register(appMessenger, messageObject, method.Name, method); + } + else + { + Register(appMessenger, messageObject, att.Token, method); + } + } + } + } + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, IMessageObject messageObject, string token, MethodInfo methodInfo) + { + appMessenger.Add(token, new MessageInstance(methodInfo, messageObject)); + } + + /// + /// 注册消息 + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Action action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Action action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Action action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Action action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Action action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Action action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Func action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Func action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Func action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Func action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Func action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 注册消息 + /// + /// + /// + /// + /// + public static void Register(this AppMessenger appMessenger, Func action, string token = default) + { + RegisterDelegate(appMessenger, token, action); + } + + /// + /// 卸载消息 + /// + /// + /// + public static void Unregister(this AppMessenger appMessenger, IMessageObject messageObject) + { + appMessenger.Remove(messageObject); + } + + /// + /// 移除注册 + /// + /// + /// + /// + public static void Unregister(this AppMessenger appMessenger, string token) + { + if (token is null) + { + throw new ArgumentNullException(nameof(token)); + } + appMessenger.Remove(token); + } + + private static void RegisterDelegate(this AppMessenger appMessenger, string token, Delegate dele) + { + IEnumerable attributes = dele.Method.GetCustomAttributes(); + foreach (var attribute in attributes) + { + if (attribute is AppMessageAttribute att) + { + if (token.IsNullOrEmpty()) + { + if (string.IsNullOrEmpty(att.Token)) + { + token = dele.Method.Name; + } + else + { + token = att.Token; + } + } + + appMessenger.Add(token, new MessageInstance(dele.Method, dele.Target)); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs.meta new file mode 100644 index 0000000..736b64e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/AppMessengerExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3a26d4184df77642ab4d06f883cf2de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs new file mode 100644 index 0000000..d66bfe8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 限定消息的接口 + /// + public interface IMessageObject + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs.meta new file mode 100644 index 0000000..3a25972 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/IMessageObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19346d66f30bdb041961c8df19e9c967 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs new file mode 100644 index 0000000..b89301c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// MessageInstance + /// + public class MessageInstance : Method + { + private readonly WeakReference weakReference; + + /// + /// MessageInstance + /// + /// + /// + public MessageInstance(MethodInfo method, object messageObject) : base(method) + { + weakReference = new WeakReference(messageObject); + } + + /// + /// 承载消息的实体 + /// + public object MessageObject + { + get + { + weakReference.TryGetTarget(out var target); + return target; + } + } + + /// + /// 弱引用。 + /// + public WeakReference WeakReference => weakReference; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs.meta new file mode 100644 index 0000000..143f0fc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Message/MessageInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12c010c9817219d429ed587c828c1f91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers.meta new file mode 100644 index 0000000..01cade7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5494cc36aaea76f4bb02e94358f8ce40 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs new file mode 100644 index 0000000..4ec575d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs @@ -0,0 +1,175 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 不可重入的Timer + /// + public class SingleTimer : DisposableObject + { + private readonly Action m_action1; + private readonly Action m_action2; + private readonly object m_state; + private readonly Timer m_timer; + private readonly Action m_action3; + private int m_signal = 1; + + /// + /// 是否暂停执行。 + /// + public bool Pause { get; set; } + + /// + /// 自启动以来执行的次数。 + /// + public long Count { get; private set; } + + /// + /// 不可重入的Timer + /// + /// + /// + public SingleTimer(int period, Action action) + { + m_timer = new Timer(OnTimer, null, 0, period); + m_action3 = action; + m_state = null; + } + + /// + /// 不可重入的Timer + /// + /// + /// + public SingleTimer(TimeSpan period, Action action) + { + m_timer = new Timer(OnTimer, null, TimeSpan.Zero, period); + m_action3 = action; + m_state = null; + } + + /// + /// 不可重入的Timer + /// + /// + /// + public SingleTimer(int period, Action action) + { + m_timer = new Timer(OnTimer, null, 0, period); + m_action1 = action; + m_state = null; + } + + /// + /// 不可重入的Timer + /// + /// + /// + public SingleTimer(int period, Action action) + { + m_timer = new Timer(OnTimer, null, 0, period); + m_action2 = action; + m_state = null; + } + + /// + /// 不可重入的Timer + /// + /// + /// + /// + public SingleTimer(object state, TimeSpan period, Action action) + { + m_timer = new Timer(OnTimer, state, TimeSpan.Zero, period); + m_action1 = action; + m_state = state; + } + + /// + /// 不可重入的Timer + /// + /// + /// + /// + public SingleTimer(object state, TimeSpan period, Action action) + { + m_timer = new Timer(OnTimer, state, TimeSpan.Zero, period); + m_action2 = action; + m_state = state; + } + + /// + /// 不可重入的Timer + /// + /// + /// + /// + public SingleTimer(object state, int period, Action action) + { + m_timer = new Timer(OnTimer, state, 0, period); + m_action1 = action; + m_state = state; + } + + /// + /// 不可重入的Timer + /// + /// + /// + /// + public SingleTimer(object state, int period, Action action) + { + m_timer = new Timer(OnTimer, state, 0, period); + m_action2 = action; + m_state = state; + } + + private void OnTimer(object state) + { + if (Pause) + { + return; + } + if (Interlocked.Decrement(ref m_signal) == 0) + { + try + { + Count++; + m_action1?.Invoke(this); + m_action2?.Invoke(this, m_state); + m_action3?.Invoke(); + } + catch + { + } + finally + { + m_signal = 1; + } + } + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + m_timer.SafeDispose(); + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs.meta new file mode 100644 index 0000000..75d8bd8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/Timers/SingleTimer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40fc565d1099d7f4a9ee2710f8e4932c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool.meta new file mode 100644 index 0000000..c3898a5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7286ce491e07d9b46b3968ff5244be72 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs new file mode 100644 index 0000000..78e77bd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 等待返回类 + /// + public interface IWaitResult + { + /// + /// 消息 + /// + string Message { get; set; } + + /// + /// 标记 + /// + long Sign { get; set; } + + /// + /// 状态 + /// + byte Status { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs.meta new file mode 100644 index 0000000..348e493 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/IWaitResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 83c4ba4409c235a41b7d48230b1aba7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs new file mode 100644 index 0000000..c2798d0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// ValueWaitResult + /// + [Serializable] + public struct ValueWaitResult : IWaitResult + { + /// + /// 消息 + /// + public string Message { get; set; } + + /// + /// 标记号 + /// + public long Sign { get; set; } + + /// + /// 状态 + /// + public byte Status { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs.meta new file mode 100644 index 0000000..b13873f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/ValueWaitResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f8917579c83d294aba0265c06605806 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs new file mode 100644 index 0000000..a013410 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs @@ -0,0 +1,216 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 等待数据对象 + /// + /// + public class WaitData : DisposableObject + { + private readonly AutoResetEvent m_waitHandle; + private WaitDataStatus m_status; + private T m_waitResult; + + /// + /// 构造函数 + /// + public WaitData() + { + m_waitHandle = new AutoResetEvent(false); + } + + /// + /// 延迟模式 + /// + public bool DelayModel { get; set; } + + /// + /// 状态 + /// + public WaitDataStatus Status => m_status; + + /// + /// 等待数据结果 + /// + public T WaitResult => m_waitResult; + + /// + /// 取消任务 + /// + public void Cancel() + { + m_status = WaitDataStatus.Canceled; + if (!DelayModel) + { + m_waitHandle.Set(); + } + } + + /// + /// Reset。 + /// 设置为null。然后重置状态为,waitHandle.Reset() + /// + public bool Reset() + { + m_status = WaitDataStatus.Default; + m_waitResult = default; + if (!DelayModel) + { + return m_waitHandle.Reset(); + } + return true; + } + + /// + /// 使等待的线程继续执行 + /// + public bool Set() + { + m_status = WaitDataStatus.SetRunning; + if (!DelayModel) + { + return m_waitHandle.Set(); + } + return true; + } + + /// + /// 使等待的线程继续执行 + /// + /// 等待结果 + public bool Set(T waitResult) + { + m_waitResult = waitResult; + m_status = WaitDataStatus.SetRunning; + if (!DelayModel) + { + return m_waitHandle.Set(); + } + return true; + } + + /// + /// 加载取消令箭 + /// + /// + public void SetCancellationToken(CancellationToken cancellationToken) + { + if (cancellationToken.CanBeCanceled) + { + cancellationToken.Register(Cancel); + } + } + + /// + /// 载入结果 + /// + public void SetResult(T result) + { + m_waitResult = result; + } + + /// + /// 等待指定时间 + /// + /// + public WaitDataStatus Wait(TimeSpan timeSpan) + { + return this.Wait((int)timeSpan.TotalMilliseconds); + } + + /// + /// 等待指定毫秒 + /// + /// + public WaitDataStatus Wait(int millisecond) + { + if (DelayModel) + { + for (int i = 0; i < millisecond / 10.0; i++) + { + if (m_status != WaitDataStatus.Default) + { + return m_status; + } + Task.Delay(10).GetAwaiter().GetResult(); + } + m_status = WaitDataStatus.Overtime; + return m_status; + } + else + { + if (!m_waitHandle.WaitOne(millisecond)) + { + m_status = WaitDataStatus.Overtime; + } + return m_status; + } + } + + /// + /// 等待指定时间 + /// + /// + /// + public Task WaitAsync(TimeSpan timeSpan) + { + return this.WaitAsync((int)timeSpan.TotalMilliseconds); + } + + /// + /// 等待指定毫秒 + /// + /// + public async Task WaitAsync(int millisecond) + { + if (DelayModel) + { + for (int i = 0; i < millisecond / 10.0; i++) + { + if (m_status != WaitDataStatus.Default) + { + return m_status; + } + await Task.Delay(10); + } + m_status = WaitDataStatus.Overtime; + return m_status; + } + else + { + if (!m_waitHandle.WaitOne(millisecond)) + { + m_status = WaitDataStatus.Overtime; + } + return m_status; + } + } + + /// + /// 释放 + /// + /// + protected override void Dispose(bool disposing) + { + m_status = WaitDataStatus.Disposed; + m_waitResult = default; + m_waitHandle.SafeDispose(); + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs.meta new file mode 100644 index 0000000..5f0f628 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f00414a8a430304195b0656cf46fabc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs new file mode 100644 index 0000000..49aef1e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// 等待数据状态 + /// + public enum WaitDataStatus : byte + { + /// + /// 默认 + /// + Default, + + /// + /// 收到信号运行 + /// + SetRunning, + + /// + /// 超时 + /// + Overtime, + + /// + /// 已取消 + /// + Canceled, + + /// + /// 已释放 + /// + Disposed + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs.meta new file mode 100644 index 0000000..de68c46 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitDataStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0486da0c5b78ed0499ee86be967cf540 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs new file mode 100644 index 0000000..7faf478 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs @@ -0,0 +1,191 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Concurrent; +using System.Threading; + +namespace TouchSocket.Core +{ + /// + /// 等待处理数据 + /// + /// + public class WaitHandlePool : DisposableObject where T : IWaitResult + { + private readonly ConcurrentDictionary> m_waitDic; + private readonly ConcurrentQueue> m_waitQueue; + + /// + /// 构造函数 + /// + public WaitHandlePool() + { + m_waitDic = new ConcurrentDictionary>(); + m_waitQueue = new ConcurrentQueue>(); + } + + /// + /// 销毁 + /// + /// + public void Destroy(WaitData waitData) + { + if (waitData.DisposedValue) + { + return; + } + if (m_waitDic.TryRemove(waitData.WaitResult.Sign, out _)) + { + waitData.Reset(); + m_waitQueue.Enqueue(waitData); + } + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + foreach (var item in m_waitDic.Values) + { + item.SafeDispose(); + } + foreach (var item in m_waitQueue) + { + item.SafeDispose(); + } + m_waitDic.Clear(); + + m_waitQueue.Clear(); + base.Dispose(disposing); + } + + /// + /// 取消全部 + /// + public void CancelAll() + { + foreach (var item in m_waitDic.Values) + { + item.Cancel(); + } + } + + /// + /// 延迟模式 + /// + public bool DelayModel { get; set; } = false; + + private long m_waitCount; + private long m_waitReverseCount; + + /// + /// 获取一个可等待对象 + /// + /// + /// 设置为false时,不会生成sign + /// + public WaitData GetWaitData(T result, bool autoSign = true) + { + if (m_waitQueue.TryDequeue(out var waitData)) + { + if (autoSign) + { + result.Sign = Interlocked.Increment(ref m_waitCount); + } + waitData.SetResult(result); + m_waitDic.TryAdd(result.Sign, waitData); + return waitData; + } + + waitData = new WaitData(); + waitData.DelayModel = DelayModel; + if (autoSign) + { + result.Sign = Interlocked.Increment(ref m_waitCount); + } + waitData.SetResult(result); + m_waitDic.TryAdd(result.Sign, waitData); + return waitData; + } + + /// + /// 获取一个Sign为负数的可等待对象 + /// + /// + /// 设置为false时,不会生成sign + /// + public WaitData GetReverseWaitData(T result, bool autoSign = true) + { + if (m_waitQueue.TryDequeue(out var waitData)) + { + if (autoSign) + { + result.Sign = Interlocked.Decrement(ref m_waitReverseCount); + } + waitData.SetResult(result); + m_waitDic.TryAdd(result.Sign, waitData); + return waitData; + } + + waitData = new WaitData(); + waitData.DelayModel = DelayModel; + if (autoSign) + { + result.Sign = Interlocked.Decrement(ref m_waitReverseCount); + } + waitData.SetResult(result); + m_waitDic.TryAdd(result.Sign, waitData); + return waitData; + } + + /// + /// 让等待对象恢复运行 + /// + /// + public void SetRun(long sign) + { + if (m_waitDic.TryGetValue(sign, out WaitData waitData)) + { + waitData.Set(); + } + } + + /// + /// 让等待对象恢复运行 + /// + /// + /// + public void SetRun(long sign, T waitResult) + { + if (m_waitDic.TryGetValue(sign, out WaitData waitData)) + { + waitData.Set(waitResult); + } + } + + /// + /// 让等待对象恢复运行 + /// + /// + public void SetRun(T waitResult) + { + if (m_waitDic.TryGetValue(waitResult.Sign, out WaitData waitData)) + { + waitData.Set(waitResult); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs.meta new file mode 100644 index 0000000..77e5c95 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitHandlePool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38c6974535ac01442b6b41b16f1947c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs new file mode 100644 index 0000000..f6787b4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 等待返回类 + /// + [Serializable] + public class WaitResult : IWaitResult + { + /// + /// 消息 + /// + public string Message { get; set; } + + /// + /// 标记号 + /// + public long Sign { get; set; } + + /// + /// 状态 + /// + public byte Status { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs.meta new file mode 100644 index 0000000..7930c9c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Run/WaitPool/WaitResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b96ed2b9c283b214a8c94178f1b8c42b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization.meta new file mode 100644 index 0000000..38cfd18 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e32f4e8676f9f548a3002e76795627a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes.meta new file mode 100644 index 0000000..c6825f0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38a7588bb68de974b83524f24df0bff4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs new file mode 100644 index 0000000..4c3572b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// FastConverterAttribute + /// + public class FastConverterAttribute : Attribute + { + /// + /// FastConverterAttribute + /// + /// + public FastConverterAttribute(Type type) + { + Type = type; + } + + /// + /// 转化器类型。 + /// + public Type Type { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs.meta new file mode 100644 index 0000000..f47cf61 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastConverterAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b51a4724d3abaf4cab621e2f513b74b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs new file mode 100644 index 0000000..5a9b709 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Core +{ + /// + /// 忽略的Fast序列化 + /// + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] + public class FastNonSerializedAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs.meta new file mode 100644 index 0000000..a6e505c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastNonSerializedAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3739965530895045aa978717b6e7c4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs new file mode 100644 index 0000000..c3b79e7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + /// + /// 强制Fast序列化。一般当某个属性为只读时,使用该特性。 + /// + [AttributeUsage(AttributeTargets.Property)] + public class FastSerializedAttribute: Attribute + { + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs.meta new file mode 100644 index 0000000..c779bf0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Attributes/FastSerializedAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7ee0f92ae6279548be8446f9c7fc483 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary.meta new file mode 100644 index 0000000..d309ef9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3383014068f0d64c92268a8138d2c81 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs new file mode 100644 index 0000000..8413b33 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs @@ -0,0 +1,675 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using System.Reflection; +using System.Text; + +namespace TouchSocket.Core +{ + /// + /// 快速二进制序列化。 + /// + public static class FastBinaryFormatter + { + static FastBinaryFormatter() + { + AddFastBinaryConverter(); + } + private static readonly ConcurrentDictionary m_instanceCache = new ConcurrentDictionary(); + + /// + /// 添加转换器。 + /// + public static void AddFastBinaryConverter() where TConverter : IFastBinaryConverter, new() + { + AddFastBinaryConverter(typeof(TType), (IFastBinaryConverter)Activator.CreateInstance(typeof(TConverter))); + } + + /// + /// 添加转换器。 + /// + /// + /// + public static void AddFastBinaryConverter(IFastBinaryConverter converter) + { + AddFastBinaryConverter(typeof(TType), converter); + } + + /// + /// 添加转换器。 + /// + /// + /// + public static void AddFastBinaryConverter(Type type, IFastBinaryConverter converter) + { + m_instanceCache.AddOrUpdate(type, new SerializObject(type) { Converter = converter }, (k, v) => v); + } + + #region Serialize + + /// + /// 序列化对象 + /// + /// 流 + /// 对象 + public static void Serialize(ByteBlock byteBlock, T graph) + { + byteBlock.Position = 1; + SerializeObject(byteBlock, graph); + byteBlock.Buffer[0] = 1; + byteBlock.SetLength(byteBlock.Position); + } + + private static int SerializeClass(ByteBlock stream, T obj, Type type) + { + int len = 0; + if (obj != null) + { + SerializObject serializObject = GetOrAddInstance(type); + + for (int i = 0; i < serializObject.MemberInfos.Length; i++) + { + MemberInfo memberInfo = serializObject.MemberInfos[i]; + byte[] propertyBytes = Encoding.UTF8.GetBytes(memberInfo.Name); + if (propertyBytes.Length > byte.MaxValue) + { + throw new Exception($"属性名:{memberInfo.Name}超长"); + } + stream.Write((byte)propertyBytes.Length); + stream.Write(propertyBytes, 0, propertyBytes.Length); + len += propertyBytes.Length + 1; + //len += SerializeObject(stream, property.GetValue(obj)); + len += SerializeObject(stream, serializObject.MemberAccessor.GetValue(obj, memberInfo.Name)); + } + //foreach (PropertyInfo property in serializObject.Properties) + //{ + //} + + //foreach (FieldInfo fieldInfo in serializObject.FieldInfos) + //{ + // byte[] propertyBytes = Encoding.UTF8.GetBytes(fieldInfo.Name); + // if (propertyBytes.Length > byte.MaxValue) + // { + // throw new Exception($"属性名:{fieldInfo.Name}超长"); + // } + // byte lenBytes = (byte)propertyBytes.Length; + // stream.Write(lenBytes); + // stream.Write(propertyBytes, 0, propertyBytes.Length); + // len += propertyBytes.Length + 1; + // len += SerializeObject(stream, fieldInfo.GetValue(obj)); + //} + } + return len; + } + + private static int SerializeDictionary(ByteBlock stream, IEnumerable param) + { + int len = 0; + if (param != null) + { + long oldPosition = stream.Position; + stream.Position += 4; + len += 4; + uint paramLen = 0; + + foreach (dynamic item in param) + { + len += SerializeObject(stream, item.Key); + len += SerializeObject(stream, item.Value); + paramLen++; + } + long newPosition = stream.Position; + stream.Position = oldPosition; + stream.Write(TouchSocketBitConverter.Default.GetBytes(paramLen)); + stream.Position = newPosition; + } + return len; + } + + private static int SerializeIListOrArray(ByteBlock stream, IEnumerable param) + { + int len = 0; + if (param != null) + { + long oldPosition = stream.Position; + stream.Position += 4; + len += 4; + uint paramLen = 0; + + foreach (object item in param) + { + paramLen++; + len += SerializeObject(stream, item); + } + long newPosition = stream.Position; + stream.Position = oldPosition; + stream.Write(TouchSocketBitConverter.Default.GetBytes(paramLen)); + stream.Position = newPosition; + } + return len; + } + + private static int SerializeObject(ByteBlock byteBlock, T graph) + { + int len = 0; + byte[] data = null; + + long startPosition = byteBlock.Position; + long endPosition; + if (graph != null) + { + Type type = graph.GetType(); + if (type.IsPrimitive) + { + switch (graph) + { + case byte value: + { + data = new byte[] { value }; + break; + } + case sbyte value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case bool value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case short value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case ushort value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case int value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case uint value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case long value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case ulong value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case float value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case double value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + case char value: + { + data = TouchSocketBitConverter.Default.GetBytes(value); + break; + } + default: + { + throw new Exception("未知基础类型"); + } + } + } + else + { + switch (graph) + { + case string value: + { + data = Encoding.UTF8.GetBytes(value); + break; + } + case DateTime value: + { + data = TouchSocketBitConverter.Default.GetBytes(value.Ticks); + break; + } + case Enum _: + { + var enumValType = Enum.GetUnderlyingType(type); + + if (enumValType == TouchSocketCoreUtility.byteType) + { + data = new byte[] { Convert.ToByte(graph) }; + } + else if (enumValType == TouchSocketCoreUtility.shortType) + { + data = TouchSocketBitConverter.Default.GetBytes(Convert.ToInt16(graph)); + } + else if (enumValType == TouchSocketCoreUtility.intType) + { + data = TouchSocketBitConverter.Default.GetBytes(Convert.ToInt32(graph)); + } + else + { + data = TouchSocketBitConverter.Default.GetBytes(Convert.ToInt64(graph)); + } + break; + } + case byte[] value: + { + data = value; + break; + } + default: + { + byteBlock.Position += 4; + var serializeObj = GetOrAddInstance(type); + if (serializeObj.Converter != null) + { + len += serializeObj.Converter.Write(byteBlock, graph); + } + else + { + switch (serializeObj.InstanceType) + { + case InstanceType.List: + len += SerializeIListOrArray(byteBlock, (IEnumerable)graph); + break; + + case InstanceType.Array: + len += SerializeIListOrArray(byteBlock, (IEnumerable)graph); + break; + + case InstanceType.Dictionary: + len += SerializeDictionary(byteBlock, (IEnumerable)graph); + break; + + default: + case InstanceType.Class: + len += SerializeClass(byteBlock, graph, type); + break; + } + } + break; + } + } + } + + if (data != null) + { + len = data.Length; + endPosition = len + startPosition + 4; + } + else + { + endPosition = byteBlock.Position; + } + } + else + { + endPosition = startPosition + 4; + } + + byte[] lenBuffer = TouchSocketBitConverter.Default.GetBytes(len); + byteBlock.Position = startPosition; + byteBlock.Write(lenBuffer, 0, lenBuffer.Length); + + if (data != null) + { + byteBlock.Write(data, 0, data.Length); + } + byteBlock.Position = endPosition; + return len + 4; + } + + #endregion Serialize + + #region Deserialize + + /// + /// 反序列化 + /// + /// + /// + /// + /// + public static object Deserialize(byte[] data, int offset, Type type) + { + if (data[offset] != 1) + { + throw new Exception("Fast反序列化数据流解析错误。"); + } + offset += 1; + return Deserialize(type, data, ref offset); + } + + private static object Deserialize(Type type, byte[] datas, ref int offset) + { + bool nullable = type.IsNullableType(); + if (nullable) + { + type = type.GenericTypeArguments[0]; + } + dynamic obj; + int len = TouchSocketBitConverter.Default.ToInt32(datas, offset); + offset += 4; + if (len > 0) + { + if (type == TouchSocketCoreUtility.stringType) + { + obj = Encoding.UTF8.GetString(datas, offset, len); + } + else if (type == TouchSocketCoreUtility.byteType) + { + obj = datas[offset]; + } + else if (type == TouchSocketCoreUtility.sbyteType) + { + obj = (sbyte)(TouchSocketBitConverter.Default.ToInt16(datas, offset)); + } + else if (type == TouchSocketCoreUtility.boolType) + { + obj = (TouchSocketBitConverter.Default.ToBoolean(datas, offset)); + } + else if (type == TouchSocketCoreUtility.shortType) + { + obj = (TouchSocketBitConverter.Default.ToInt16(datas, offset)); + } + else if (type == TouchSocketCoreUtility.ushortType) + { + obj = (TouchSocketBitConverter.Default.ToUInt16(datas, offset)); + } + else if (type == TouchSocketCoreUtility.intType) + { + obj = (TouchSocketBitConverter.Default.ToInt32(datas, offset)); + } + else if (type == TouchSocketCoreUtility.uintType) + { + obj = (TouchSocketBitConverter.Default.ToUInt32(datas, offset)); + } + else if (type == TouchSocketCoreUtility.longType) + { + obj = (TouchSocketBitConverter.Default.ToInt64(datas, offset)); + } + else if (type == TouchSocketCoreUtility.ulongType) + { + obj = (TouchSocketBitConverter.Default.ToUInt64(datas, offset)); + } + else if (type == TouchSocketCoreUtility.floatType) + { + obj = (TouchSocketBitConverter.Default.ToSingle(datas, offset)); + } + else if (type == TouchSocketCoreUtility.doubleType) + { + obj = (TouchSocketBitConverter.Default.ToDouble(datas, offset)); + } + else if (type == TouchSocketCoreUtility.decimalType) + { + obj = (TouchSocketBitConverter.Default.ToDouble(datas, offset)); + } + else if (type == TouchSocketCoreUtility.charType) + { + obj = (TouchSocketBitConverter.Default.ToChar(datas, offset)); + } + else if (type == TouchSocketCoreUtility.dateTimeType) + { + obj = (new DateTime(TouchSocketBitConverter.Default.ToInt64(datas, offset))); + } + else if (type.BaseType == typeof(Enum)) + { + Type enumType = Enum.GetUnderlyingType(type); + + if (enumType == typeof(byte)) + { + obj = Enum.ToObject(type, datas[offset]); + } + else if (enumType == typeof(short)) + { + obj = Enum.ToObject(type, TouchSocketBitConverter.Default.ToInt16(datas, offset)); + } + else if (enumType == typeof(int)) + { + obj = Enum.ToObject(type, TouchSocketBitConverter.Default.ToInt32(datas, offset)); + } + else + { + obj = Enum.ToObject(type, TouchSocketBitConverter.Default.ToInt64(datas, offset)); + } + } + else if (type == TouchSocketCoreUtility.bytesType) + { + byte[] data = new byte[len]; + Buffer.BlockCopy(datas, offset, data, 0, len); + obj = data; + } + else if (type.IsClass || type.IsStruct()) + { + var serializeObj = GetOrAddInstance(type); + if (serializeObj.Converter != null) + { + obj = serializeObj.Converter.Read(datas, offset, len); + } + else + { + obj = DeserializeClass(type, datas, offset, len); + } + } + else + { + throw new Exception("未定义的类型:" + type.ToString()); + } + } + else + { + if (nullable) + { + obj = null; + } + else + { + obj = type.GetDefault(); + } + } + offset += len; + return obj; + } + + private static object DeserializeClass(Type type, byte[] datas, int offset, int length) + { + SerializObject serializObject = GetOrAddInstance(type); + + object instance; + switch (serializObject.InstanceType) + { + case InstanceType.Class: + { + instance = serializObject.GetNewInstance(); + int index = offset; + while (offset - index < length && (length >= 4)) + { + int len = datas[offset]; + string propertyName = Encoding.UTF8.GetString(datas, offset + 1, len); + offset += len + 1; + if (serializObject.IsStruct) + { + if (serializObject.PropertiesDic.ContainsKey(propertyName)) + { + PropertyInfo property = serializObject.PropertiesDic[propertyName]; + object obj = Deserialize(property.PropertyType, datas, ref offset); + property.SetValue(instance, obj); + } + else if (serializObject.FieldInfosDic.ContainsKey(propertyName)) + { + FieldInfo property = serializObject.FieldInfosDic[propertyName]; + object obj = Deserialize(property.FieldType, datas, ref offset); + property.SetValue(instance, obj); + } + else + { + int pLen = TouchSocketBitConverter.Default.ToInt32(datas, offset); + offset += 4; + offset += pLen; + } + } + else + { + if (serializObject.PropertiesDic.TryGetValue(propertyName, out PropertyInfo property)) + { + object obj = Deserialize(property.PropertyType, datas, ref offset); + serializObject.MemberAccessor.SetValue(instance, property.Name, obj); + } + else if (serializObject.FieldInfosDic.TryGetValue(propertyName, out FieldInfo fieldInfo)) + { + object obj = Deserialize(fieldInfo.FieldType, datas, ref offset); + serializObject.MemberAccessor.SetValue(instance, fieldInfo.Name, obj); + } + else + { + int pLen = TouchSocketBitConverter.Default.ToInt32(datas, offset); + offset += 4; + offset += pLen; + } + } + } + break; + } + case InstanceType.List: + { + instance = serializObject.GetNewInstance(); + if (length > 0) + { + uint paramLen = TouchSocketBitConverter.Default.ToUInt32(datas, offset); + offset += 4; + for (uint i = 0; i < paramLen; i++) + { + object obj = Deserialize(serializObject.ArgTypes[0], datas, ref offset); + serializObject.AddMethod.Invoke(instance, new object[] { obj }); + } + } + else + { + instance = null; + } + break; + } + case InstanceType.Array: + { + if (length > 0) + { + uint paramLen = TouchSocketBitConverter.Default.ToUInt32(datas, offset); + Array array = Array.CreateInstance(serializObject.ArrayType, paramLen); + + offset += 4; + for (uint i = 0; i < paramLen; i++) + { + object obj = Deserialize(serializObject.ArrayType, datas, ref offset); + array.SetValue(obj, i); + } + instance = array; + } + else + { + instance = null; + } + break; + } + case InstanceType.Dictionary: + { + instance = serializObject.GetNewInstance(); + if (length > 0) + { + uint paramLen = TouchSocketBitConverter.Default.ToUInt32(datas, offset); + offset += 4; + for (uint i = 0; i < paramLen; i++) + { + object key = Deserialize(serializObject.ArgTypes[0], datas, ref offset); + object value = Deserialize(serializObject.ArgTypes[1], datas, ref offset); + if (key != null) + { + serializObject.AddMethod.Invoke(instance, new object[] { key, value }); + } + } + + //uint paramLen = TouchSocketBitConverter.Default.ToUInt32(datas, offset); + //offset += 4; + //for (uint i = 0; i < paramLen; i++) + //{ + // offset += 4; + // offset += datas[offset] + 1; + // object key = this.Deserialize(instanceObject.ArgTypes[0], datas, ref offset); + + // offset += datas[offset] + 1; + // object value = this.Deserialize(instanceObject.ArgTypes[1], datas, ref offset); + // if (key != null) + // { + // instanceObject.AddMethod.Invoke(instance, new object[] { key, value }); + // } + //} + } + else + { + instance = null; + } + break; + } + default: + instance = null; + break; + } + + return instance; + } + + #endregion Deserialize + + private static SerializObject GetOrAddInstance(Type type) + { + if (m_instanceCache.TryGetValue(type, out SerializObject instance)) + { + return instance; + } + if (type.IsArray)//数组 + { + SerializObject instanceObject = new SerializObject(type); + m_instanceCache.TryAdd(type, instanceObject); + return instanceObject; + } + else if (type.IsClass || type.IsStruct()) + { + if (type.IsNullableType()) + { + type = type.GetGenericArguments()[0]; + } + + SerializObject instanceObject = new SerializObject(type); + m_instanceCache.TryAdd(type, instanceObject); + return instanceObject; + } + return null; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs.meta new file mode 100644 index 0000000..cf38f5c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/FastBinaryFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82fc7fc81c480e0418541695cb6f6935 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs new file mode 100644 index 0000000..fe937a5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Core +{ + /// + /// FastBinary转换器 + /// + public interface IFastBinaryConverter + { + /// + /// 读取对象,不需要考虑为null的情况。 + /// + /// + /// + /// + /// + public object Read(byte[] buffer, int offset, int len); + + /// + /// 写入对象,不需要考虑为null的情况。 + /// + /// + /// + public int Write(ByteBlock byteBlock, object obj); + } + + /// + /// FastBinary转换器 + /// + /// + public abstract class FastBinaryConverter : IFastBinaryConverter + { + int IFastBinaryConverter.Write(ByteBlock byteBlock, object obj) + { + return Write(byteBlock, (T)obj); + } + + object IFastBinaryConverter.Read(byte[] buffer, int offset, int len) + { + return Read(buffer, offset, len); + } + + /// + /// 写入对象,不需要考虑为null的情况。 + /// + /// + /// + protected abstract int Write(ByteBlock byteBlock, T obj); + + /// + /// 读取对象,不需要考虑为null的情况。 + /// + /// + /// + /// + /// + protected abstract T Read(byte[] buffer, int offset, int len); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs.meta new file mode 100644 index 0000000..c1271b8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/IFastBinaryConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1f851f5fd1012543a1e7a3e49d1c3bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs new file mode 100644 index 0000000..7383eea --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + internal enum InstanceType + { + Class, + List, + Array, + Dictionary + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs.meta new file mode 100644 index 0000000..293ee04 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/InstanceType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c95395d83d4b3934cbf0e29e1cdd9c99 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs new file mode 100644 index 0000000..29e080d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs @@ -0,0 +1,191 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace TouchSocket.Core +{ + internal class SerializObject + { + private MemberInfo[] m_MemberInfos; + private FieldInfo[] m_fieldInfos; + private PropertyInfo[] m_properties; + public IFastBinaryConverter Converter { get; set; } + public SerializObject(Type type) + { + Type = type; + if (type.IsArray)//数组 + { + this.InstanceType = InstanceType.Array; + this.ArrayType = type.GetElementType(); + } + else if (type.IsClass || type.IsStruct()) + { + if (type.IsNullableType()) + { + type = type.GetGenericArguments()[0]; + } + this.Type = type; + if (TouchSocketCoreUtility.listType.IsAssignableFrom(type)) + { + Type genericType = type; + while (true) + { + if (genericType.IsGenericType) + { + break; + } + genericType = genericType.BaseType; + if (genericType == TouchSocketCoreUtility.objType) + { + break; + } + } + this.ArgTypes = genericType.GetGenericArguments(); + this.AddMethod = new Method(type.GetMethod("Add")); + this.InstanceType = InstanceType.List; + } + else if (TouchSocketCoreUtility.dicType.IsAssignableFrom(type)) + { + Type genericType = type; + while (true) + { + if (genericType.IsGenericType) + { + break; + } + genericType = genericType.BaseType; + if (genericType == TouchSocketCoreUtility.objType) + { + break; + } + } + this.ArgTypes = genericType.GetGenericArguments(); + this.AddMethod = new Method(type.GetMethod("Add")); + this.InstanceType = InstanceType.Dictionary; + } + else + { + this.InstanceType = InstanceType.Class; + MemberAccessor = new MemberAccessor(type) + { + OnGetFieldInfes = GetFieldInfos, + OnGetProperties = GetProperties + }; + MemberAccessor.Build(); + } + if (type.GetCustomAttribute() is FastConverterAttribute attribute) + { + this.Converter = (IFastBinaryConverter)Activator.CreateInstance(attribute.Type); + } + this.PropertiesDic = GetProperties(type).ToDictionary(a => a.Name); + this.FieldInfosDic = GetFieldInfos(type).ToDictionary(a => a.Name); + if (type.IsGenericType) + { + this.ArgTypes = type.GetGenericArguments(); + } + } + this.IsStruct = type.IsStruct(); + } + + public bool IsStruct { get; private set; } + + public Method AddMethod { get; private set; } + + public Type[] ArgTypes { get; private set; } + + public Type ArrayType { get; private set; } + + public FieldInfo[] FieldInfos + { + get + { + m_fieldInfos ??= FieldInfosDic.Values.ToArray(); + return m_fieldInfos; + } + } + + public MemberInfo[] MemberInfos + { + get + { + if (m_MemberInfos == null) + { + List infos = new List(); + infos.AddRange(FieldInfosDic.Values); + infos.AddRange(PropertiesDic.Values); + m_MemberInfos = infos.ToArray(); + } + return m_MemberInfos; + } + } + + public Dictionary FieldInfosDic { get; private set; } + + public InstanceType InstanceType { get; private set; } + + public MemberAccessor MemberAccessor { get; private set; } + + public PropertyInfo[] Properties + { + get + { + m_properties ??= PropertiesDic.Values.ToArray(); + return m_properties; + } + } + + public Dictionary PropertiesDic { get; private set; } + + public Type Type { get; private set; } + + public object GetNewInstance() + { + return Activator.CreateInstance(Type); + } + + private static FieldInfo[] GetFieldInfos(Type type) + { + return type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Default) + .Where(p => + { + return !p.IsInitOnly && (!p.IsDefined(typeof(FastNonSerializedAttribute), true)); + }) + .ToArray(); + } + + private static PropertyInfo[] GetProperties(Type type) + { + return type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.Default) + .Where(p => + { + if (p.IsDefined(typeof(FastSerializedAttribute), true)) + { + return true; + } + else + { + return p.CanWrite && + p.CanRead && + (!p.IsDefined(typeof(FastNonSerializedAttribute), true) && + (p.SetMethod.GetParameters().Length == 1) && + (p.GetMethod.GetParameters().Length == 0)); + } + }) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs.meta new file mode 100644 index 0000000..a08dcb3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1d675399c48bf249a9a5daaa4ca735c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs new file mode 100644 index 0000000..fb59f61 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Core +{ + /// + /// 序列化类型 + /// + public enum SerializationType : byte + { + /// + /// 内置快速二进制 + /// + FastBinary, + + /// + /// Json + /// + Json, + + /// + /// Xml + /// + Xml, + + /// + /// 系统二进制。微软认为这是不安全的,所以谨慎使用。 + /// + SystemBinary + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs.meta new file mode 100644 index 0000000..e0e47a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/SerializationType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79917ec9dc2374549a16882cdf67be02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs new file mode 100644 index 0000000..1be42ec --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Core +{ + internal class VersionFastBinaryConverter : FastBinaryConverter + { + protected override Version Read(byte[] buffer, int offset, int len) + { + ValueByteBlock byteBlock = new ValueByteBlock(buffer); + byteBlock.Pos = offset; + return new Version(byteBlock.ReadInt32(), byteBlock.ReadInt32(), byteBlock.ReadInt32(), byteBlock.ReadInt32()); + } + + protected override int Write(ByteBlock byteBlock, Version obj) + { + byteBlock.Write(obj.Major); + byteBlock.Write(obj.Minor); + byteBlock.Write(obj.Build); + byteBlock.Write(obj.Revision); + return sizeof(int) * 4; + } + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs.meta new file mode 100644 index 0000000..230849f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/FastBinary/VersionFastBinaryConverter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65c7b014b1efcc940a2fb71e48494103 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json.meta new file mode 100644 index 0000000..50cfc29 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9a566372cb2f41d4ba8a9d0f4d267723 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs new file mode 100644 index 0000000..bdafedb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs @@ -0,0 +1,830 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Dynamic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace TouchSocket.Core +{ + /// + /// Json高速转换 + /// 此代码来源:https://gitee.com/majorworld + /// + public static class JsonFastConverter + { + /// + /// 全局时间序列化样式,默认为yyyy-MM-dd HH:mm:ss + /// + public static string TimeFormat = "yyyy-MM-dd HH:mm:ss"; + + /// + /// 将Json字符串转为指定类型 + /// + /// + /// + /// + public static T JsonFrom(string s) where T : class + { + return (T)JsonFrom(s, typeof(T)); + } + + /// + /// 将Json字符串转为指定类型 + /// + /// + /// + /// + /// + public static object JsonFrom(string s, Type t) + { + if (s == null) + throw new NullReferenceException("不能为null"); + StringBuilder sb = new StringBuilder(s.Length); + Dictionary dict = new Dictionary(); + List list = new List(); + int index = 0; + switch (s[0]) + { + case '{': + return s.GetObject(ref index, sb, list).ToObject(t); + + case '[': + var data = s.GetArray(ref index, sb, dict); + if (t == typeof(DataTable)) + return data.ToDataTable();//处理表类型 + if (t.GetGenericArguments().Length < 1) + { + if (t.IsArray) + JsonChange.ChangeArray(t.GetElementType(), data);//处理数组类型 + return JsonChange.ChangeData(t, data);//处理动态类型 + } + if (t.IsList()) + { + return JsonChange.ChangeList(t.GetGenericArguments()[0], data);//处理集合类型 + } + throw new NullReferenceException("类型应该为集合或数组或dynamic"); + default: + throw new NullReferenceException("第一个字符缺失{或["); + } + } + + /// + /// 将Json字符串转为对象
      + /// 重载,当前数据类型速度最快 + ///
      + /// + /// + public static Dictionary JsonFrom(string s) + { + return JsonFrom>(s); + } + + /// + /// 将对象转为Json字符串 + /// + /// + /// + /// 时间序列化样式,默认为yyyy-MM-dd HH:mm:ss + /// + public static string JsonTo(T t, string timeFormat = null) + { + StringBuilder sb = new StringBuilder(); + t.CodeObject(sb, timeFormat ?? TimeFormat); + return sb.ToString(); + } + } + + /// + /// 过滤不需要序列化的字段 + /// + public class JsonFastIgnore : Attribute + { } + + /// + /// 转换为实体类对应的类型 + /// + internal static class JsonChange + { + #region 类型判断 + + internal static bool IsDictionary(this Type type) => (typeof(IDictionary).IsAssignableFrom(type)); + + internal static bool IsList(this Type type) => (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)); + + #endregion 类型判断 + + #region 转换 + + /// + /// 处理数组类型 + /// https://gitee.com/majorworld + /// + /// + /// + /// + internal static object ChangeArray(Type type, IList data) + { + var array = Array.CreateInstance(type, data.Count); + for (int i = 0; i < data.Count; i++) + { + array.SetValue(type.ChangeData(data[i]), i); + } + return array; + } + + /// + /// 转换ArrayList类型 + /// https://gitee.com/majorworld + /// + /// + /// + internal static ArrayList ChangeArrayList(object value) + { + ArrayList array = new ArrayList(); + if (value is IList list) + { + foreach (var item in list) + array.Add(item); + } + return array; + } + + /// + /// 转换为各种数据 + /// https://gitee.com/majorworld + /// + /// + /// + /// + internal static object ChangeData(this Type p, object value) + { + if (value is Dictionary dictionary) + { + return ToObject(dictionary, p);//解析子级实体类的数据 + } + else if (p == typeof(string)) + { + return Convert.ChangeType(value, p); + } + else if (p.IsPrimitive && p != typeof(char)) + { + return Convert.ChangeType(value, p); + } + else if (p == typeof(byte[])) + { + return Convert.FromBase64String(value as string); + } + else if (p == typeof(Guid)) + { + return Guid.Parse(value as string); + } + else if (p == typeof(ArrayList)) + { + return ChangeArrayList(value);//处理动态数组类型 + } + else if (value is IList list) + { + if (p.GetGenericArguments().Length < 1) + { + if (p.IsArray) + return ChangeArray(p.GetElementType(), value as IList);//处理数组类型 + List d = new List(); + foreach (var kv in list as dynamic) + { + if (kv is Dictionary dict) + d.Add(dict.ToObject(typeof(object))); + } + return d;//解析dynamic + } + return ChangeList(p.GetGenericArguments()[0], value as List);//处理List类型 + } + return Convert.ChangeType(value, p); + } + + /// + /// 处理字典类型 + /// https://gitee.com/majorworld + /// + /// + /// + /// + internal static object ChangeDictionary(Type type, Dictionary dict) + { + //反射创建泛型字典 + var t = typeof(Dictionary<,>).MakeGenericType(new[] { type.GetGenericArguments()[0], type.GetGenericArguments()[1] }); ; + var d = Activator.CreateInstance(t) as IDictionary; + foreach (var item in dict) + d.Add(type.GetGenericArguments()[0].ChangeData(item.Key), type.GetGenericArguments()[1].ChangeData(item.Value)); + return d; + } + + /// + /// 处理集合类型 + /// https://gitee.com/majorworld + /// + /// + /// + /// + internal static object ChangeList(Type type, List data) + { + IList list = Activator.CreateInstance(typeof(List<>).MakeGenericType(type)) as IList; + foreach (var item in data) + list.Add(type.ChangeData(item)); + return list; + } + /// + /// List转DataTable + /// https://gitee.com/majorworld + /// + /// + /// + /// + internal static DataTable ToDataTable(this List list) + { + DataTable dt = new DataTable(); + for (int i = 0; i < list.Count; i++) + { + Dictionary dict = list[i] as Dictionary; + if (i == 0) + { + foreach (var item in dict) + { + dt.Columns.Add(item.Key, item.Value.GetType()); + } + } + dt.Rows.Add(dict.Values.ToArray()); + } + return dt; + } + + /// + /// 转换为对象 + /// https://gitee.com/majorworld + /// + /// + /// + /// + internal static object ToObject(this Dictionary dict, Type type) + { + //(1/4)返回原始解析数据 + if (type == typeof(Dictionary)) + { + return dict; + } + //(2/4)返回dynamic类型数据 + if (type.UnderlyingSystemType.Name == "Object") + { + dynamic d = new ExpandoObject(); + foreach (var kv in dict) + { + if (kv.Value is Dictionary dictionary) + (d as ICollection>).Add(new KeyValuePair(kv.Key, ToObject(dictionary, typeof(object)))); + else + (d as ICollection>).Add(kv); + } + return d; + } + //(3/4)返回DataSet类型数据 + if (type == typeof(DataSet)) + { + DataSet ds = new DataSet(); + foreach (var item in dict) + { + if (item.Value is List list) + { + var dt = list.ToDataTable(); + dt.TableName = item.Key; + ds.Tables.Add(dt); + } + } + return ds; + } + //(4/4)返回所绑定的实体类数据 + var obj = Activator.CreateInstance(type); + var props = type.GetCacheInfo(); + foreach (var kv in dict) + { + var prop = props.Where(x => string.Equals(x.Name, kv.Key, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + if (prop is null) + { + if (type.IsDictionary()) + { + return ChangeDictionary(type, dict);//解析值是字典的数据(非缓存字段的字典) + } + continue; + } + if (prop.CanWrite) + { + prop.SetValue(obj, prop.PropertyType.ChangeData(kv.Value), null);//递归调用当前方法,解析子级 + } + } + return obj; + } + + private static object Go(string sValue) + { + Type type = typeof(T); + return System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(sValue.ToString()); + } + + #endregion 转换 + } + + /// + /// 解析字符串为对象 + /// + internal static class JsonDecode + { + #region 解析 + + /// + /// 解析集合 + /// https://gitee.com/majorworld + /// + /// + /// + /// + /// + /// + internal static List GetArray(this string s, ref int index, StringBuilder sb, Dictionary dict) + { + index++; + List list = new List(); + while (index < s.Length) + { + switch (s[index]) + { + case ',': + index++; + break; + + case '"': + list.Add(s.GetString(ref index, sb)); + break; + + case ']': + ++index; + return list; + + case ' ': + case '\r': + case '\n': + case '\t': + case '\f': + case '\b': + ++index; + break; + + default: + list.Add(s.GetData(s[index], ref index, sb, dict, list)); + break; + } + } + return list; + } + + /// + /// 解析对象 + /// https://gitee.com/majorworld + /// + /// + /// + /// + /// + /// + internal static Dictionary GetObject(this string s, ref int index, StringBuilder sb, List list) + { + index++; + Dictionary dict = new Dictionary(); + string key = string.Empty; + bool iskey = true; + while (index < s.Length) + { + switch (s[index]) + { + case ',': + iskey = true; + key = string.Empty; + index++; + break; + + case ':': + iskey = false; + index++; + break; + + case '}': + ++index; + return dict; + + case '"': + if (iskey) + key = s.GetString(ref index, sb); + else + dict.Add(key, s.GetString(ref index, sb)); + break; + + case ' ': + case '\r': + case '\n': + case '\t': + case '\f': + case '\b': + index++; + break; + + default: + dict.Add(key, s.GetData(s[index], ref index, sb, dict, list)); + break; + } + } + throw new FormatException("解析错误,不完整的Json"); + } + + /// + /// 获取布尔数据 + /// https://gitee.com/majorworld + /// + /// + /// + /// + /// + private static bool GetBool(this string s, ref int index, bool state) + { + if (state) + { + if (s[index + 1] == 'r' && s[index + 2] == 'u' && s[index + 3] == 'e') + { + index += 4; + return true; + } + } + else + { + if (s[index + 1] == 'a' && s[index + 2] == 'l' && s[index + 3] == 's' && s[index + 4] == 'e') + { + index += 5; + return false; + } + } + throw new FormatException($"\"{string.Concat(s[index], s[index + 1], s[index + 2], s[index + 3])}\"处Json格式无法解析"); + } + + /// + /// 自动获取数据 + /// https://gitee.com/majorworld + /// + /// + /// + /// + /// + /// + /// + /// + private static object GetData(this string s, char c, ref int index, StringBuilder sb, Dictionary dict, List list) + { + switch (c) + { + case 't': + return s.GetBool(ref index, true); + + case 'f': + return s.GetBool(ref index, false); + + case 'n': + return s.GetNull(ref index); + + case '{': + return s.GetObject(ref index, sb, list); + + case '[': + return s.GetArray(ref index, sb, dict); + + default: + return s.GetNumber(ref index, sb); + } + } + + /// + /// 获取空数据 + /// https://gitee.com/majorworld + /// + /// + /// + /// + private static object GetNull(this string s, ref int index) + { + if (s[index + 1] == 'u' && s[index + 2] == 'l' && s[index + 3] == 'l') + { + index += 4; + return null; + } + throw new FormatException($"\"{string.Concat(s[index], s[index + 1], s[index + 2], s[index + 3])}\"处Json格式无法解析"); + } + + /// + /// 获取数字数据 + /// https://gitee.com/majorworld + /// + /// + /// + /// + /// + private static object GetNumber(this string s, ref int index, StringBuilder sb) + { + sb.Clear(); + for (; index < s.Length; ++index) + { + if (s[index] == ',' || s[index] == '}' || s[index] == ']' || s[index] == ' ' || s[index] == '\n' || s[index] == '\r') + break; + else + sb.Append(s[index]); + } + string code = sb.ToString(); + if (long.TryParse(code, out long x)) + return x; + if (double.TryParse(code, out double y)) + return y; + throw new FormatException($"\"{code}\"处Json格式无法解析"); + } + + /// + /// 获取字符串数据 + /// https://gitee.com/majorworld + /// + /// + /// + /// + /// + private static string GetString(this string s, ref int index, StringBuilder sb) + { + sb.Clear(); + index++; + for (; index < s.Length; ++index) + { + switch (s[index]) + { + case '"': + index++; + return sb.ToString(); + + case '\\': + if (s[index + 1] == '"' || s[index + 1] == '\\') + index++; + sb.Append(s[index]); + break; + + default: + sb.Append(s[index]); + break; + } + } + throw new FormatException($"\"{sb}\"处Json格式无法解析"); + } + + #endregion 解析 + } + + /// + /// 编码对象为字符串 + /// + internal static class JsonEncode + { + /// + /// 缓存数据加速序列化速度,主要是减少不必要的GetCustomAttributes获取特性并过滤字段 + /// + internal static ConcurrentDictionary InfoCache = new ConcurrentDictionary(); + + /// + /// 序列化 + /// + /// + /// + /// + internal static void CodeObject(this object obj, StringBuilder sb, string timeFormat) + { + bool get = true; + switch (obj) + { + case null: + sb.Append("null"); + break; + + case Enum _: + sb.Append($"{Convert.ToInt32(obj)}"); + break; + + case byte[] bytes: + sb.Append($"\"{Convert.ToBase64String(bytes)}\""); + break; + + case Array array: + sb.Append('['); + for (int i = 0; i < array.Length; i++) + { + if (i != 0) + sb.Append(","); + array.GetValue(i).CodeObject(sb, timeFormat); + } + sb.Append(']'); + break; + + case string _: + sb.Append($"\"{obj}\""); + break; + + case char _: + sb.Append($"\"{obj}\""); + break; + + case bool _: + sb.Append($"{obj.ToString().ToLower()}"); + break; + + case DataTable dt: + dt.CodeDataTable(sb, timeFormat); + break; + + case DataSet ds: + sb.Append('{'); + for (int i = 0; i < ds.Tables.Count; i++) + { + if (i != 0) + sb.Append(","); + sb.Append($"\"{ds.Tables[i].TableName}\":"); + ds.Tables[i].CodeDataTable(sb, timeFormat); + } + sb.Append('}'); + break; + + case DateTime time: + sb.AppendFormat($"\"{time.ToString(timeFormat)}\""); + break; + + case Guid id: + sb.AppendFormat($"\"{id}\""); + break; + case ArrayList list: + sb.Append('['); + for (int i = 0; i < list.Count; i++) + { + if (i != 0) + sb.Append(","); + list[i].CodeObject(sb, timeFormat); + } + sb.Append(']'); + break; + + default: + get = false; + break; + } + if (get) + return; + Type type = obj.GetType(); + //数字 + if (type.IsPrimitive && type != typeof(char)) + { + sb.Append($"{obj}"); + return; + } + //字典 + else if (type.IsDictionary()) + { + sb.Append('{'); + var collection = obj as IDictionary; + var enumerator = collection.GetEnumerator(); + int index = 0; + while (enumerator.MoveNext()) + { + if (index != 0) + sb.Append(","); + sb.Append($"\"{enumerator.Key}\":"); + enumerator.Value.CodeObject(sb, timeFormat); + index++; + } + sb.Append('}'); + return; + } + //集合 + else if (type.IsList()) + { + sb.Append('['); + if (obj is IList list) + { + for (int i = 0; i < list.Count; i++) + { + if (i != 0) + sb.Append(","); + list[i].CodeObject(sb, timeFormat); + } + } + sb.Append(']'); + return; + } + else if (type.UnderlyingSystemType.Name == "ExpandoObject") + { + sb.Append('{'); + bool first = true; + foreach (dynamic item in obj as dynamic) + { + if (!first) + sb.Append(','); + first = false; + object value = item.Value; + sb.Append($"\"{item.Key}\":"); + value.CodeObject(sb, timeFormat); + } + sb.Append('}'); + return; + } + + //对象 + var prop = type.GetCacheInfo(); + if (prop is null) + { + sb.Append("null"); + return; + } + sb.Append('{'); + for (int i = 0; i < prop.Length; i++) + { + PropertyInfo p = prop[i]; + if (i != 0) + sb.Append(","); + var data = p.GetValue(obj, null); + sb.Append($"\"{p.Name}\":"); + data.CodeObject(sb, timeFormat); + } + sb.Append("}"); + } + + /// + /// 尝试获取缓存中的类型,排除忽略的字段 + /// + /// + /// + internal static PropertyInfo[] GetCacheInfo(this Type type) + { + if (InfoCache.TryGetValue(type, out PropertyInfo[] props)) { } + else + { + props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); + List cache = new List(); + foreach (var item in props) + { + if (Attribute.GetCustomAttributes(item, typeof(JsonFastIgnore))?.Length == 0) + cache.Add(item); + } + InfoCache[type] = cache.ToArray(); + props = cache.ToArray(); + } + return props; + } + + /// + /// 序列化DataTable + /// + /// + /// + /// 时间格式化样式,默认为yyyy-MM-dd HH:mm:ss + private static void CodeDataTable(this DataTable dt, StringBuilder sb, string timeFormat) + { + sb.Append('['); + for (int i = 0; i < dt.Rows.Count; i++) + { + if (i != 0) + sb.Append(","); + var item = dt.Rows[i]; + sb.Append('{'); + for (int j = 0; j < dt.Columns.Count; j++) + { + if (j != 0) + sb.Append(","); + var cell = dt.Columns[j]; + sb.Append($"\"{cell}\":"); + item[j].CodeObject(sb, timeFormat); + } + sb.Append('}'); + } + sb.Append(']'); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs.meta new file mode 100644 index 0000000..bfdc049 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonFast.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 844d00cb7dba70b43a0ac0729bb588e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs new file mode 100644 index 0000000..6b01975 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs @@ -0,0 +1,147 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Linq; +using System.Reflection; + +namespace TouchSocket.Core +{ + /// + /// 提供Json.net无引用调用。 + /// 该代码来源:https://www.cnblogs.com/kewei/p/8228343.html + /// + internal static class JsonNet + { + /// + /// Json.Net程序集名称 + /// + private static readonly string jsonNetAssemblyName = "Newtonsoft.Json"; + + /// + /// JsonConvert类名 + /// + private static readonly string jsonNetJsonConvertTypeName = "Newtonsoft.Json.JsonConvert"; + + /// + /// 序列化方法的委托 + /// + private static Func serializeFunc = null; + + /// + /// 反序列化方法的委托 + /// + private static Func deserializeFunc = null; + + /// + /// 获取是否得到支持 + /// + public static bool IsSupported { get; private set; } = false; + + /// + /// Json.net + /// + static JsonNet() + { + AppDomain.CurrentDomain.AssemblyLoad += (s, e) => InitJsonNet(e.LoadedAssembly); + InitJsonNet(AppDomain.CurrentDomain.GetAssemblies()); + } + + /// + /// 序列化对象 + /// + /// 对象 + /// + public static string SerializeObject(object obj) + { + return JsonNet.serializeFunc.Invoke(obj); + } + + /// + /// 反序列化为对象 + /// + /// json文本 + /// 对象类型 + /// + public static object DeserializeObject(string json, Type type) + { + return JsonNet.deserializeFunc.Invoke(json, type); + } + + /// + /// 初始化json.net + /// + /// 查找的程序集 + private static void InitJsonNet(params Assembly[] assemblies) + { + if (JsonNet.IsSupported == true) + { + return; + } + + var jsonNetAssembly = assemblies + .FirstOrDefault(item => item.GetName().Name.Equals(jsonNetAssemblyName, StringComparison.OrdinalIgnoreCase)); + + if (jsonNetAssembly == null) + { + return; + } + + var jsonConvertType = jsonNetAssembly.GetType(jsonNetJsonConvertTypeName, false); + if (jsonConvertType == null) + { + return; + } + + serializeFunc = CreateSerializeObjectFunc(jsonConvertType); + deserializeFunc = CreateDeserializeObjectFunc(jsonConvertType); + JsonNet.IsSupported = serializeFunc != null && deserializeFunc != null; + } + + public static bool InitJsonNet(Type jsonConvertType) + { + serializeFunc = CreateSerializeObjectFunc(jsonConvertType); + deserializeFunc = CreateDeserializeObjectFunc(jsonConvertType); + return JsonNet.IsSupported = serializeFunc != null && deserializeFunc != null; + } + + /// + /// 创建SerializeObject方法的委托 + /// + /// JsonConvert类型 + /// + private static Func CreateSerializeObjectFunc(Type classType) + { + var method = classType.GetMethod("SerializeObject", new[] { typeof(object) }); + if (method == null) + { + return null; + } + return (Func)method.CreateDelegate(typeof(Func)); + } + + /// + /// 创建DeserializeObject方法的委托 + /// + /// JsonConvert类型 + /// + private static Func CreateDeserializeObjectFunc(Type classType) + { + var method = classType.GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); + if (method == null) + { + return null; + } + return (Func)method.CreateDelegate(typeof(Func)); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs.meta new file mode 100644 index 0000000..3451d90 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/Json/JsonNet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f8eb20210ea24e04a98070de595b99ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs new file mode 100644 index 0000000..6065721 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs @@ -0,0 +1,524 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Xml.Serialization; + +namespace TouchSocket.Core +{ + /// + /// 高性能序列化器 + /// + //[IntelligentCoder.AsyncMethodPoster(Flags = IntelligentCoder.MemberFlags.Public)] + public static partial class SerializeConvert + { +#pragma warning disable SYSLIB0011 // 微软觉得不安全,不推荐使用 + + #region 普通二进制序列化 + + /// + /// 普通二进制序列化对象 + /// + /// 数据对象 + /// + public static byte[] BinarySerialize(object obj) + { + using (MemoryStream serializeStream = new MemoryStream()) + { + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(serializeStream, obj); + return serializeStream.ToArray(); + } + } + + /// + /// 二进制序列化对象至文件 + /// + /// 数据对象 + /// 路径 + public static void BinarySerializeToFile(object obj, string path) + { + using (FileStream serializeStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + { + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(serializeStream, obj); + serializeStream.Close(); + } + } + + /// + /// 二进制序列化对象 + /// + /// + /// + public static void BinarySerialize(Stream stream, object obj) + { + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(stream, obj); + } + + #endregion 普通二进制序列化 + + #region 普通二进制反序列化 + + /// + /// 从Byte[]中反序列化 + /// + /// + /// + /// + /// + /// + /// + public static T BinaryDeserialize(byte[] data, int offset, int length, SerializationBinder binder = null) + { + using (MemoryStream DeserializeStream = new MemoryStream(data, offset, length)) + { + DeserializeStream.Position = 0; + BinaryFormatter bf = new BinaryFormatter(); + if (binder != null) + { + bf.Binder = binder; + } + return (T)bf.Deserialize(DeserializeStream); + } + } + + /// + /// 反序列化 + /// + /// + /// + /// + /// + /// + public static object BinaryDeserialize(byte[] data, int offset, int length, SerializationBinder binder = null) + { + using (MemoryStream DeserializeStream = new MemoryStream(data, offset, length)) + { + DeserializeStream.Position = 0; + BinaryFormatter bf = new BinaryFormatter(); + if (binder != null) + { + bf.Binder = binder; + } + return bf.Deserialize(DeserializeStream); + } + } + + /// + /// 从Stream中反序列化 + /// + /// + /// + /// + /// + public static T BinaryDeserialize(Stream stream, SerializationBinder binder = null) + { + BinaryFormatter bf = new BinaryFormatter(); + if (binder != null) + { + bf.Binder = binder; + } + return (T)bf.Deserialize(stream); + } + + /// + /// 将二进制文件数据反序列化为指定类型对象 + /// + /// + /// + /// + public static T BinaryDeserializeFromFile(string path) + { + using (FileStream serializeStream = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + BinaryFormatter bf = new BinaryFormatter(); + return (T)bf.Deserialize(serializeStream); + } + } + + /// + /// 将二进制数据反序列化为指定类型对象 + /// + /// + /// + /// + public static T BinaryDeserialize(byte[] data) + { + return BinaryDeserialize(data, 0, data.Length); + } + + /// + /// 从Byte[]中反序列化 + /// + /// + /// + /// + /// + public static T BinaryDeserialize(byte[] data, SerializationBinder binder = null) + { + return BinaryDeserialize(data, 0, data.Length, binder); + } + + #endregion 普通二进制反序列化 + +#pragma warning restore SYSLIB0011 // 微软觉得不安全,不推荐使用 + + #region Fast二进制序列化 + + /// + /// Fast二进制序列化对象 + /// + /// + /// + /// + public static void FastBinarySerialize(ByteBlock stream, T obj) + { + FastBinaryFormatter.Serialize(stream, obj); + } + + /// + /// Fast二进制序列化对象 + /// + /// + /// + public static byte[] FastBinarySerialize(T obj) + { + using (ByteBlock byteBlock = new ByteBlock()) + { + FastBinarySerialize(byteBlock, obj); + return byteBlock.ToArray(); + } + } + + #endregion Fast二进制序列化 + + #region Fast二进制反序列化 + + /// + /// Fast反序列化 + /// + /// + /// + /// + /// + public static T FastBinaryDeserialize(byte[] data, int offset) + { + return (T)FastBinaryFormatter.Deserialize(data, offset, typeof(T)); + } + + /// + /// Fast反序列化 + /// + /// + /// + /// + /// + public static object FastBinaryDeserialize(byte[] data, int offset, Type type) + { + return FastBinaryFormatter.Deserialize(data, offset, type); + } + + /// + /// 从Byte[]中反序列化 + /// + /// + /// + /// + public static T FastBinaryDeserialize(byte[] data) + { + return FastBinaryDeserialize(data, 0); + } + + #endregion Fast二进制反序列化 + + #region Xml序列化和反序列化 + + /// + /// Xml序列化数据对象 + /// + /// 数据对象 + /// 编码格式 + /// + public static string XmlSerializeToString(object obj, Encoding encoding) + { + return encoding.GetString(XmlSerializeToBytes(obj)); + } + + /// + /// Xml序列化数据对象 + /// + /// 数据对象 + /// + public static string XmlSerializeToString(object obj) + { + return XmlSerializeToString(obj, Encoding.UTF8); + } + + /// + /// Xml序列化数据对象 + /// + /// 数据对象 + /// + public static byte[] XmlSerializeToBytes(object obj) + { + using (MemoryStream fileStream = new MemoryStream()) + { + XmlSerializer xml = new XmlSerializer(obj.GetType()); + xml.Serialize(fileStream, obj); + return fileStream.ToArray(); + } + } + + /// + /// Xml序列化至文件 + /// + /// + /// + public static void XmlSerializeToFile(object obj, string path) + { + using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + { + XmlSerializer xml = new XmlSerializer(obj.GetType()); + xml.Serialize(fileStream, obj); + fileStream.Close(); + } + } + + /// + /// Xml反序列化 + /// + /// 反序列化类型 + /// 数据 + /// + public static T XmlDeserializeFromBytes(byte[] datas) + { + XmlSerializer xmlserializer = new XmlSerializer(typeof(T)); + using (Stream xmlstream = new MemoryStream(datas)) + { + return (T)xmlserializer.Deserialize(xmlstream); + } + } + + /// + /// Xml反序列化 + /// + /// + /// + /// + public static object XmlDeserializeFromBytes(byte[] datas, Type type) + { + XmlSerializer xmlserializer = new XmlSerializer(type); + using (Stream xmlstream = new MemoryStream(datas)) + { + return xmlserializer.Deserialize(xmlstream); + } + } + + /// + /// Xml反序列化 + /// + /// 类型 + /// xml字符串 + /// 编码格式 + /// + public static T XmlDeserializeFromString(string xmlString, Encoding encoding) + { + XmlSerializer xmlserializer = new XmlSerializer(typeof(T)); + using (Stream xmlstream = new MemoryStream(encoding.GetBytes(xmlString))) + { + return (T)xmlserializer.Deserialize(xmlstream); + } + } + + /// + /// Xml反序列化 + /// + /// 类型 + /// xml字符串 + /// + public static T XmlDeserializeFromString(string json) + { + return XmlDeserializeFromString(json, Encoding.UTF8); + } + + /// + /// Xml反序列化 + /// + /// 反序列化类型 + /// 文件路径 + /// + public static T XmlDeserializeFromFile(string path) + { + using (Stream xmlstream = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + XmlSerializer xmlserializer = new XmlSerializer(typeof(T)); + return (T)xmlserializer.Deserialize(xmlstream); + } + } + + #endregion Xml序列化和反序列化 + + #region Json序列化和反序列化 + + /// + /// 首先使用NewtonsoftJson.默认True。 + /// + /// 当设置True时,json序列化会优先使用NewtonsoftJson(需要将dll加载到程序)。 + /// 当设置为FALSE,或者NewtonsoftJson不可用时,netstandard2.0和net45平台将使用。 + /// 其他平台将使用System.Text.Json。 + /// + /// + public static bool NewtonsoftJsonFirst { get; set; } = true; + + /// + /// 判断是否支持NewtonsoftJson + /// + public static bool NewtonsoftJsonIsSupported => JsonNet.IsSupported; + + /// + /// 主动载入NewtonsoftJson。 + /// + /// 传入命名为JsonConvert的类型 + /// + public static bool LoadNewtonsoftJson(Type jsonConvertType) + { + return JsonNet.InitJsonNet(jsonConvertType); + } + + /// + /// 转换为Json + /// + /// + /// + public static string ToJson(this object item) + { + if (NewtonsoftJsonFirst && JsonNet.IsSupported) + { + return JsonNet.SerializeObject(item); + } + +#if NETCOREAPP3_1_OR_GREATER + return System.Text.Json.JsonSerializer.Serialize(item); +#else + return JsonFastConverter.JsonTo(item); +#endif + } + + /// + /// 从字符串到json + /// + /// + /// + /// + public static object FromJson(this string json, Type type) + { + if (NewtonsoftJsonFirst && JsonNet.IsSupported) + { + return JsonNet.DeserializeObject(json, type); + } + +#if NETCOREAPP3_1_OR_GREATER + return System.Text.Json.JsonSerializer.Deserialize(json,type); +#else + return JsonFastConverter.JsonFrom(json, type); +#endif + } + + /// + /// 从字符串到json + /// + /// + /// + /// + public static T FromJson(this string json) + { + return (T)FromJson(json, typeof(T)); + } + + /// + /// Json序列化数据对象 + /// + /// 数据对象 + /// + public static byte[] JsonSerializeToBytes(object obj) + { + return ToJson(obj).ToUTF8Bytes(); + } + + /// + /// Json序列化至文件 + /// + /// + /// + public static void JsonSerializeToFile(object obj, string path) + { + using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + { + var date = JsonSerializeToBytes(obj); + fileStream.Write(date, 0, date.Length); + fileStream.Close(); + } + } + + /// + /// Json反序列化 + /// + /// 反序列化类型 + /// 数据 + /// + public static T JsonDeserializeFromBytes(byte[] datas) + { + return (T)JsonDeserializeFromBytes(datas, typeof(T)); + } + + /// + /// Xml反序列化 + /// + /// + /// + /// + public static object JsonDeserializeFromBytes(byte[] datas, Type type) + { + return FromJson(Encoding.UTF8.GetString(datas), type); + } + + /// + /// Json反序列化 + /// + /// 类型 + /// json字符串 + /// + public static T JsonDeserializeFromString(string json) + { + return FromJson(json); + } + + /// + /// Json反序列化 + /// + /// 反序列化类型 + /// 文件路径 + /// + public static T JsonDeserializeFromFile(string path) + { + return JsonDeserializeFromString(File.ReadAllText(path)); + } + + #endregion Json序列化和反序列化 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs.meta new file mode 100644 index 0000000..2588496 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/Serialization/SerializeConvert.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 67035a1cfdec4e84dbecd2d601557c6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt new file mode 100644 index 0000000..8c0373c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt @@ -0,0 +1,10 @@ +该程序代码由三大部分组成,网络来源、开源程序集以及自编代码。若汝棋茗仅享有自编代码版权,且只为自编代码授权。 +其中代码版权说明由于是工具生成,所以会对非自编代码也标注,但是我们会在类注释中说明, +或设置XREF命名空间(XREF命名空间下的所有代码均来自开源社区)表示,所以请读者悉知。 + +例如: +1、SnowflakeIDGenerator类代码,来源于网络,所以已在类注释中说明。 + + +感谢!! +感谢所有第三方代码的开源贡献。 diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt.meta new file mode 100644 index 0000000..e8ba8ec --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Core/代码说明.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e2fddebf36c11574581f9dc0624deb8a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http.meta new file mode 100644 index 0000000..190a7ba --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b4d53bc582ed8f14abfb9817ac86f358 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common.meta new file mode 100644 index 0000000..85b2cca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea87c69a9892b0c4a9990234f82a70c5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs new file mode 100644 index 0000000..020d32a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs @@ -0,0 +1,444 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using System.Web; +using TouchSocket.Core; + +namespace TouchSocket.Http +{ + /// + /// 静态文件缓存池 + /// + public class FileCachePool : DisposableObject + { + /// + /// 添加委托 + /// + /// + /// + /// + /// + /// + public delegate bool InsertHandler(FileCachePool cache, string key, byte[] value, TimeSpan timeout); + + #region Cache items access + + /// + /// Is the file cache empty? + /// + public bool Empty => entriesByKey.Count == 0; + + /// + /// Get the file cache size + /// + public int Size => entriesByKey.Count; + + /// + /// Add a new cache value with the given timeout into the file cache + /// + /// Key to add + /// Value to add + /// Cache timeout (default is 0 - no timeout) + /// 'true' if the cache value was added, 'false' if the given key was not added + public bool Add(string key, byte[] value, TimeSpan timeout = new TimeSpan()) + { + using (new WriteLock(lockEx)) + { + // Try to find and remove the previous key + entriesByKey.Remove(key); + + // Update the cache entry + entriesByKey.Add(key, new MemCacheEntry(value, timeout)); + + return true; + } + } + + /// + /// Try to find the cache value by the given key + /// + /// Key to find + /// + /// 'true' and cache value if the cache value was found, 'false' if the given key was not found + public bool Find(string key, out byte[] data) + { + using (new ReadLock(lockEx)) + { + // Try to find the given key + if (!entriesByKey.TryGetValue(key, out var cacheValue)) + { + data = null; + return false; + } + data = cacheValue.Value; + return true; + } + } + + /// + /// Remove the cache value with the given key from the file cache + /// + /// Key to remove + /// 'true' if the cache value was removed, 'false' if the given key was not found + public bool Remove(string key) + { + using (new WriteLock(lockEx)) + { + return entriesByKey.Remove(key); + } + } + + #endregion Cache items access + + #region Cache management methods + + /// + /// Insert a new cache path with the given timeout into the file cache + /// + /// Path to insert + /// Cache prefix (default is "/") + /// Cache filter (default is "*.*") + /// Cache timeout (default is 0 - no timeout) + /// Cache insert handler (default is 'return cache.Add(key, value, timeout)') + /// 'true' if the cache path was setup, 'false' if failed to setup the cache path + public bool InsertPath(string path, string prefix = "/", string filter = "*.*", TimeSpan timeout = new TimeSpan(), InsertHandler handler = null) + { + handler ??= (FileCachePool cache, string key, byte[] value, TimeSpan timespan) => cache.Add(key, value, timespan); + + // Try to find and remove the previous path + RemovePathInternal(path); + + using (new WriteLock(lockEx)) + { + // Add the given path to the cache + pathsByKey.Add(path, new FileCacheEntry(this, prefix, path, filter, handler, timeout)); + // Create entries by path map + entriesByPath[path] = new HashSet(); + } + + // Insert the cache path + if (!InsertPathInternal(path, path, prefix, timeout, handler)) + return false; + + return true; + } + + /// + /// Try to find the cache path + /// + /// Path to find + /// 'true' if the cache path was found, 'false' if the given path was not found + public bool FindPath(string path) + { + using (new ReadLock(lockEx)) + { + // Try to find the given key + return pathsByKey.ContainsKey(path); + } + } + + /// + /// Remove the cache path from the file cache + /// + /// Path to remove + /// 'true' if the cache path was removed, 'false' if the given path was not found + public bool RemovePath(string path) + { + return RemovePathInternal(path); + } + + /// + /// Clear the memory cache + /// + public void Clear() + { + using (new WriteLock(lockEx)) + { + // Stop all file system watchers + foreach (var fileCacheEntry in pathsByKey) + fileCacheEntry.Value.StopWatcher(); + + // Clear all cache entries + entriesByKey.Clear(); + entriesByPath.Clear(); + pathsByKey.Clear(); + } + } + + #endregion Cache management methods + + #region Cache implementation + + private readonly ReaderWriterLockSlim lockEx = new ReaderWriterLockSlim(); + private readonly Dictionary entriesByKey = new Dictionary(); + private readonly Dictionary> entriesByPath = new Dictionary>(); + private readonly Dictionary pathsByKey = new Dictionary(); + + private class MemCacheEntry + { + private readonly byte[] _value; + private readonly TimeSpan _timespan; + + public byte[] Value => _value; + public TimeSpan Timespan => _timespan; + + public MemCacheEntry(byte[] value, TimeSpan timespan = new TimeSpan()) + { + _value = value; + _timespan = timespan; + } + + public MemCacheEntry(string value, TimeSpan timespan = new TimeSpan()) + { + _value = Encoding.UTF8.GetBytes(value); + _timespan = timespan; + } + }; + + private class FileCacheEntry + { + private readonly string _prefix; + private readonly string _path; + private readonly InsertHandler _handler; + private readonly TimeSpan _timespan; + private readonly FileSystemWatcher _watcher; + + public FileCacheEntry(FileCachePool cache, string prefix, string path, string filter, InsertHandler handler, TimeSpan timespan) + { + _prefix = prefix; + _path = path; + _handler = handler; + _timespan = timespan; + _watcher = new FileSystemWatcher(); + + // Start the filesystem watcher + StartWatcher(cache, path, filter); + } + + private void StartWatcher(FileCachePool cache, string path, string filter) + { + FileCacheEntry entry = this; + + // Initialize a new filesystem watcher + _watcher.Created += (sender, e) => OnCreated(sender, e, cache, entry); + _watcher.Changed += (sender, e) => OnChanged(sender, e, cache, entry); + _watcher.Deleted += (sender, e) => OnDeleted(sender, e, cache, entry); + _watcher.Renamed += (sender, e) => OnRenamed(sender, e, cache, entry); + _watcher.Path = path; + _watcher.IncludeSubdirectories = true; + _watcher.Filter = filter; + _watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite; + _watcher.EnableRaisingEvents = true; + } + + public void StopWatcher() + { + _watcher.Dispose(); + } + + private static bool IsDirectory(string path) + { + try + { + // Skip directory updates + if (File.GetAttributes(path).HasFlag(FileAttributes.Directory)) + return true; + } + catch (Exception) { } + + return false; + } + + private static void OnCreated(object sender, FileSystemEventArgs e, FileCachePool cache, FileCacheEntry entry) + { + var key = e.FullPath.Replace(entry._path, entry._prefix); + var file = e.FullPath; + + // Skip missing files + if (!File.Exists(file)) + return; + // Skip directory updates + if (IsDirectory(file)) + return; + + cache.InsertFileInternal(entry._path, file, key, entry._timespan, entry._handler); + } + + private static void OnChanged(object sender, FileSystemEventArgs e, FileCachePool cache, FileCacheEntry entry) + { + if (e.ChangeType != WatcherChangeTypes.Changed) + return; + + var key = e.FullPath.Replace(entry._path, entry._prefix); + var file = e.FullPath; + + // Skip missing files + if (!File.Exists(file)) + return; + // Skip directory updates + if (IsDirectory(file)) + return; + + cache.InsertFileInternal(entry._path, file, key, entry._timespan, entry._handler); + } + + private static void OnDeleted(object sender, FileSystemEventArgs e, FileCachePool cache, FileCacheEntry entry) + { + var key = e.FullPath.Replace(entry._path, entry._prefix); + var file = e.FullPath; + + cache.RemoveFileInternal(entry._path, key); + } + + private static void OnRenamed(object sender, RenamedEventArgs e, FileCachePool cache, FileCacheEntry entry) + { + var oldKey = e.OldFullPath.Replace(entry._path, entry._prefix); + var oldFile = e.OldFullPath; + var newKey = e.FullPath.Replace(entry._path, entry._prefix); + var newFile = e.FullPath; + + // Skip missing files + if (!File.Exists(newFile)) + return; + // Skip directory updates + if (IsDirectory(newFile)) + return; + + cache.RemoveFileInternal(entry._path, oldKey); + cache.InsertFileInternal(entry._path, newFile, newKey, entry._timespan, entry._handler); + } + }; + + private bool InsertFileInternal(string path, string file, string key, TimeSpan timeout, InsertHandler handler) + { + try + { + key = key.Replace('\\', '/'); + file = file.Replace('\\', '/'); + + // Load the cache file content + var content = File.ReadAllBytes(file); + if (!handler(this, key, content, timeout)) + return false; + + using (new WriteLock(lockEx)) + { + // Update entries by path map + entriesByPath[path].Add(key); + } + + return true; + } + catch (Exception) { return false; } + } + + private bool RemoveFileInternal(string path, string key) + { + try + { + key = key.Replace('\\', '/'); + + using (new WriteLock(lockEx)) + { + // Update entries by path map + entriesByPath[path].Remove(key); + } + + return Remove(key); + } + catch (Exception) { return false; } + } + + private bool InsertPathInternal(string root, string path, string prefix, TimeSpan timeout, InsertHandler handler) + { + try + { + string keyPrefix = (string.IsNullOrEmpty(prefix) || (prefix == "/")) ? "/" : (prefix + "/"); + + // Iterate through all directory entries + foreach (var item in Directory.GetDirectories(path)) + { + string key = keyPrefix /*+ HttpUtility.UrlDecode(Path.GetFileName(item))*/; + + // Recursively insert sub-directory + if (!InsertPathInternal(root, item, key, timeout, handler)) + return false; + } + + foreach (var item in Directory.GetFiles(path)) + { + string key = keyPrefix /*+ HttpUtility.UrlDecode(Path.GetFileName(item))*/; + + // Insert file into the cache + if (!InsertFileInternal(root, item, key, timeout, handler)) + return false; + } + + return true; + } + catch (Exception) { return false; } + } + + private bool RemovePathInternal(string path) + { + using (new WriteLock(lockEx)) + { + // Try to find the given path + if (!pathsByKey.TryGetValue(path, out var cacheValue)) + return false; + + // Stop the file system watcher + cacheValue.StopWatcher(); + + // Remove path entries + foreach (var entryKey in entriesByPath[path]) + entriesByKey.Remove(entryKey); + entriesByPath.Remove(path); + + // Remove cache path + pathsByKey.Remove(path); + + return true; + } + } + + #endregion Cache implementation + + #region IDisposable implementation + + /// + /// 释放 + /// + /// + protected override void Dispose(bool disposing) + { + Clear(); + base.Dispose(disposing); + } + + /// + /// 析构函数 + /// + ~FileCachePool() + { + // Simply call Dispose(false). + Dispose(false); + } + + #endregion IDisposable implementation + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs.meta new file mode 100644 index 0000000..8537f25 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/FileCachePool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54abf1db4379c944391672b491fc600d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs new file mode 100644 index 0000000..454346b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs @@ -0,0 +1,279 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http基础头部 + /// + public abstract class HttpBase : BlockReader, IRequestInfo + { + /// + /// 服务器版本 + /// + public static readonly string ServerVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + /// + /// 内容长度 + /// + protected long m_contentLength; + + private static readonly byte[] m_rnrnCode = Encoding.UTF8.GetBytes("\r\n\r\n"); + + private IgnoreCaseNameValueCollection m_headers; + + /// + /// 构造函数 + /// + public HttpBase() + { + ReadTimeout = 1000 * 30; + } + + /// + /// 能否写入。 + /// + public abstract bool CanWrite { get; } + + /// + /// 客户端 + /// + public abstract ITcpClientBase Client { get; } + + /// + /// 内容填充完成 + /// + public bool? ContentComplated { get; protected set; } = null; + + /// + /// int类型,内容长度 + /// + public int ContentLen + { + get => (int)m_contentLength; + set => m_contentLength = value; + } + + /// + /// 内容长度 + /// + public long ContentLength + { + get => m_contentLength; + set => m_contentLength = value; + } + + /// + /// 内容类型 + /// + public string ContentType { get; set; } + + /// + /// 传递标识 + /// + public object Flag { get; set; } + + /// + /// 请求头集合 + /// + public IgnoreCaseNameValueCollection Headers + { + get + { + m_headers ??= new IgnoreCaseNameValueCollection(); + return m_headers; + } + } + + /// + /// 协议名称,默认HTTP + /// + public string Protocols { get; set; } = "HTTP"; + + /// + /// HTTP协议版本,默认1.1 + /// + public string ProtocolVersion { get; set; } = "1.1"; + + /// + /// 请求行 + /// + public string RequestLine { get; private set; } + + /// + /// 获取头值 + /// + /// + /// + public string GetHeader(string fieldName) + { + return GetHeaderByKey(fieldName); + } + + /// + /// 获取头集合的值 + /// + /// + /// + public string GetHeader(HttpHeaders header) + { + var fieldName = header.GetDescription(); + if (fieldName == null) return null; + return Headers.Get(fieldName); + } + + /// + /// + /// + /// + /// + /// + public bool ParsingHeader(ByteBlock byteBlock, int length) + { + int index = byteBlock.Buffer.IndexOfFirst(byteBlock.Pos, length, m_rnrnCode); + if (index > 0) + { + int headerLength = index - byteBlock.Pos; + ReadHeaders(byteBlock.Buffer, byteBlock.Pos, headerLength); + byteBlock.Pos += headerLength; + return true; + } + else + { + return false; + } + } + + /// + /// 从Request中持续读取数据。 + /// + /// + /// + /// + /// + public override int Read(byte[] buffer, int offset, int count) + { + return base.Read(buffer, offset, count); + } + + /// + /// 从内存中读取 + /// + /// + /// + /// + public void ReadHeaders(byte[] buffer, int offset, int length) + { + string data = Encoding.UTF8.GetString(buffer, offset, length); + string[] rows = Regex.Split(data, "\r\n"); + + //Request URL & Method & Version + RequestLine = rows[0]; + + //Request Headers + GetRequestHeaders(rows); + long.TryParse(GetHeader(HttpHeaders.ContentLength), out m_contentLength); + LoadHeaderProterties(); + } + + /// + /// 设置一次性内容 + /// + /// + /// + public abstract void SetContent(byte[] content); + + /// + /// 设置请求头 + /// + /// + /// + public HttpBase SetHeaderByKey(string fieldName, string value) + { + if (string.IsNullOrEmpty(fieldName)) return this; + Headers.Add(fieldName, value); + return this; + } + + /// + /// 获取一次性内容。 + /// + /// + public abstract bool TryGetContent(out byte[] content); + + /// + /// 持续写入内容。 + /// + /// + /// + /// + public abstract void WriteContent(byte[] buffer, int offset, int count); + + internal bool InternalInput(byte[] buffer, int offset, int length) + { + return Input(buffer, offset, length); + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (!DisposedValue && CanRead) + { + TryGetContent(out _); + } + + base.Dispose(disposing); + } + + /// + /// 读取信息 + /// + protected abstract void LoadHeaderProterties(); + + private string GetHeaderByKey(string fieldName) + { + if (string.IsNullOrEmpty(fieldName)) return null; + return Headers.Get(fieldName); + } + + private void GetRequestHeaders(IEnumerable rows) + { + if (rows == null || rows.Count() <= 0) + { + return; + } + + foreach (var item in rows) + { + string[] kv = item.SplitFirst(':'); + if (kv.Length == 2) + { + string key = kv[0].ToLower(); + Headers.Add(key, kv[1]); + } + } + + ContentType = GetHeader(HttpHeaders.ContentType); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs.meta new file mode 100644 index 0000000..c1fb635 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76a8b4d300b1a184bb67ae2dca0d3c1e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs new file mode 100644 index 0000000..68bb4d0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs @@ -0,0 +1,67 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Http +{ + /// + /// Http上下文 + /// + public class HttpContext + { + private HttpResponse m_response; + + /// + /// 构造函数 + /// + /// + public HttpContext(HttpRequest request) + { + Request = request ?? throw new ArgumentNullException(nameof(request)); + } + + /// + /// 构造函数 + /// + /// + /// + public HttpContext(HttpRequest request, HttpResponse response) + { + Request = request ?? throw new ArgumentNullException(nameof(request)); + m_response = response ?? throw new ArgumentNullException(nameof(response)); + } + + /// + /// Http请求 + /// + public HttpRequest Request { get; } + + /// + /// Http响应 + /// + public HttpResponse Response + { + get + { + lock (this) + { + if (m_response == null) + { + m_response = new HttpResponse(Request.Client, true); + } + return m_response; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs.meta new file mode 100644 index 0000000..3e847a1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7180b9426b7de8a47ae35c479bfa22cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs new file mode 100644 index 0000000..9b27142 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs @@ -0,0 +1,53 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http代理 + /// + public class HttpProxy + { + /// + /// 不带基本验证的代理 + /// + /// + public HttpProxy(IPHost host) + { + Host = host; + } + + /// + /// 带基本验证的代理 + /// + /// + /// + /// + public HttpProxy(IPHost host, string userName, string passWord) + { + Host = host; + Credential = new NetworkCredential(userName, passWord, $"{host.IP}:{host.Port}"); + } + + /// + /// 验证代理 + /// + public NetworkCredential Credential { get; set; } + + /// + /// 代理的地址 + /// + public IPHost Host { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs.meta new file mode 100644 index 0000000..5622481 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpProxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1abed4d2d2028db40a1a95813168ddc0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs new file mode 100644 index 0000000..fa9e548 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs @@ -0,0 +1,139 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; + +namespace TouchSocket.Http +{ + /// + /// Range: bytes=0-499 表示第 0-499 字节范围的内容 + /// Range: bytes=500-999 表示第 500-999 字节范围的内容 + /// Range: bytes=-500 表示最后 500 字节的内容 + /// Range: bytes=500- 表示从第 500 字节开始到文件结束部分的内容 + /// Range: bytes=0-0,-1 表示第一个和最后一个字节 + /// Range: bytes=500-600,601-999 同时指定几个范围 + /// + public class HttpRange + { + /// + /// 转换获取的集合 + /// + /// + /// + /// + public static HttpRange[] GetRanges(string rangeStr, long size) + { + string[] ranges = rangeStr.Split('='); + if (ranges.Length != 2) + { + return new HttpRange[0]; + } + rangeStr = ranges[1]; + if (string.IsNullOrEmpty(rangeStr)) + { + return new HttpRange[0]; + } + ranges = rangeStr.Split(','); + List httpRanges = new List(); + foreach (var range in ranges) + { + HttpRange httpRange = new HttpRange(); + ranges = range.Split('-'); + if (ranges.Length == 2) + { + if (range.StartsWith("-")) + { + httpRange.Length = Convert.ToInt64(ranges[1]); + httpRange.Start = size - httpRange.Length; + } + else if (range.EndsWith("-")) + { + httpRange.Start = Convert.ToInt64(ranges[0]); + httpRange.Length = size - httpRange.Start; + } + else + { + httpRange.Start = Convert.ToInt64(ranges[0]); + httpRange.Length = Convert.ToInt64(ranges[1]) - httpRange.Start + 1; + } + } + else + { + continue; + } + httpRanges.Add(httpRange); + } + return httpRanges.ToArray(); + } + + /// + /// 转换获取的集合 + /// + /// + /// + /// + public static HttpRange GetRange(string rangeStr, long size) + { + string[] ranges = rangeStr.Split('='); + if (ranges.Length != 2) + { + return null; + } + rangeStr = ranges[1]; + if (string.IsNullOrEmpty(rangeStr)) + { + return null; + } + ranges = rangeStr.Split(','); + foreach (var range in ranges) + { + HttpRange httpRange = new HttpRange(); + ranges = range.Split('-'); + if (ranges.Length == 2) + { + if (range.StartsWith("-")) + { + httpRange.Length = Convert.ToInt64(ranges[1]); + httpRange.Start = size - httpRange.Length; + } + else if (range.EndsWith("-")) + { + httpRange.Start = Convert.ToInt64(ranges[0]); + httpRange.Length = size - httpRange.Start; + } + else + { + httpRange.Start = Convert.ToInt64(ranges[0]); + httpRange.Length = Convert.ToInt64(ranges[1]) - httpRange.Start + 1; + } + } + else + { + continue; + } + return httpRange; + } + return null; + } + + /// + /// 起始位置 + /// + public long Start { get; set; } = -1; + + /// + /// 长度 + /// + public long Length { get; set; } = -1; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs.meta new file mode 100644 index 0000000..7afc98a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRange.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c05d32ea396c4af47b3ec59a06f8f45e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs new file mode 100644 index 0000000..4787126 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs @@ -0,0 +1,455 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Specialized; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// HTTP请求定义 + /// + public class HttpRequest : HttpBase + { + private bool m_canRead; + private ITcpClientBase m_client; + private byte[] m_content; + private NameValueCollection m_forms; + private NameValueCollection m_params; + private NameValueCollection m_query; + private string m_relativeURL; + private bool m_sentHeader; + private int m_sentLength; + private string m_uRL; + + /// + /// 构造函数 + /// + /// + /// + public HttpRequest(ITcpClientBase client, bool isServer = false) + { + m_client = client; + if (isServer) + { + m_canRead = true; + CanWrite = false; + } + else + { + m_canRead = false; + CanWrite = true; + } + } + + /// + /// 构造函数 + /// + public HttpRequest() + { + m_canRead = false; + CanWrite = false; + } + + /// + /// + /// + public override bool CanRead => m_canRead; + + /// + /// + /// + public override bool CanWrite { get; } + + /// + /// + /// + public override ITcpClientBase Client => m_client; + + /// + /// 表单数据 + /// + public NameValueCollection Forms + { + get + { + if (ContentType == @"application/x-www-form-urlencoded") + { + m_forms ??= GetParameters(this.GetBody()); + return m_forms; + } + + return m_forms ??= new NameValueCollection(); + } + } + + /// + /// 获取时候保持连接 + /// + public bool KeepAlive + { + get + { + if (ProtocolVersion == "1.0") + { + return false; + } + else + { + if (GetHeader(HttpHeaders.Connection) == "keep-alive") + { + return true; + } + else + { + return false; + } + } + } + } + + /// + /// HTTP请求方式。 + /// + public string Method { get; set; } + + /// + /// Body参数 + /// + public NameValueCollection Params + { + get + { + m_params ??= new NameValueCollection(); + return m_params; + } + } + + /// + /// url参数 + /// + public NameValueCollection Query + { + get + { + m_query ??= new NameValueCollection(); + return m_query; + } + } + + /// + /// 相对路径(不含参数) + /// + public string RelativeURL => m_relativeURL; + + /// + /// Url全地址,包含参数 + /// + public string URL => m_uRL; + + /// + /// 构建响应数据。 + /// 当数据较大时,不建议这样操作,可直接 + /// + /// + public void Build(ByteBlock byteBlock) + { + BuildHeader(byteBlock); + BuildContent(byteBlock); + } + + /// + /// 构建数据为字节数组。 + /// + /// + public byte[] BuildAsBytes() + { + using ByteBlock byteBlock = new ByteBlock(); + Build(byteBlock); + return byteBlock.ToArray(); + } + + /// + /// 设置内容 + /// + /// + public override void SetContent(byte[] content) + { + m_content = content; + ContentLength = content.Length; + ContentComplated = true; + } + + /// + /// 设置Url,必须以“/”开头,可带参数 + /// + /// + /// + /// + public HttpRequest SetUrl(string url, bool justValue = false) + { + if (justValue || url.StartsWith("/")) + { + m_uRL = url; + } + else + { + m_uRL = "/" + url; + } + ParseUrl(); + return this; + } + + /// + /// 输出 + /// + public override string ToString() + { + using (ByteBlock byteBlock = new ByteBlock()) + { + Build(byteBlock); + return byteBlock.ToString(); + } + } + + /// + /// + /// + /// + public override bool TryGetContent(out byte[] content) + { + if (!ContentComplated.HasValue) + { + if (m_contentLength == 0) + { + m_content = new byte[0]; + content = m_content; + ContentComplated = true; + return true; + } + try + { + using MemoryStream block1 = new MemoryStream(); + using ByteBlock block2 = new ByteBlock(); + byte[] buffer = block2.Buffer; + while (true) + { + int r = Read(buffer, 0, buffer.Length); + if (r == 0) + { + break; + } + block1.Write(buffer, 0, r); + } + ContentComplated = true; + m_content = block1.ToArray(); + content = m_content; + return true; + } + catch + { + ContentComplated = false; + content = null; + return false; + } + finally + { + m_canRead = false; + } + } + else if (ContentComplated == true) + { + content = m_content; + return true; + } + else + { + content = null; + return false; + } + } + + /// + /// + /// + /// + /// + /// + public override void WriteContent(byte[] buffer, int offset, int count) + { + if (!CanWrite) + { + throw new NotSupportedException("该对象不支持持续写入内容。"); + } + if (!m_sentHeader) + { + using (ByteBlock byteBlock = new ByteBlock()) + { + BuildHeader(byteBlock); + m_client.DefaultSend(byteBlock); + } + m_sentHeader = true; + } + if (m_sentLength + count <= m_contentLength) + { + m_client.DefaultSend(buffer, offset, count); + m_sentLength += count; + } + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + m_client = null; + base.Dispose(disposing); + } + + /// + /// 从内存中读取 + /// + protected override void LoadHeaderProterties() + { + var first = Regex.Split(RequestLine, @"(\s+)").Where(e => e.Trim() != string.Empty).ToArray(); + if (first.Length > 0) Method = first[0].Trim().ToUpper(); + if (first.Length > 1) + { + SetUrl(Uri.UnescapeDataString(first[1])); + } + if (first.Length > 2) + { + string[] ps = first[2].Split('/'); + if (ps.Length == 2) + { + Protocols = ps[0]; + ProtocolVersion = ps[1]; + } + } + } + + private void BuildContent(ByteBlock byteBlock) + { + if (ContentLength > 0) + { + byteBlock.Write(m_content); + } + } + + /// + /// 构建响应头部 + /// + /// + private void BuildHeader(ByteBlock byteBlock) + { + StringBuilder stringBuilder = new StringBuilder(); + + string url = null; + if (!string.IsNullOrEmpty(m_relativeURL)) + { + if (m_query == null) + { + url = m_relativeURL; + } + else + { + StringBuilder urlBuilder = new StringBuilder(); + urlBuilder.Append(m_relativeURL); + urlBuilder.Append("?"); + int i = 0; + foreach (var item in m_query.AllKeys) + { + urlBuilder.Append($"{item}={m_query[item]}"); + if (++i < m_query.Count) + { + urlBuilder.Append("&"); + } + } + url = urlBuilder.ToString(); + } + } + + if (string.IsNullOrEmpty(url)) + { + stringBuilder.Append($"{Method} / HTTP/{ProtocolVersion}\r\n"); + } + else + { + stringBuilder.Append($"{Method} {url} HTTP/{ProtocolVersion}\r\n"); + } + if (ContentLength > 0) + { + this.SetHeader(HttpHeaders.ContentLength, ContentLength.ToString()); + } + foreach (var headerkey in Headers.AllKeys) + { + stringBuilder.Append($"{headerkey}: "); + stringBuilder.Append(Headers[headerkey] + "\r\n"); + } + + stringBuilder.Append("\r\n"); + byteBlock.Write(Encoding.UTF8.GetBytes(stringBuilder.ToString())); + } + + private NameValueCollection GetParameters(string row) + { + if (string.IsNullOrEmpty(row)) + { + return null; + } + string[] kvs = row.Split('&'); + if (kvs == null || kvs.Count() == 0) + { + return null; + } + + NameValueCollection pairs = new NameValueCollection(); + foreach (var item in kvs) + { + string[] kv = item.SplitFirst('='); + if (kv.Length == 2) + { + pairs.Add(kv[0], kv[1]); + } + } + + return pairs; + } + + private void ParseUrl() + { + if (m_uRL.Contains("?")) + { + string[] urls = m_uRL.Split('?'); + if (urls.Length > 0) + { + m_relativeURL = urls[0]; + } + if (urls.Length > 1) + { + m_query = GetParameters(urls[1]); + } + } + else + { + m_relativeURL = m_uRL; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs.meta new file mode 100644 index 0000000..6414708 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4faa685b8bf99fb49a72241a49291d73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs new file mode 100644 index 0000000..40d4986 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs @@ -0,0 +1,405 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http响应 + /// + public class HttpResponse : HttpBase + { + private bool m_canRead; + private bool m_canWrite; + private ITcpClientBase m_client; + private byte[] m_content; + private bool m_responsed; + private bool m_sentHeader; + private long m_sentLength; + + /// + /// 构造函数 + /// + /// + /// + public HttpResponse(ITcpClientBase client, bool isServer = true) + { + m_client = client; + if (isServer) + { + m_canRead = false; + m_canWrite = true; + } + else + { + m_canRead = true; + m_canWrite = false; + } + } + + /// + /// 构造函数 + /// + public HttpResponse() + { + m_canRead = false; + m_canWrite = false; + } + + /// + /// + /// + public override bool CanRead => m_canRead; + + /// + /// + /// + public override bool CanWrite => m_canWrite; + + /// + /// + /// + public override ITcpClientBase Client => m_client; + + /// + /// 关闭会话请求 + /// + public bool CloseConnection + { + get + { + return GetHeader(HttpHeaders.Connection).Equals("close", StringComparison.CurrentCultureIgnoreCase); + } + } + + /// + /// 是否分块 + /// + public bool IsChunk { get; set; } + + /// + /// 是否代理权限验证。 + /// + public bool IsProxyAuthenticationRequired + { + get + { + return StatusCode == "407"; + } + } + + /// + /// 是否重定向 + /// + public bool IsRedirect + { + get + { + return StatusCode == "301" || StatusCode == "302"; + } + } + + /// + /// 是否已经响应数据。 + /// + public bool Responsed => m_responsed; + + /// + /// 状态码,默认200 + /// + public string StatusCode { get; set; } = "200"; + + /// + /// 状态消息,默认Success + /// + public string StatusMessage { get; set; } = "Success"; + + /// + /// 构建数据并回应。 + /// 该方法仅在具有Client实例时有效。 + /// + public void Answer() + { + if (m_responsed) + { + return; + } + using (ByteBlock byteBlock = new ByteBlock()) + { + Build(byteBlock); + if (m_client.CanSend) + { + m_client.DefaultSend(byteBlock); + } + m_responsed = true; + } + } + + /// + /// 构建响应数据。 + /// 当数据较大时,不建议这样操作,可直接 + /// + /// + /// + public void Build(ByteBlock byteBlock, bool responsed = true) + { + if (m_responsed) + { + throw new Exception("该对象已被响应。"); + } + + BuildHeader(byteBlock); + BuildContent(byteBlock); + m_responsed = responsed; + } + + /// + /// 构建数据为字节数组。 + /// + /// + public byte[] BuildAsBytes() + { + using (ByteBlock byteBlock = new ByteBlock()) + { + Build(byteBlock); + return byteBlock.ToArray(); + } + } + + /// + /// 当传输模式是Chunk时,用于结束传输。 + /// + public void Complete() + { + m_canWrite = false; + if (IsChunk) + { + using (ByteBlock byteBlock = new ByteBlock()) + { + byteBlock.Write(Encoding.UTF8.GetBytes($"{0:X}\r\n")); + byteBlock.Write(Encoding.UTF8.GetBytes("\r\n")); + m_client.DefaultSend(byteBlock); + m_responsed = true; + } + } + } + + /// + /// + /// + /// + public override void SetContent(byte[] content) + { + m_content = content; + ContentLength = content.Length; + ContentComplated = true; + } + + /// + /// + /// + /// + public override bool TryGetContent(out byte[] content) + { + if (!ContentComplated.HasValue) + { + if (!IsChunk && m_contentLength == 0) + { + m_content = new byte[0]; + content = m_content; + return true; + } + + try + { + using (ByteBlock block1 = new ByteBlock(1024 * 1024)) + { + using (ByteBlock block2 = new ByteBlock()) + { + byte[] buffer = block2.Buffer; + while (true) + { + int r = Read(buffer, 0, buffer.Length); + if (r == 0) + { + break; + } + block1.Write(buffer, 0, r); + } + ContentComplated = true; + m_content = block1.ToArray(); + content = m_content; + return true; + } + } + } + catch + { + ContentComplated = false; + content = null; + return false; + } + finally + { + m_canRead = false; + } + } + else if (ContentComplated == true) + { + content = m_content; + return true; + } + else + { + content = null; + return false; + } + } + + /// + /// + /// + /// + /// + /// + public override void WriteContent(byte[] buffer, int offset, int count) + { + if (m_responsed) + { + throw new Exception("该对象已被响应。"); + } + + if (!CanWrite) + { + throw new NotSupportedException("该对象不支持持续写入内容。"); + } + + if (!m_sentHeader) + { + using (ByteBlock byteBlock = new ByteBlock()) + { + BuildHeader(byteBlock); + m_client.DefaultSend(byteBlock); + } + m_sentHeader = true; + } + if (IsChunk) + { + using (ByteBlock byteBlock = new ByteBlock(count + 1024)) + { + byteBlock.Write(Encoding.UTF8.GetBytes($"{count.ToString("X")}\r\n")); + byteBlock.Write(buffer, offset, count); + byteBlock.Write(Encoding.UTF8.GetBytes("\r\n")); + m_client.DefaultSend(byteBlock); + m_sentLength += count; + } + } + else + { + if (m_sentLength + count <= m_contentLength) + { + m_client.DefaultSend(buffer, offset, count); + m_sentLength += count; + if (m_sentLength == ContentLength) + { + m_canWrite = false; + m_responsed = true; + } + } + } + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + m_client = null; + base.Dispose(disposing); + } + + /// + /// 读取数据 + /// + protected override void LoadHeaderProterties() + { + var first = Regex.Split(RequestLine, @"(\s+)").Where(e => e.Trim() != string.Empty).ToArray(); + if (first.Length > 0) + { + string[] ps = first[0].Split('/'); + if (ps.Length == 2) + { + Protocols = ps[0]; + ProtocolVersion = ps[1]; + } + } + if (first.Length > 1) + { + StatusCode = first[1]; + } + string msg = string.Empty; + for (int i = 2; i < first.Length; i++) + { + msg += first[i] + " "; + } + StatusMessage = msg; + + string transferEncoding = GetHeader(HttpHeaders.TransferEncoding); + if ("chunked".Equals(transferEncoding, StringComparison.OrdinalIgnoreCase)) + { + IsChunk = true; + } + } + + private void BuildContent(ByteBlock byteBlock) + { + if (ContentLength > 0) + { + byteBlock.Write(m_content); + } + } + + /// + /// 构建响应头部 + /// + /// + private void BuildHeader(ByteBlock byteBlock) + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append($"HTTP/{ProtocolVersion} {StatusCode} {StatusMessage}\r\n"); + + if (ContentLength > 0) + { + this.SetHeader(HttpHeaders.ContentLength, ContentLength.ToString()); + } + if (IsChunk) + { + this.SetHeader(HttpHeaders.TransferEncoding, "chunked"); + } + foreach (var headerkey in Headers.AllKeys) + { + stringBuilder.Append($"{headerkey}: "); + stringBuilder.Append(Headers[headerkey] + "\r\n"); + } + + stringBuilder.Append("\r\n"); + byteBlock.Write(Encoding.UTF8.GetBytes(stringBuilder.ToString())); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs.meta new file mode 100644 index 0000000..098d4b5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3533191121ba2de43be87d2825c4899c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs new file mode 100644 index 0000000..180503b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs @@ -0,0 +1,181 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Http +{ + /// + /// Http工具 + /// + public static class HttpTools + { + /// + /// 从扩展名获取ContentType + /// + /// + /// + public static string GetContentTypeFromExtension(string extension) + { + switch (extension.ToLower()) + { + case ".html": + return "text/html"; + + case ".css": + return "text/css"; + + case ".js": + return "text/javascript"; + + case ".xml": + return "text/xml"; + + case ".gzip": + return "application/gzip"; + + case ".json": + return "application/json"; + + case ".map": + return "application/json"; + + case ".pdf": + return "application/pdf"; + + case ".zip": + return "application/zip"; + + case ".mp3": + return "audio/mpeg"; + + case ".jpg": + return "image/jpeg"; + + case ".gif": + return "image/gif"; + + case ".png": + return "image/png"; + + case ".svg": + return "image/svg+xml"; + + case ".mp4": + return "video/mp4"; + + case ".atom": + return "application/atom+xml"; + + case ".fastsoap": + return "application/fastsoap"; + + case ".ps": + return "application/postscript"; + + case ".soap": + return "application/soap+xml"; + + case ".sql": + return "application/sql"; + + case ".xslt": + return "application/xslt+xml"; + + case ".zlib": + return "application/zlib"; + + case ".aac": + return "audio/aac"; + + case ".ac3": + return "audio/ac3"; + + case ".ogg": + return "audio/ogg"; + + case ".ttf": + return "font/ttf"; + + case ".bmp": + return "image/bmp"; + + case ".jpm": + return "image/jpm"; + + case ".jpx": + return "image/jpx"; + + case ".jrx": + return "image/jrx"; + + case ".tiff": + return "image/tiff"; + + case ".emf": + return "image/emf"; + + case ".wmf": + return "image/wmf"; + + case ".http": + return "message/http"; + + case ".s-http": + return "message/s-http"; + + case ".mesh": + return "model/mesh"; + + case ".vrml": + return "model/vrml"; + + case ".csv": + return "text/csv"; + + case ".plain": + return "text/plain"; + + case ".richtext": + return "text/richtext"; + + case ".rtf": + return "text/rtf"; + + case ".rtx": + return "text/rtx"; + + case ".sgml": + return "text/sgml"; + + case ".strings": + return "text/strings"; + + case ".url": + return "text/uri-list"; + + case ".H264": + return "video/H264"; + + case ".H265": + return "video/H265"; + + case ".mpeg": + return "video/mpeg"; + + case ".raw": + return "video/raw"; + + default: + return "application/octet-stream"; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs.meta new file mode 100644 index 0000000..fbab711 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/HttpTools.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61bcb052965bdca4785db0d66014fd5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs new file mode 100644 index 0000000..e81439b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs @@ -0,0 +1,97 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Text; +using TouchSocket.Core; + +namespace TouchSocket.Http +{ + /// + /// 多文件集合 + /// + public class MultifileCollection : IEnumerable + { + private readonly HttpRequest m_httpRequest; + + /// + /// 多文件集合 + /// + /// + public MultifileCollection(HttpRequest httpRequest) + { + m_httpRequest = httpRequest; + } + + /// + /// 获取一个迭代器。 + /// + /// + public IEnumerator GetEnumerator() + { + if (m_httpRequest.ContentComplated == null || m_httpRequest.ContentComplated == true) + { + if (m_httpRequest.TryGetContent(out byte[] context)) + { + byte[] boundary = $"--{m_httpRequest.GetBoundary()}".ToUTF8Bytes(); + var indexs = context.IndexOfInclude(0, context.Length, boundary); + if (indexs.Count <= 0) + { + throw new Exception("没有发现由Boundary包裹的数据。"); + } + List files = new List(); + for (int i = 0; i < indexs.Count; i++) + { + if (i + 1 < indexs.Count) + { + InternalFormFile internalFormFile = new InternalFormFile(); + files.Add(internalFormFile); + int index = context.IndexOfFirst(indexs[i] + 3, indexs[i + 1], Encoding.UTF8.GetBytes("\r\n\r\n")); + string line = Encoding.UTF8.GetString(context, indexs[i] + 3, index - indexs[i] - 6); + string[] lines = line.Split(new string[] { ";", "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + internalFormFile.DataPair = new NameValueCollection(); + foreach (var item in lines) + { + string[] kv = item.Split(new char[] { ':', '=' }); + if (kv.Length == 2) + { + internalFormFile.DataPair.Add(kv[0].Trim(), kv[1].Replace("\"", String.Empty).Trim()); + } + } + + int length = indexs[i + 1] - (index + 2) - boundary.Length; + byte[] data = new byte[length]; + Array.Copy(context, index + 1, data, 0, length); + //string ssss = Encoding.UTF8.GetString(data); + internalFormFile.Data = data; + } + } + + return files.GetEnumerator(); + } + throw new Exception("管道状态异常"); + } + else + { + throw new Exception("管道状态异常"); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs.meta new file mode 100644 index 0000000..99634e9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/MultifileCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a0013dfc3fb88f94485186341c3403d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs new file mode 100644 index 0000000..8499ca8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Http +{ + /// + /// HttpUtility + /// + public static class TouchSocketHttpUtility + { + /// + /// 非缓存上限 + /// + public const int NoCacheMaxSize = 1024 * 1024; + + /// + /// Get关键字 + /// + public const string Get = "GET"; + + /// + /// Post关键字 + /// + public const string Post = "POST"; + + /// + /// Put关键字 + /// + public const string Put = "PUT"; + + /// + /// Delete关键字 + /// + public const string Delete = "DELETE"; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs.meta new file mode 100644 index 0000000..7dddce1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/TouchSocketHttpUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7aa82685d6e509442b4b825ecf312f5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy.meta new file mode 100644 index 0000000..74dc681 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 354fea54e5f4acc44841e7f881724d89 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs new file mode 100644 index 0000000..cced489 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs @@ -0,0 +1,161 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TouchSocket.Http +{ + /// + /// 处理代理认证凭证 + /// + internal class AuthenticationChallenge + { + /// + /// 构造 + /// + /// 服务器返回的凭证认证类型 + /// 基本凭证用户名密码 + /// 暂时不知道是什么 + public AuthenticationChallenge(string value, NetworkCredential credential, uint nonceCount = 0) + { + Parse(value, credential); + NonceCount = nonceCount; + } + + /// + /// 暂时不知 + /// + public uint NonceCount { get; set; } + + /// + /// 其实用不用他都一样 + /// + public Dictionary Parameters { get; set; } + + /// + /// 凭证类型 + /// + public AuthenticationType Type { get; set; } + + /// + /// 转换成凭证本文 + /// + /// + /// + public override string ToString() + { + if (Type == AuthenticationType.Basic) + return ToBasicString(); + else + throw new Exception("该凭证类型不支持"); + } + + private void Parse(string value, NetworkCredential credential) + { + var chal = value.Split(new[] { ' ' }, 2); + if (chal.Length != 2) + throw new Exception("该凭证类型不支持"); + + var schm = chal[0].ToLower(); + Parameters = ParseParameters(chal[1]); + + if (Parameters.ContainsKey("username") == false) + Parameters.Add("username", credential.Username); + if (Parameters.ContainsKey("password") == false) + Parameters.Add("password", credential.Password); + + /* + * Basic基本类型貌似只需要用户名密码即可 + * if (this.parameters.ContainsKey("uri") == false) + this.parameters.Add("uri", credential.Domain);*/ + + if (schm == "basic") + { + Type = AuthenticationType.Basic; + } + else + throw new Exception("该凭证类型不支持"); + } + + private Dictionary ParseParameters(string value) + { + var res = new Dictionary(); + IEnumerable values = SplitHeaderValue(value, ','); + foreach (var param in values) + { + var i = param.IndexOf('='); + var name = i > 0 ? param.Substring(0, i).Trim() : null; + var val = i < 0 + ? param.Trim().Trim('"') + : i < param.Length - 1 + ? param.Substring(i + 1).Trim().Trim('"') + : string.Empty; + + res.Add(name, val); + } + return res; + } + + private IEnumerable SplitHeaderValue(string value, params char[] separators) + { + var len = value.Length; + var end = len - 1; + + var buff = new StringBuilder(32); + var escaped = false; + var quoted = false; + + for (var i = 0; i <= end; i++) + { + var c = value[i]; + buff.Append(c); + if (c == '"') + { + if (escaped) + { + escaped = false; + continue; + } + quoted = !quoted; + continue; + } + if (c == '\\') + { + if (i == end) + break; + if (value[i + 1] == '"') + escaped = true; + continue; + } + if (Array.IndexOf(separators, c) > -1) + { + if (quoted) + continue; + buff.Length -= 1; + yield return buff.ToString(); + buff.Length = 0; + continue; + } + } + yield return buff.ToString(); + } + + private string ToBasicString() + { + var userPass = $"{Parameters["username"]}:{Parameters["password"]}"; + var cred = Convert.ToBase64String(Encoding.UTF8.GetBytes(userPass)); + return "Basic " + cred; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs.meta new file mode 100644 index 0000000..8bd2c91 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationChallenge.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a917fd4b37239924496eea27cd0c8b92 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs new file mode 100644 index 0000000..b941948 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Http +{ + /// + /// 代理身份认证类型 + /// + public enum AuthenticationType + { /// + /// 不允许身份认证 + /// + None, + + /// + /// 指定摘要身份验证。 + /// + Digest = 1, + + /// + /// 指定基本身份验证。 + /// + Basic = 8, + + /// + /// 指定匿名身份验证。 + /// + Anonymous = 0x8000 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs.meta new file mode 100644 index 0000000..8fbd347 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/AuthenticationType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f7c78d4affd3969469ce27d5d277dbca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs new file mode 100644 index 0000000..56ac857 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs @@ -0,0 +1,65 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Http +{ + /// + /// 代理身份认证 + /// + public class NetworkCredential + { + /// + /// 构造 + /// + /// + /// + /// 基本认证应该不需要这个 + /// + /// + /// + public NetworkCredential(string username, string password, string domain, params string[] roles) + { + if (username == null) + throw new ArgumentNullException("username"); + + if (username.Length == 0) + throw new ArgumentException("An empty string.", "username"); + Username = username; + Password = password; + Domain = domain; + Roles = roles; + } + + /// + /// 凭证用户名 + /// + + public string Username { get; } + + /// + /// 凭证密码 + /// + public string Password { get; } + + /// + /// Domain + /// + public string Domain { get; } + + /// + /// Roles + /// + public string[] Roles { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs.meta new file mode 100644 index 0000000..85f0849 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Common/WebProxy/NetworkCredential.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc500ebc4607c6048baf654e853f53c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components.meta new file mode 100644 index 0000000..b478ac8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4fa05cc30d91f68448d8266b8225aa90 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs new file mode 100644 index 0000000..cd4db89 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs @@ -0,0 +1,238 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using TouchSocket.Core; +using TouchSocket.Resources; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http客户端 + /// + public class HttpClient : HttpClientBase + { + } + + /// + /// Http客户端基类 + /// + public class HttpClientBase : TcpClientBase, IHttpClient + { + private readonly object m_requestLocker = new object(); + private bool m_getContent; + private readonly WaitData m_waitData; + + /// + /// 构造函数 + /// + public HttpClientBase() + { + m_waitData = new WaitData(); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public HttpResponse Request(HttpRequest request, bool onlyRequest = false, int timeout = 10 * 1000, CancellationToken token = default) + { + lock (m_requestLocker) + { + m_getContent = false; + using (ByteBlock byteBlock = new ByteBlock()) + { + request.Build(byteBlock); + + m_waitData.Reset(); + m_waitData.SetCancellationToken(token); + + this.DefaultSend(byteBlock); + if (onlyRequest) + { + return default; + } + + switch (m_waitData.Wait(timeout)) + { + case WaitDataStatus.SetRunning: + return m_waitData.WaitResult; + + case WaitDataStatus.Overtime: + throw new TimeoutException(TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: + return default; + + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + } + } + } + + /// + /// + /// + /// + /// + /// + /// + /// + public HttpResponse RequestContent(HttpRequest request, bool onlyRequest = false, int timeout = 10 * 1000, CancellationToken token = default) + { + lock (m_requestLocker) + { + m_getContent = true; + using (ByteBlock byteBlock = new ByteBlock()) + { + request.Build(byteBlock); + + m_waitData.Reset(); + m_waitData.SetCancellationToken(token); + + this.DefaultSend(byteBlock); + if (onlyRequest) + { + return default; + } + + switch (m_waitData.Wait(timeout)) + { + case WaitDataStatus.SetRunning: + return m_waitData.WaitResult; + + case WaitDataStatus.Overtime: + throw new TimeoutException(TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: + return default; + + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + } + } + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + m_waitData?.Dispose(); + base.Dispose(disposing); + } + + /// + /// + /// + /// + /// + public override ITcpClient Connect(int timeout = 5000) + { + if (Config.GetValue(HttpConfigExtensions.HttpProxyProperty) is HttpProxy httpProxy) + { + IPHost proxyHost = httpProxy.Host; + var credential = httpProxy.Credential; + IPHost remoteHost = Config.GetValue(TouchSocketConfigExtension.RemoteIPHostProperty); + try + { + Config.SetRemoteIPHost(proxyHost); + base.Connect(timeout); + HttpRequest httpRequest = new HttpRequest(); + httpRequest.InitHeaders() + .SetHost(remoteHost.Host) + .SetUrl(remoteHost.Host, true) + .AsMethod("CONNECT"); + var response = Request(httpRequest, timeout: timeout); + if (response.IsProxyAuthenticationRequired) + { + if (credential is null) + { + throw new Exception("未指定代理的凭据。"); + } + string authHeader = response.GetHeader(HttpHeaders.ProxyAuthenticate); + if (authHeader.IsNullOrEmpty()) + { + throw new Exception("未指定代理身份验证质询。"); + } + + var ares = new AuthenticationChallenge(authHeader, credential); + + httpRequest.SetHeader(HttpHeaders.ProxyAuthorization, ares.ToString()); + if (response.CloseConnection) + { + base.Close("代理要求关闭连接,随后重写连接。"); + base.Connect(timeout); + } + + response = Request(httpRequest, timeout: timeout); + } + + if (response.StatusCode != "200") + { + throw new Exception(response.StatusMessage); + } + } + finally + { + Config.SetRemoteIPHost(remoteHost); + } + } + else + { + base.Connect(timeout); + } + return this; + } + + /// + /// + /// + /// + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + base.HandleReceivedData(byteBlock, requestInfo); + + if (requestInfo is HttpResponse response) + { + if (m_getContent) + { + response.TryGetContent(out _); + } + m_waitData.Set(response); + } + } + + /// + /// + /// + /// + protected override void OnConnecting(ConnectingEventArgs e) + { + Protocol = Protocol.Http; + SetDataHandlingAdapter(new HttpClientDataHandlingAdapter()); + base.OnConnecting(e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs.meta new file mode 100644 index 0000000..c6f6060 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea3fa280e76a66a4387cac20655d7ba5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs new file mode 100644 index 0000000..c5e483a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// HTTP/HTTPS服务器 + /// + public class HttpService : TcpService, IHttpService where TClient : HttpSocketClient + { + } + + /// + /// HTTP/HTTPS服务器 + /// + public class HttpService : HttpService + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs.meta new file mode 100644 index 0000000..15bdb5f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f9870d48c30ae5439703468f99805b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs new file mode 100644 index 0000000..ad79845 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs @@ -0,0 +1,89 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// http辅助类 + /// + public class HttpSocketClient : SocketClient, IHttpSocketClient + { + /// + /// 构造函数 + /// + public HttpSocketClient() + { + Protocol = Protocol.Http; + } + + /// + /// + /// + /// + protected override void OnConnecting(OperationEventArgs e) + { + SetDataHandlingAdapter(new HttpServerDataHandlingAdapter()); + base.OnConnecting(e); + } + + /// + /// + /// + /// + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (requestInfo is HttpRequest request) + { + OnReceivedHttpRequest(request); + } + } + + /// + /// 当收到到Http请求时。覆盖父类方法将不会触发插件。 + /// + protected virtual void OnReceivedHttpRequest(HttpRequest request) + { + HttpContextEventArgs args = new HttpContextEventArgs(new HttpContext(request)); + + switch (request.Method) + { + case TouchSocketHttpUtility.Get: + { + PluginsManager.Raise("OnGet", this, args); + break; + } + case TouchSocketHttpUtility.Post: + { + PluginsManager.Raise("OnPost", this, args); + break; + } + case TouchSocketHttpUtility.Put: + { + PluginsManager.Raise("OnPut", this, args); + break; + } + case TouchSocketHttpUtility.Delete: + { + PluginsManager.Raise("OnDelete", this, args); + break; + } + default: + PluginsManager.Raise("OnReceivedOtherHttpRequest", this, args); + break; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs.meta new file mode 100644 index 0000000..8901dc3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Components/HttpSocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3108422fe762634da3ad8b933e42060 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config.meta new file mode 100644 index 0000000..1f841db --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a7a8077f9511252418e17e2ae3c12ecb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs new file mode 100644 index 0000000..c85eae9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs @@ -0,0 +1,94 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; +using TouchSocket.Http; + +namespace TouchSocket.Sockets +{ + /// + /// HttpConfigExtensions + /// + public static class HttpConfigExtensions + { + #region 创建 + + /// + /// 构建Http类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithHttpClient(this TouchSocketConfig config) where TClient : IHttpClient + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Connect(); + return client; + } + + /// + /// 构建Http类客户端,并连接 + /// + /// + /// + public static HttpClient BuildWithHttpClient(this TouchSocketConfig config) + { + return BuildWithHttpClient(config); + } + + /// + /// 构建Http类服务器,并启动。 + /// + /// + /// + /// + public static TService BuildWithHttpService(this TouchSocketConfig config) where TService : IHttpService + { + TService service = config.Container.Resolve(); + service.Setup(config); + service.Start(); + return service; + } + + /// + /// 构建Http类服务器,并启动。 + /// + /// + /// + public static HttpService BuildWithHttpService(this TouchSocketConfig config) + { + return BuildWithHttpService(config); + } + + #endregion 创建 + + /// + /// Http代理 + /// + public static readonly DependencyProperty HttpProxyProperty = + DependencyProperty.Register("HttpProxy", typeof(HttpConfigExtensions), null); + + /// + ///设置Http代理 + /// + /// + /// + /// + public static TouchSocketConfig SetHttpProxy(this TouchSocketConfig config, HttpProxy value) + { + config.SetValue(HttpProxyProperty, value); + return config; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs.meta new file mode 100644 index 0000000..7e60e12 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Config/HttpConfigExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cfc9f71db80078d4185551a4bd0c2fa3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter.meta new file mode 100644 index 0000000..44fdb02 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cae154820af8f4f4ab926b9d345c16cf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs new file mode 100644 index 0000000..95440a7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs @@ -0,0 +1,206 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http客户端数据处理适配器 + /// + public class HttpClientDataHandlingAdapter : NormalDataHandlingAdapter + { + /// + /// 缓存数据,如果需要手动释放,请先判断,然后到调用后,再置空; + /// + protected ByteBlock tempByteBlock; + + private static readonly byte[] m_rnCode = Encoding.UTF8.GetBytes("\r\n"); + private HttpResponse m_httpResponse; + + private long m_surLen; + + private Task m_task; + + /// + /// + /// + public override bool CanSplicingSend => false; + + /// + /// + /// + /// + protected override void PreviewReceived(ByteBlock byteBlock) + { + if (tempByteBlock == null) + { + byteBlock.Pos = 0; + Single(byteBlock, false); + } + else + { + tempByteBlock.Write(byteBlock.Buffer, 0, byteBlock.Len); + ByteBlock block = tempByteBlock; + tempByteBlock = null; + block.Pos = 0; + Single(block, true); + } + } + + private void Cache(ByteBlock byteBlock) + { + if (byteBlock.CanReadLen > 0) + { + tempByteBlock = new ByteBlock(); + tempByteBlock.Write(byteBlock.Buffer, byteBlock.Pos, byteBlock.CanReadLen); + if (tempByteBlock.Len > MaxPackageSize) + { + OnError("缓存的数据长度大于设定值的情况下未收到解析信号"); + } + } + } + + private FilterResult ReadChunk(ByteBlock byteBlock) + { + int position = byteBlock.Pos; + int index = byteBlock.Buffer.IndexOfFirst(byteBlock.Pos, byteBlock.CanReadLen, m_rnCode); + if (index > 0) + { + int headerLength = index - byteBlock.Pos; + string hex = Encoding.ASCII.GetString(byteBlock.Buffer, byteBlock.Pos, headerLength - 1); + int count = hex.ByHexStringToInt32(); + byteBlock.Pos += headerLength + 1; + + if (count >= 0) + { + if (count > byteBlock.CanReadLen) + { + byteBlock.Pos = position; + return FilterResult.Cache; + } + + m_httpResponse.InternalInput(byteBlock.Buffer, byteBlock.Pos, count); + byteBlock.Pos += count; + byteBlock.Pos += 2; + return FilterResult.GoOn; + } + else + { + byteBlock.Pos += 2; + return FilterResult.Success; + } + } + else + { + return FilterResult.Cache; + } + } + + private void Single(ByteBlock byteBlock, bool dis) + { + try + { + while (byteBlock.CanReadLen > 0) + { + if (m_httpResponse == null) + { + m_httpResponse = new HttpResponse(Client, false); + if (m_httpResponse.ParsingHeader(byteBlock, byteBlock.CanReadLen)) + { + byteBlock.Pos++; + if (m_httpResponse.IsChunk || m_httpResponse.ContentLength > byteBlock.CanReadLength) + { + m_surLen = m_httpResponse.ContentLength; + m_task = EasyTask.Run(m_httpResponse, (res) => + { + GoReceived(null, res); + }); + } + else + { + byteBlock.Read(out byte[] buffer, (int)m_httpResponse.ContentLength); + m_httpResponse.SetContent(buffer); + GoReceived(null, m_httpResponse); + m_httpResponse = null; + } + } + else + { + Cache(byteBlock); + m_httpResponse = null; + m_task?.Wait(); + m_task = null; + return; + } + } + if (m_httpResponse != null) + { + if (m_httpResponse.IsChunk) + { + switch (ReadChunk(byteBlock)) + { + case FilterResult.Cache: + Cache(byteBlock); + return; + + case FilterResult.Success: + m_httpResponse = null; + m_task?.Wait(); + m_task = null; + break; + + case FilterResult.GoOn: + default: + break; + } + } + else if (m_surLen > 0) + { + if (byteBlock.CanRead) + { + int len = (int)Math.Min(m_surLen, byteBlock.CanReadLength); + m_httpResponse.InternalInput(byteBlock.Buffer, byteBlock.Pos, len); + m_surLen -= len; + byteBlock.Pos += len; + if (m_surLen == 0) + { + m_httpResponse.InternalInput(null, 0, 0); + m_httpResponse = null; + m_task?.Wait(); + m_task = null; + } + } + } + else + { + m_httpResponse = null; + m_task?.Wait(); + m_task = null; + } + } + } + } + finally + { + if (dis) + { + byteBlock.Dispose(); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..a18275b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpClientDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 481ce236178d6f04ab77707055fb4b15 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs new file mode 100644 index 0000000..9d4dd62 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs @@ -0,0 +1,146 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http服务器数据处理适配器 + /// + public class HttpServerDataHandlingAdapter : NormalDataHandlingAdapter + { + /// + /// 缓存数据,如果需要手动释放,请先判断,然后到调用后,再置空; + /// + protected ByteBlock tempByteBlock; + + /// + /// + /// + public override bool CanSplicingSend => false; + + /// + /// + /// + /// + protected override void PreviewReceived(ByteBlock byteBlock) + { + if (tempByteBlock == null) + { + byteBlock.Pos = 0; + Single(byteBlock, false); + } + else + { + tempByteBlock.Write(byteBlock.Buffer, 0, byteBlock.Len); + ByteBlock block = tempByteBlock; + tempByteBlock = null; + block.Pos = 0; + Single(block, true); + } + } + + private HttpRequest m_httpRequest; + private Task m_task; + private long m_surLen; + + private void Single(ByteBlock byteBlock, bool dis) + { + try + { + while (byteBlock.CanReadLen > 0) + { + if (m_httpRequest == null) + { + m_httpRequest = new HttpRequest(Client, true); + if (m_httpRequest.ParsingHeader(byteBlock, byteBlock.CanReadLen)) + { + byteBlock.Pos++; + if (m_httpRequest.ContentLength > byteBlock.CanReadLength) + { + m_surLen = m_httpRequest.ContentLength; + + m_task = EasyTask.Run(m_httpRequest, (res) => + { + GoReceived(null, res); + }); + } + else + { + byteBlock.Read(out byte[] buffer, (int)m_httpRequest.ContentLength); + m_httpRequest.SetContent(buffer); + GoReceived(null, m_httpRequest); + m_httpRequest = null; + } + } + else + { + Cache(byteBlock); + m_httpRequest = null; + m_task?.Wait(); + m_task = null; + return; + } + } + + if (m_surLen > 0) + { + if (byteBlock.CanRead) + { + int len = (int)Math.Min(m_surLen, byteBlock.CanReadLength); + m_httpRequest.InternalInput(byteBlock.Buffer, byteBlock.Pos, len); + m_surLen -= len; + byteBlock.Pos += len; + if (m_surLen == 0) + { + m_httpRequest.InternalInput(null, 0, 0); + m_httpRequest = null; + m_task?.Wait(); + m_task = null; + } + } + } + else + { + m_httpRequest = null; + m_task?.Wait(); + m_task = null; + } + } + } + finally + { + if (dis) + { + byteBlock.Dispose(); + } + } + } + + private void Cache(ByteBlock byteBlock) + { + if (byteBlock.CanReadLen > 0) + { + tempByteBlock = new ByteBlock(); + tempByteBlock.Write(byteBlock.Buffer, byteBlock.Pos, byteBlock.CanReadLen); + if (tempByteBlock.Len > MaxPackageSize) + { + OnError("缓存的数据长度大于设定值的情况下未收到解析信号"); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..6c8e51a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DataAdapter/HttpServerDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c75984bd05f2c14daaf25e11f1b7bf8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs new file mode 100644 index 0000000..3773da0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Http; + +/// +/// HTTP上下文事件委托 +/// +/// +/// +/// +public delegate void HttpContextEventHandler(TClient client, HttpContextEventArgs e); \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs.meta new file mode 100644 index 0000000..6c405c9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/DelegateCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5883047ee4975cc418863339ac555591 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum.meta new file mode 100644 index 0000000..4495e27 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 26b6420a772a1f6498f54a29015d778e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs new file mode 100644 index 0000000..dfebd80 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs @@ -0,0 +1,340 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.ComponentModel; + +namespace TouchSocket.Http +{ + /// + /// 请求头枚举 + /// + public enum HttpHeaders : byte + { + /// + /// Cache-Control 标头,指定请求/响应链上所有缓存控制机制必须服从的指令。 + /// + [Description("cache-control")] + CacheControl = 0, + + /// + /// Connection 标头,指定特定连接需要的选项。 + /// + [Description("connection")] + Connection = 1, + + /// + /// Date 标头,指定开始创建请求的日期和时间。 + /// + [Description("date")] + Date = 2, + + /// + /// Keep-Alive 标头,指定用以维护持久性连接的参数。 + /// + [Description("keep-alive")] + KeepAlive = 3, + + /// + /// Pragma 标头,指定可应用于请求/响应链上的任何代理的特定于实现的指令。 + /// + [Description("pragma")] + Pragma = 4, + + /// + /// Trailer 标头,指定标头字段显示在以 chunked 传输编码方式编码的消息的尾部。 + /// + [Description("trailer")] + Trailer = 5, + + /// + /// Transfer-Encoding 标头,指定对消息正文应用的转换的类型(如果有)。 + /// + [Description("transfer-encoding")] + TransferEncoding = 6, + + /// + /// Upgrade 标头,指定客户端支持的附加通信协议。 + /// + [Description("upgrade")] + Upgrade = 7, + + /// + /// Via 标头,指定网关和代理程序要使用的中间协议。 + /// + [Description("via")] + Via = 8, + + /// + /// Warning 标头,指定关于可能未在消息中反映的消息的状态或转换的附加信息。 + /// + [Description("warning")] + Warning = 9, + + /// + /// Allow 标头,指定支持的 HTTP 方法集。 + /// + [Description("allow")] + Allow = 10, + + /// + /// Content-Length 标头,指定伴随正文数据的长度(以字节为单位)。 + /// + [Description("content-length")] + ContentLength = 11, + + /// + /// Content-Type 标头,指定伴随正文数据的 MIME 类型。 + /// + [Description("content-type")] + ContentType = 12, + + /// + /// Content-Encoding 标头,指定已应用于伴随正文数据的编码。 + /// + [Description("content-encoding")] + ContentEncoding = 13, + + /// + /// Content-Langauge 标头,指定伴随正文数据的自然语言。 + /// + [Description("content-langauge")] + ContentLanguage = 14, + + /// + /// Content-Location 标头,指定可从其中获得伴随正文的 URI。 + /// + [Description("content-location")] + ContentLocation = 15, + + /// + /// Content-MD5 标头,指定伴随正文数据的 MD5 摘要,用于提供端到端消息完整性检查。 + /// + [Description("content-md5")] + ContentMd5 = 16, + + /// + /// Content-Range 标头,指定在完整正文中应用伴随部分正文数据的位置。 + /// + [Description("content-range")] + ContentRange = 17, + + /// + /// Expires 标头,指定日期和时间,在此之后伴随的正文数据应视为陈旧的。 + /// + [Description("expires")] + Expires = 18, + + /// + /// Last-Modified 标头,指定上次修改伴随的正文数据的日期和时间。 + /// + [Description("last-modified")] + LastModified = 19, + + /// + /// Accept 标头,指定响应可接受的 MIME 类型。 + /// + [Description("accept")] + Accept = 20, + + /// + /// Accept-Charset 标头,指定响应可接受的字符集。 + /// + [Description("accept-charset")] + AcceptCharset = 21, + + /// + /// Accept-Encoding 标头,指定响应可接受的内容编码。 + /// + [Description("accept-encoding")] + AcceptEncoding = 22, + + /// + /// Accept-Langauge 标头,指定响应首选的自然语言。 + /// + [Description("accept-langauge")] + AcceptLanguage = 23, + + /// + /// Authorization 标头,指定客户端为向服务器验证自身身份而出示的凭据。 + /// + [Description("authorization")] + Authorization = 24, + + /// + /// Cookie 标头,指定向服务器提供的 Cookie 数据。 + /// + [Description("cookie")] + Cookie = 25, + + /// + /// Expect 标头,指定客户端要求的特定服务器行为。 + /// + [Description("expect")] + Expect = 26, + + /// + /// From 标头,指定控制请求用户代理的用户的 Internet 电子邮件地址。 + /// + [Description("from")] + From = 27, + + /// + /// Host 标头,指定所请求资源的主机名和端口号。 + /// + [Description("host")] + Host = 28, + + /// + /// If-Match 标头,指定仅当客户端的指示资源的缓存副本是最新的时,才执行请求的操作。 + /// + [Description("if-match")] + IfMatch = 29, + + /// + /// If-Modified-Since 标头,指定仅当自指示的数据和时间之后修改了请求的资源时,才执行请求的操作。 + /// + [Description("if-modified-since")] + IfModifiedSince = 30, + + /// + /// If-None-Match 标头,指定仅当客户端的指示资源的缓存副本都不是最新的时,才执行请求的操作。 + /// + [Description("if-none-match")] + IfNoneMatch = 31, + + /// + /// If-Range 标头,指定如果客户端的缓存副本是最新的,仅发送指定范围的请求资源。 + /// + [Description("if-range")] + IfRange = 32, + + /// + /// If-Unmodified-Since 标头,指定仅当自指示的日期和时间之后修改了请求的资源时,才执行请求的操作。 + /// + [Description("if-unmodified-since")] + IfUnmodifiedSince = 33, + + /// + /// Max-Forwards 标头,指定一个整数,表示此请求还可转发的次数。 + /// + [Description("max-forwards")] + MaxForwards = 34, + + /// + /// Proxy-Authorization 标头,指定客户端为向代理验证自身身份而出示的凭据。 + /// + [Description("proxy-authorization")] + ProxyAuthorization = 35, + + /// + /// Referer 标头,指定从中获得请求 URI 的资源的 URI。 + /// + [Description("referer")] + Referer = 36, + + /// + /// Range 标头,指定代替整个响应返回的客户端请求的响应的子范围。 + /// + [Description("range")] + Range = 37, + + /// + /// TE 标头,指定响应可接受的传输编码方式。 + /// + [Description("te")] + Te = 38, + + /// + /// Translate 标头,与 WebDAV 功能一起使用的 HTTP 规范的 Microsoft 扩展。 + /// + [Description("translate")] + Translate = 39, + + /// + /// User-Agent 标头,指定有关客户端代理的信息。 + /// + [Description("user-agent")] + UserAgent = 40, + + /// + /// Accept-Ranges 标头,指定服务器接受的范围。 + /// + [Description("accept-ranges")] + AcceptRanges = 41, + + /// + /// Age 标头,指定自起始服务器生成响应以来的时间长度(以秒为单位)。 + /// + [Description("age")] + Age = 42, + + /// + /// Etag 标头,指定请求的变量的当前值。 + /// + [Description("etag")] + ETag = 43, + + /// + /// Location 标头,指定为获取请求的资源而将客户端重定向到的 URI。 + /// + [Description("location")] + Location = 44, + + /// + /// Proxy-Authenticate 标头,指定客户端必须对代理验证其自身。 + /// + [Description("proxy-authenticate")] + ProxyAuthenticate = 45, + + /// + /// Retry-After 标头,指定某个时间(以秒为单位)或日期和时间,在此时间之后客户端可以重试其请求。 + /// + [Description("retry-after")] + RetryAfter = 46, + + /// + /// Server 标头,指定关于起始服务器代理的信息。 + /// + [Description("server")] + Server = 47, + + /// + /// Set-Cookie 标头,指定提供给客户端的 Cookie 数据。 + /// + [Description("set-cookie")] + SetCookie = 48, + + /// + /// Vary 标头,指定用于确定缓存的响应是否为新响应的请求标头。 + /// + [Description("vary")] + Vary = 49, + + /// + /// WWW-Authenticate 标头,指定客户端必须对服务器验证其自身。 + /// + [Description("www-authenticate")] + WwwAuthenticate = 50, + + /// + /// Origin。 + /// + [Description("origin")] + Origin = 51, + + /// + /// Content-Disposition + /// + [Description("content-disposition")] + ContentDisposition = 52 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs.meta new file mode 100644 index 0000000..dc1d9aa --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Enum/HttpHeaders.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ec71e3ac80bcfe43b8ce8b9e6cf68d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs.meta new file mode 100644 index 0000000..b3f16c4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf1099e0360b3a8439846594b9bf7c41 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs new file mode 100644 index 0000000..48d186d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Http +{ + /// + /// Http请求事件类 + /// + public class HttpContextEventArgs : TouchSocketEventArgs + { + /// + /// Http上下文 + /// + public HttpContext Context { get; } + + /// + /// 构造函数 + /// + /// + public HttpContextEventArgs(HttpContext context) + { + Context = context; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs.meta new file mode 100644 index 0000000..72d5841 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/EventArgs/HttpContextEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15d4b3d2b0915a94a9ef6ae07241750d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions.meta new file mode 100644 index 0000000..1778d47 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 47af7651313bd7847a19d71bb7ef85d4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs new file mode 100644 index 0000000..e9157a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs @@ -0,0 +1,474 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Text; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http扩展辅助 + /// + public static class HttpExtensions + { + /// + /// 根据字符串获取枚举 + /// + /// + /// + /// + /// + public static bool GetEnum(string str, out T result) where T : struct + { + return Enum.TryParse(str, out result); + } + + #region HttpBase + + #region 设置内容 + + /// + /// 从Json + /// + /// + /// + /// + public static T FromJson(this T httpRequest, string value) where T : HttpBase + { + httpRequest.SetContent(Encoding.UTF8.GetBytes(value)); + httpRequest.SetHeader(HttpHeaders.ContentType, "application/json;charset=UTF-8"); + return httpRequest; + } + + /// + /// 从文本 + /// + /// + /// + /// + public static T FromText(this T httpRequest, string value) where T : HttpBase + { + httpRequest.SetContent(Encoding.UTF8.GetBytes(value)); + httpRequest.SetHeader(HttpHeaders.ContentType, "text/plain;charset=UTF-8"); + return httpRequest; + } + + /// + /// 从Xml格式 + /// + /// + /// + /// + public static T FromXML(this T httpRequest, string value) where T : HttpBase + { + httpRequest.SetContent(Encoding.UTF8.GetBytes(value)); + httpRequest.SetHeader(HttpHeaders.ContentType, "application/xml;charset=UTF-8"); + return httpRequest; + } + + #endregion 设置内容 + + /// + /// 获取Body的字符串 + /// + /// + /// + public static string GetBody(this HttpBase httpBase) + { + if (httpBase.TryGetContent(out byte[] data)) + { + return Encoding.UTF8.GetString(data); + } + throw new Exception("获取数据体错误。"); + } + + /// + /// 当数据类型为multipart/form-data时,获取boundary + /// + /// + /// + /// + public static string GetBoundary(this HttpBase httpBase) + { + if (httpBase.ContentType.IsNullOrEmpty()) + { + return string.Empty; + } + string[] strs = httpBase.ContentType.Split(';'); + if (strs.Length == 2) + { + strs = strs[1].Split('='); + if (strs.Length == 2) + { + return strs[1].Trim(); + } + } + return string.Empty; + } + + /// + /// 设置内容 + /// + /// + /// + /// + /// + public static T SetContent(this T httpBase, string content, Encoding encoding = null) where T : HttpBase + { + httpBase.SetContent(Encoding.UTF8.GetBytes(content)); + return httpBase; + } + + /// + /// 设置数据体长度 + /// + /// + /// + public static T SetContentLength(this T httpBase, long value) where T : HttpBase + { + httpBase.ContentLength = value; + return httpBase; + } + + /// + /// 从扩展名设置内容类型,必须以“.”开头 + /// + /// + /// + /// + public static T SetContentTypeByExtension(this T httpBase, string extension) where T : HttpBase + { + string type = HttpTools.GetContentTypeFromExtension(extension); + httpBase.SetHeader(HttpHeaders.ContentType.GetDescription(), type); + httpBase.ContentType = type; + return httpBase; + } + + /// + /// 设置头值 + /// + /// + /// + /// + public static T SetHeader(this T httpBase, HttpHeaders header, string value) where T : HttpBase + { + httpBase.SetHeaderByKey(header.GetDescription(), value); + return httpBase; + } + + /// + /// 设置头值 + /// + /// + /// + /// + public static T SetHeader(this T httpBase, string fieldName, string value) where T : HttpBase + { + httpBase.SetHeaderByKey(fieldName.ToLower(), value); + return httpBase; + } + + /// + /// 写入 + /// + /// + /// + public static T WriteContent(this T httpBase, byte[] buffer) where T : HttpBase + { + httpBase.WriteContent(buffer, 0, buffer.Length); + return httpBase; + } + + #endregion HttpBase + + #region HttpRequest + + /// + /// 获取多文件集合。如果不存在,则返回null。 + /// + /// + /// + /// + public static MultifileCollection GetMultifileCollection(this TRequest request) where TRequest : HttpRequest + { + if (request.GetBoundary().IsNullOrEmpty()) + { + return null; + } + else + { + return new MultifileCollection(request); + } + } + + /// + /// 初始化常规的请求头。 + /// 包含: + /// + /// Connection:keep-alive + /// Pragma:no-cache + /// UserAgent:TouchSocket.Http + /// Accept:*/* + /// AcceptEncoding:deflate, br + /// + /// + /// + /// + public static TRequest InitHeaders(this TRequest request) where TRequest : HttpRequest + { + request.SetHeader(HttpHeaders.Connection, "keep-alive"); + request.SetHeader(HttpHeaders.Pragma, "no-cache"); + request.SetHeader(HttpHeaders.UserAgent, "TouchSocket.Http"); + request.SetHeader(HttpHeaders.Accept, "*/*"); + request.SetHeader(HttpHeaders.AcceptEncoding, "deflate, br"); + return request; + } + + /// + /// 添加Host请求头 + /// + /// + /// + /// + public static TRequest SetHost(this TRequest request, string host) where TRequest : HttpRequest + { + request.SetHeader(HttpHeaders.Host, host); + return request; + } + + /// + /// 对比不包含参数的Url。其中有任意一方为null,则均返回False。 + /// + /// + /// + /// + public static bool UrlEquals(this TRequest httpRequest, string url) where TRequest : HttpRequest + { + if (string.IsNullOrEmpty(httpRequest.RelativeURL) || string.IsNullOrEmpty(url)) + { + return false; + } + if (httpRequest.RelativeURL.Equals(url, StringComparison.CurrentCultureIgnoreCase)) + { + return true; + } + return false; + } + + #region 设置函数 + + /// + /// 作为Delete访问 + /// + /// + /// + public static TRequest AsDelete(this TRequest httpRequest) where TRequest : HttpRequest + { + httpRequest.Method = TouchSocketHttpUtility.Delete; + return httpRequest; + } + + /// + /// 作为Get访问 + /// + /// + /// + public static TRequest AsGet(this TRequest httpRequest) where TRequest : HttpRequest + { + httpRequest.Method = TouchSocketHttpUtility.Get; + return httpRequest; + } + + /// + /// 作为指定函数 + /// + /// + /// + /// + public static TRequest AsMethod(this TRequest request, string method) where TRequest : HttpRequest + { + request.Method = method; + return request; + } + + /// + /// 作为Post访问 + /// + /// + /// + public static TRequest AsPost(this TRequest httpRequest) where TRequest : HttpRequest + { + httpRequest.Method = TouchSocketHttpUtility.Post; + return httpRequest; + } + + /// + /// 作为Put访问 + /// + /// + /// + public static TRequest AsPut(this TRequest httpRequest) where TRequest : HttpRequest + { + httpRequest.Method = TouchSocketHttpUtility.Put; + return httpRequest; + } + + #endregion 设置函数 + + #endregion HttpRequest + + #region HttpResponse + + /// + /// 路径文件没找到 + /// + /// + /// + public static TResponse UrlNotFind(this TResponse response) where TResponse : HttpResponse + { + response.SetContent("

      404 -RRQM Not Found

      "); + response.StatusCode = "404"; + response.ContentType = "text/html;charset=utf-8"; + return response; + } + + /// + /// 从文件响应。 + /// 当response支持持续写入时,会直接回复响应。并阻塞执行,直到完成。所以在执行该方法之前,请确保已设置完成所有状态字 + /// 当response不支持持续写入时,会填充Content,且不会响应,需要自己执行Build,并发送。 + /// + /// 响应 + /// 请求头,用于尝试续传,为null时则不续传。 + /// 文件路径 + /// 文件名,不设置时会获取路径文件名 + /// 最大速度(仅企业版有效)。 + /// 读取长度。 + /// + /// + /// + public static TResponse FromFile(this TResponse response, string filePath, HttpRequest request, string fileName = null, int maxSpeed = 1024 * 1024 * 10, int bufferLen = 1024 * 64) where TResponse : HttpResponse + { + using (var reader = FilePool.GetReader(filePath)) + { + response.SetContentTypeByExtension(Path.GetExtension(filePath)); + var contentDisposition = "attachment;" + "filename=" /*+ System.Web.HttpUtility.UrlEncode(fileName == null ? Path.GetFileName(filePath) : fileName)*/; + response.SetHeader(HttpHeaders.ContentDisposition, contentDisposition) + .SetHeader(HttpHeaders.AcceptRanges, "bytes"); + + if (response.CanWrite) + { + HttpRange httpRange; + string range = request?.GetHeader(HttpHeaders.Range); + if (string.IsNullOrEmpty(range)) + { + response.SetStatus(); + response.ContentLength = reader.FileStorage.FileInfo.Length; + httpRange = new HttpRange() { Start = 0, Length = reader.FileStorage.FileInfo.Length }; + } + else + { + httpRange = HttpRange.GetRange(range, reader.FileStorage.FileInfo.Length); + if (httpRange == null) + { + response.ContentLength = reader.FileStorage.FileInfo.Length; + httpRange = new HttpRange() { Start = 0, Length = reader.FileStorage.FileInfo.Length }; + } + else + { + response.SetContentLength(httpRange.Length) + .SetStatus("206", "Partial Content") + .SetHeader(HttpHeaders.ContentRange, string.Format("bytes {0}-{1}/{2}", httpRange.Start, httpRange.Length + httpRange.Start - 1, reader.FileStorage.FileInfo.Length)); + } + } + reader.Position = httpRange.Start; + long surLen = httpRange.Length; + FlowGate flowGate = new FlowGate(); + flowGate.Maximum = maxSpeed; + + using (ByteBlock block = new ByteBlock(bufferLen)) + { + while (surLen > 0) + { + int r = reader.Read(block.Buffer, 0, (int)Math.Min(bufferLen, surLen)); + if (r == 0) + { + break; + } + flowGate.AddCheckWait(r); + response.WriteContent(block.Buffer, 0, r); + surLen -= r; + } + } + } + else + { + if (reader.FileStorage.FileInfo.Length > 1024 * 1024) + { + throw new OverlengthException("当该对象不支持写入时,仅支持1Mb以内的文件。"); + } + + using (ByteBlock byteBlock = new ByteBlock((int)reader.FileStorage.FileInfo.Length)) + { + using (ByteBlock block = new ByteBlock(bufferLen)) + { + while (true) + { + int r = reader.Read(block.Buffer, 0, bufferLen); + if (r == 0) + { + break; + } + byteBlock.Write(block.Buffer, 0, r); + } + response.SetContent(byteBlock.ToArray()); + } + } + } + } + return response; + } + + /// + /// 设置文件类型。 + /// + /// + /// + /// + public static TResponse SetContentTypeFromFileName(this TResponse response, string fileName) where TResponse : HttpResponse + { + var contentDisposition = "attachment;" + "filename=" /*+ System.Web.HttpUtility.UrlEncode(fileName)*/; + response.SetHeader(HttpHeaders.ContentDisposition, contentDisposition); + return response; + } + + /// + /// 设置状态,并且附带时间戳。 + /// + /// + /// + /// + /// + public static TResponse SetStatus(this TResponse response, string status = "200", string msg = "Success") where TResponse : HttpResponse + { + response.StatusCode = status; + response.StatusMessage = msg; + response.SetHeader(HttpHeaders.Server, $"TouchSocket.Http {HttpBase.ServerVersion}"); + response.SetHeader(HttpHeaders.Date, DateTime.Now.ToGMTString("r")); + return response; + } + + #endregion HttpResponse + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs.meta new file mode 100644 index 0000000..6618cee --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2797884385d77df47a877347c3487972 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs new file mode 100644 index 0000000..1e681c6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Http; + +namespace TouchSocket.Core +{ + /// + /// HttpPluginsManagerExtension + /// + public static class HttpPluginsManagerExtension + { + /// + /// 默认的Http服务。为Http做兜底拦截。该插件应该最后添加。 + /// + /// + /// + public static DefaultHttpServicePlugin UseDefaultHttpServicePlugin(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs.meta new file mode 100644 index 0000000..29d3d3b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Extensions/HttpPluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: da8bd982f06153e4f95b7b7cd59141c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface.meta new file mode 100644 index 0000000..e2ad3aa --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba7a55bbe6eb2ee448aa334926ab02b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs new file mode 100644 index 0000000..057b51d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs @@ -0,0 +1,104 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http接口 + /// + public interface IHttpPlugin : IPlugin + { + /// + /// 在收到Delete时 + /// + /// + /// + [AsyncRaiser] + void OnDelete(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到Delete时 + /// + /// + /// + /// + Task OnDeleteAsync(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到Get时 + /// + /// + /// + [AsyncRaiser] + void OnGet(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到Get时 + /// + /// + /// + /// + Task OnGetAsync(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到Post时 + /// + /// + /// + [AsyncRaiser] + void OnPost(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到Post时 + /// + /// + /// + /// + Task OnPostAsync(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到Put时 + /// + /// + /// + [AsyncRaiser] + void OnPut(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到Put时 + /// + /// + /// + /// + Task OnPutAsync(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到其他Http请求时 + /// + /// + /// + [AsyncRaiser] + void OnReceivedOtherHttpRequest(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 在收到其他Http请求时 + /// + /// + /// + /// + Task OnReceivedOtherHttpRequestAsync(ITcpClientBase client, HttpContextEventArgs e); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs.meta new file mode 100644 index 0000000..6d722bb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/HttpPluginInterface.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2d469df53b5b0364b89f507c02d39653 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs new file mode 100644 index 0000000..9c8232c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs @@ -0,0 +1,82 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Specialized; + +namespace TouchSocket.Http +{ + /// + /// 表单文件 + /// + public interface IFormFile + { + /// + /// 获取Content-Disposition + /// + string ContentDisposition { get; } + + /// + /// 获取Content-Type + /// + string ContentType { get; } + + /// + /// 实际的数据 + /// + public byte[] Data { get; } + + /// + /// 数据对 + /// + public NameValueCollection DataPair { get; } + + /// + /// 获取file name + /// + string FileName { get; } + + /// + /// 文件长度。在数据接收完成之前,该值为-1; + /// + long Length { get; } + + /// + /// 获取name字段 + /// + string Name { get; } + + ///// + ///// 读取文件数据 //太麻烦先不实现 + ///// + //public int Read(byte[] buffer, int offset, int count); + } + + internal class InternalFormFile : IFormFile + { + public string ContentDisposition => DataPair["Content-Disposition"]; + + public string ContentType => DataPair["Content-Type"]; + + public byte[] Data { get; set; } + public NameValueCollection DataPair { get; set; } + public string FileName => DataPair["filename"]; + public long Length => Data == null ? 0 : Data.Length; + + public string Name => DataPair["name"]; + //public int Read(byte[] buffer, int offset, int count) + //{ + // return this.ReadAction(buffer, offset, count); + //} + + //public Func ReadAction { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs.meta new file mode 100644 index 0000000..4715b76 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IFormFile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8cda020e984f50444a789a234e008446 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs new file mode 100644 index 0000000..481efa7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs @@ -0,0 +1,57 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http终端基础接口 + /// + public interface IHttpClientBase : ITcpClientBase + { + } + + /// + /// Http服务器终端接口 + /// + public interface IHttpSocketClient : IHttpClientBase + { + } + + /// + /// Http终端接口 + /// + public interface IHttpClient : ITcpClient, IHttpClientBase + { + /// + /// 发起请求 + /// + /// 请求体 + /// 仅仅请求,而不等待结果 + /// 等待超时时间 + /// 结束等待令箭 + /// + HttpResponse Request(HttpRequest request, bool onlyRequest = false, int timeout = 10 * 1000, CancellationToken token = default); + + /// + /// 发起请求,并获取数据体 + /// + /// 请求体 + /// 仅仅请求,而不等待结果 + /// 等待超时时间 + /// 结束等待令箭 + /// + public HttpResponse RequestContent(HttpRequest request, bool onlyRequest = false, int timeout = 10 * 1000, CancellationToken token = default); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs.meta new file mode 100644 index 0000000..2703c83 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6efb0dc9fe8aab74bb47d95c903adb4e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs new file mode 100644 index 0000000..14e28e1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// HttpService接口 + /// + public interface IHttpService : ITcpService + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs.meta new file mode 100644 index 0000000..9a18e1e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Interface/IHttpService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e0db390a9ff2b245816df18f3f9570b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins.meta new file mode 100644 index 0000000..88f9cb7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c0d77713679730429119a4ea320065f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs new file mode 100644 index 0000000..6608592 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs @@ -0,0 +1,117 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// 默认的Http服务。为Http做兜底拦截。该插件应该最后添加。 + /// + public class DefaultHttpServicePlugin : HttpPluginBase + { + /// + /// 默认的Http服务。为Http做兜底拦截。该插件应该最后添加。 + /// + public DefaultHttpServicePlugin() + { + Order = int.MinValue; + } + + /// + /// + /// + /// + /// + /// + protected override void OnLoadingConfig(object sender, ConfigEventArgs e) + { + if (!(sender is IService)) + { + throw new Exception("该插件仅可用于服务器。"); + } + base.OnLoadingConfig(sender, e); + } + + /// + /// + /// + /// + /// + protected override void OnGet(HttpSocketClient client, HttpContextEventArgs e) + { + e.Context.Response.UrlNotFind().Answer(); + base.OnGet(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnPost(HttpSocketClient client, HttpContextEventArgs e) + { + e.Context.Response.UrlNotFind().Answer(); + base.OnPost(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnPut(HttpSocketClient client, HttpContextEventArgs e) + { + e.Context.Response.UrlNotFind().Answer(); + base.OnPut(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnDelete(HttpSocketClient client, HttpContextEventArgs e) + { + e.Context.Response.UrlNotFind().Answer(); + base.OnDelete(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnReceivedOtherHttpRequest(HttpSocketClient client, HttpContextEventArgs e) + { + switch (e.Context.Request.Method.ToUpper()) + { + case "OPTIONS": + { + e.Context.Response + .SetStatus() + .SetHeader("Access-Control-Allow-Origin", "*") + .SetHeader("Access-Control-Allow-Headers", "*") + .SetHeader("Allow", "OPTIONS, GET, POST") + .SetHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS") + .Answer(); + break; + } + default: + e.Context.Response.UrlNotFind().Answer(); + break; + } + base.OnReceivedOtherHttpRequest(client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs.meta new file mode 100644 index 0000000..ee08fef --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/DefaultHttpServicePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ec5a7cfa584a2c4cbd6f1d2ddf3d670 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs new file mode 100644 index 0000000..286f1e1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs @@ -0,0 +1,185 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http扩展基类 + /// + public class HttpPluginBase : HttpPluginBase + { + } + + /// + /// Http扩展基类 + /// + public abstract class HttpPluginBase : TcpPluginBase, IHttpPlugin + { + void IHttpPlugin.OnDelete(ITcpClientBase client, HttpContextEventArgs e) + { + OnDelete((TClient)client, e); + } + + Task IHttpPlugin.OnDeleteAsync(ITcpClientBase client, HttpContextEventArgs e) + { + return OnDeleteAsync((TClient)client, e); + } + + void IHttpPlugin.OnGet(ITcpClientBase client, HttpContextEventArgs e) + { + OnGet((TClient)client, e); + } + + Task IHttpPlugin.OnGetAsync(ITcpClientBase client, HttpContextEventArgs e) + { + return OnGetAsync((TClient)client, e); + } + + void IHttpPlugin.OnPost(ITcpClientBase client, HttpContextEventArgs e) + { + OnPost((TClient)client, e); + } + + Task IHttpPlugin.OnPostAsync(ITcpClientBase client, HttpContextEventArgs e) + { + return OnPostAsync((TClient)client, e); + } + + void IHttpPlugin.OnPut(ITcpClientBase client, HttpContextEventArgs e) + { + OnPut((TClient)client, e); + } + + Task IHttpPlugin.OnPutAsync(ITcpClientBase client, HttpContextEventArgs e) + { + return OnPutAsync((TClient)client, e); + } + + void IHttpPlugin.OnReceivedOtherHttpRequest(ITcpClientBase client, HttpContextEventArgs e) + { + OnReceivedOtherHttpRequest((TClient)client, e); + } + + Task IHttpPlugin.OnReceivedOtherHttpRequestAsync(ITcpClientBase client, HttpContextEventArgs e) + { + return OnReceivedOtherHttpRequestAsync((TClient)client, e); + } + + #region 虚函数 + + /// + /// + /// + /// + /// + protected virtual void OnDelete(TClient client, HttpContextEventArgs e) + { + } + + /// + /// 在收到Delete时 + /// + /// + /// + /// + protected virtual Task OnDeleteAsync(TClient client, HttpContextEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// + /// + /// + /// + protected virtual void OnGet(TClient client, HttpContextEventArgs e) + { + } + + /// + /// 在收到Get时 + /// + /// + /// + /// + protected virtual Task OnGetAsync(TClient client, HttpContextEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// + /// + /// + /// + protected virtual void OnPost(TClient client, HttpContextEventArgs e) + { + } + + /// + /// 在收到Post时 + /// + /// + /// + /// + protected virtual Task OnPostAsync(TClient client, HttpContextEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// + /// + /// + /// + protected virtual void OnPut(TClient client, HttpContextEventArgs e) + { + } + + /// + /// 在收到Put时 + /// + /// + /// + /// + protected virtual Task OnPutAsync(TClient client, HttpContextEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// + /// + /// + /// + protected virtual void OnReceivedOtherHttpRequest(TClient client, HttpContextEventArgs e) + { + } + + /// + /// 在收到其他Http请求时 + /// + /// + /// + /// + protected virtual Task OnReceivedOtherHttpRequestAsync(TClient client, HttpContextEventArgs e) + { + return EasyTask.CompletedTask; + } + + #endregion 虚函数 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs.meta new file mode 100644 index 0000000..827c24d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpPluginBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0b6f61d13c8b6c1419249f35d9716538 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs new file mode 100644 index 0000000..8224437 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs @@ -0,0 +1,89 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using TouchSocket.Sockets; + +namespace TouchSocket.Http +{ + /// + /// Http静态内容插件 + /// + public class HttpStaticPagePlugin : HttpPluginBase + { + private readonly FileCachePool fileCache; + + /// + /// 构造函数 + /// + public HttpStaticPagePlugin() + { + fileCache = new FileCachePool(); + } + + /// + /// 静态文件缓存。 + /// + public FileCachePool FileCache => fileCache; + + /// + /// 添加静态 + /// + /// Static content path + /// Cache prefix (default is "/") + /// Cache filter (default is "*.*") + /// Refresh cache timeout (default is 1 hour) + public void AddFolder(string path, string prefix = "/", string filter = "*.*", TimeSpan? timeout = null) + { + timeout ??= TimeSpan.FromHours(1); + + fileCache.InsertPath(path, prefix, filter, timeout.Value, null); + } + + /// + /// Clear static content cache + /// + public void ClearFolder() + { + fileCache.Clear(); + } + + /// + /// Remove static content cache + /// + /// Static content path + public void RemoveFolder(string path) + { + fileCache.RemovePath(path); + } + + /// + /// + /// + /// + /// + protected override void OnGet(ITcpClientBase client, HttpContextEventArgs e) + { + if (fileCache.Find(e.Context.Request.RelativeURL, out byte[] data)) + { + e.Context.Response + .SetStatus() + .SetContentTypeByExtension(Path.GetExtension(e.Context.Request.RelativeURL)) + .SetContentLength(data.Length) + .WriteContent(data); + e.Handled = true; + } + base.OnGet(client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs.meta new file mode 100644 index 0000000..100ae95 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/Plugins/HttpStaticPagePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e3aebbdcb104bf143a40a123d114b150 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets.meta new file mode 100644 index 0000000..f2c0554 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c38b78a87390efd46a0dbeb8a397c391 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common.meta new file mode 100644 index 0000000..be56830 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0ab01ef87a3075640bdbbc9014d13143 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs new file mode 100644 index 0000000..14e6b61 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs @@ -0,0 +1,132 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocket数据帧 + /// + public class WSDataFrame : IDisposable, IRequestInfo + { + private bool m_disposedValue; + + /// + /// 是否为最后数据帧。 + /// + public bool FIN { get; set; } + + /// + /// 标识RSV-1。 + /// + public bool RSV1 { get; set; } + + /// + /// 标识RSV-2。 + /// + public bool RSV2 { get; set; } + + /// + /// 标识RSV-3。 + /// + public bool RSV3 { get; set; } + + /// + /// 数据类型 + /// + public WSDataType Opcode { get; set; } + + /// + /// 计算掩码 + /// + public bool Mask { get; set; } + + /// + /// 有效载荷数据长度 + /// + public int PayloadLength { get; set; } + + /// + /// 掩码值 + /// + public byte[] MaskingKey { get; set; } + + /// + /// 有效数据 + /// + public ByteBlock PayloadData { get; set; } + + /// + /// 构建数据 + /// + /// + /// + /// + public bool Build(ByteBlock byteBlock, bool masked) + { + if (PayloadData != null) + { + PayloadLength = PayloadData.Len; + } + else + { + PayloadLength = 0; + } + + if (PayloadData == null) + { + return WSTools.Build(byteBlock, this, new byte[0], 0, 0); + } + return WSTools.Build(byteBlock, this, PayloadData.Buffer, 0, PayloadLength); + } + + /// + /// + /// + /// + protected virtual void Dispose(bool disposing) + { + if (!m_disposedValue) + { + if (disposing) + { + // TODO: 释放托管状态(托管对象) + } + + PayloadData?.Dispose(); + m_disposedValue = true; + } + } + + /// + /// 析构函数 + /// + ~WSDataFrame() + { + // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 + Dispose(disposing: false); + } + + /// + /// + /// + public void Dispose() + { + // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs.meta new file mode 100644 index 0000000..5039773 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSDataFrame.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98a8e73d4bc97704d956cf526ccde7f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs new file mode 100644 index 0000000..50a2881 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs @@ -0,0 +1,210 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Text; +using TouchSocket.Core; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WSTools + /// + public static class WSTools + { + /// + /// 应答。 + /// + public const string acceptMask = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + + /// + /// 构建数据 + /// + /// + /// + /// + /// + /// + /// + public static bool Build(ByteBlock byteBlock, WSDataFrame dataFrame, byte[] buffer, int offset, int length) + { + int payloadLength; + + byte[] extLen; + + if (length < 126) + { + payloadLength = length; + extLen = new byte[0]; + } + else if (length < 65536) + { + payloadLength = 126; + extLen = TouchSocketBitConverter.BigEndian.GetBytes((ushort)length); + } + else + { + payloadLength = 127; + extLen = TouchSocketBitConverter.BigEndian.GetBytes((ulong)length); + } + + int header = dataFrame.FIN ? 1 : 0; + header = (header << 1) + (dataFrame.RSV1 ? 1 : 0); + header = (header << 1) + (dataFrame.RSV2 ? 1 : 0); + header = (header << 1) + (dataFrame.RSV3 ? 1 : 0); + header = (header << 4) + (ushort)dataFrame.Opcode; + + if (dataFrame.Mask) + { + header = (header << 1) + 1; + } + else + { + header = (header << 1) + 0; + } + + header = (header << 7) + payloadLength; + + byteBlock.Write(TouchSocketBitConverter.BigEndian.GetBytes((ushort)header)); + + if (payloadLength > 125) + { + byteBlock.Write(extLen, 0, extLen.Length); + } + + if (dataFrame.Mask) + { + byteBlock.Write(dataFrame.MaskingKey, 0, 4); + } + + if (payloadLength > 0) + { + if (dataFrame.Mask) + { + if (byteBlock.Capacity < byteBlock.Pos + length) + { + byteBlock.SetCapacity(byteBlock.Pos + length, true); + } + WSTools.DoMask(byteBlock.Buffer, byteBlock.Pos, buffer, offset, length, dataFrame.MaskingKey); + byteBlock.SetLength(byteBlock.Pos + length); + } + else + { + byteBlock.Write(buffer, offset, length); + } + } + return true; + } + + /// + /// 计算Base64值 + /// + /// + /// + public static string CalculateBase64Key(string str) + { + return (str + acceptMask).ToSha1(Encoding.UTF8).ToBase64(); + } + + /// + /// 获取Base64随即字符串。 + /// + /// + public static string CreateBase64Key() + { + var src = new byte[16]; + new Random().NextBytes(src); + return Convert.ToBase64String(src); + } + + /// + /// 掩码运算 + /// + /// + /// + /// + /// + /// + /// + public static void DoMask(byte[] storeBuf, int sOffset, byte[] buffer, int offset, int length, byte[] masks) + { + for (var i = 0; i < length; i++) + { + storeBuf[sOffset + i] = (byte)(buffer[offset + i] ^ masks[i % 4]); + } + } + + /// + /// 获取WS的请求头 + /// + /// + /// + /// + /// + /// + public static HttpRequest GetWSRequest(string host, string url, string version, out string base64Key) + { + HttpRequest request = new HttpRequest + { + Method = "GET", + Protocols = "HTTP", + ProtocolVersion = "1.1" + }; + request.SetUrl(url); + request.SetHeader(HttpHeaders.Host, host); + request.SetHeader(HttpHeaders.Pragma, "no-cache"); + request.SetHeader(HttpHeaders.UserAgent, "TouchSocket.Http.WebSockets"); + request.SetHeader(HttpHeaders.Origin, "RRQM"); + request.SetHeader(HttpHeaders.AcceptEncoding, "deflate, br"); + request.SetHeaderByKey("Connection", "upgrade"); + request.SetHeaderByKey("Upgrade", "websocket"); + request.SetHeaderByKey("Sec-WebSocket-Version", $"{version}"); + base64Key = CreateBase64Key(); + request.SetHeaderByKey("Sec-WebSocket-Key", base64Key); + + return request; + } + + /// + /// 获取响应 + /// + /// + /// + /// + public static bool TryGetResponse(HttpRequest request, HttpResponse response) + { + string upgrade = request.GetHeader(HttpHeaders.Upgrade); + if (string.IsNullOrEmpty(upgrade)) + { + return false; + } + string connection = request.GetHeader(HttpHeaders.Connection); + if (string.IsNullOrEmpty(connection)) + { + return false; + } + string secWebSocketKey = request.GetHeader("sec-websocket-key"); + if (string.IsNullOrEmpty(secWebSocketKey)) + { + return false; + } + + response.StatusCode = "101"; + response.StatusMessage = "switching protocols"; + response.SetHeader(HttpHeaders.Connection, "upgrade"); + response.SetHeader(HttpHeaders.Upgrade, "websocket"); + response.SetHeader("sec-websocket-accept", CalculateBase64Key(secWebSocketKey)); + return true; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs.meta new file mode 100644 index 0000000..c6d3e4f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Common/WSTools.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f927352b1e0c62248860f3e25ad8f123 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components.meta new file mode 100644 index 0000000..5013acc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 15bbd97b05c1def479125935c73185a5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs new file mode 100644 index 0000000..45f5747 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs @@ -0,0 +1,199 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocketClient用户终端简单实现。 + /// + public class WebSocketClient : WebSocketClientBase + { + /// + /// 收到WebSocket数据 + /// + public WSDataFrameEventHandler Received { get; set; } + + /// + /// + /// + /// + protected override void OnHandleWSDataFrame(WSDataFrame dataFrame) + { + Received?.Invoke(this, dataFrame); + base.OnHandleWSDataFrame(dataFrame); + } + } + + /// + /// WebSocket用户终端。 + /// + public class WebSocketClientBase : HttpClientBase, IWebSocketClient + { + /// + /// 请求连接到WebSocket。 + /// + /// + public override ITcpClient Connect(int timeout = 5000) + { + return Connect(default, timeout); + } + + /// + /// + /// + /// + /// + /// + public virtual ITcpClient Connect(CancellationToken token, int timeout = 5000) + { + lock (this) + { + if (!Online) + { + base.Connect(timeout); + } + + string base64Key; + IPHost iPHost = Config.GetValue(TouchSocketConfigExtension.RemoteIPHostProperty); + string url = iPHost.IsUri ? iPHost.Uri.PathAndQuery : string.Empty; + HttpRequest request = WSTools.GetWSRequest(RemoteIPHost.Host, url, this.GetWebSocketVersion(), out base64Key); + OnHandshaking(new HttpContextEventArgs(new HttpContext(request))); + + var response = Request(request, timeout: timeout, token: token); + if (!response.StatusCode.Trim().Equals("101")) + { + throw new WebSocketConnectException($"协议升级失败,信息:{response.StatusMessage},更多信息请捕获WebSocketConnectException异常,获得HttpContext得知。", new HttpContext(request, response)); + } + string accept = response.GetHeader("sec-websocket-accept").Trim(); + if (accept.IsNullOrEmpty() || !accept.Equals(WSTools.CalculateBase64Key(base64Key).Trim(), StringComparison.OrdinalIgnoreCase)) + { + MainSocket.SafeDispose(); + throw new WebSocketConnectException($"WS服务器返回的应答码不正确,更多信息请捕获WebSocketConnectException异常,获得HttpContext得知。", new HttpContext(request, response)); + } + + SetAdapter(new WebSocketDataHandlingAdapter()); + SetValue(WebSocketServerPlugin.HandshakedProperty, true); + response.Flag = true; + OnHandshaked(new HttpContextEventArgs(new HttpContext(request, response))); + return this; + } + } + + /// + /// + /// + /// + /// + /// + public Task ConnectAsync(CancellationToken token, int timeout = 5000) + { + return EasyTask.Run(() => + { + return Connect(token, timeout); + }); + } + + #region 事件 + + /// + /// 表示在即将握手连接时。 + /// + public HttpContextEventHandler Handshaking { get; set; } + + /// + /// 表示完成握手后。 + /// + public HttpContextEventHandler Handshaked { get; set; } + + /// + /// 表示在即将握手连接时。 + /// + /// + protected virtual void OnHandshaking(HttpContextEventArgs e) + { + if (UsePlugin && PluginsManager.Raise("OnHandshaking", this, e)) + { + return; + } + Handshaking?.Invoke(this, e); + } + + /// + /// 表示完成握手后。 + /// + /// + protected virtual void OnHandshaked(HttpContextEventArgs e) + { + if (UsePlugin && PluginsManager.Raise("OnHandshaked", this, e)) + { + return; + } + Handshaked?.Invoke(this, e); + } + + #endregion 事件 + + /// + /// 当收到WS数据时。 + /// + /// + protected virtual void OnHandleWSDataFrame(WSDataFrame dataFrame) + { + if (UsePlugin) + { + PluginsManager.Raise("OnHandleWSDataFrame", this, new WSDataFrameEventArgs(dataFrame)); + } + } + + /// + /// + /// + /// + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (this.GetHandshaked()) + { + WSDataFrame dataFrame = (WSDataFrame)requestInfo; + OnHandleWSDataFrame(dataFrame); + } + else + { + if (requestInfo is HttpResponse response) + { + response.Flag = false; + base.HandleReceivedData(byteBlock, requestInfo); + SpinWait.SpinUntil(() => + { + return (bool)response.Flag; + }, 1000); + } + } + } + + /// + /// + /// + /// + protected override void OnDisconnected(DisconnectEventArgs e) + { + SetValue(WebSocketServerPlugin.HandshakedProperty, false); + base.OnDisconnected(e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs.meta new file mode 100644 index 0000000..cabad5d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Components/WebSocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f37fb3e357c610842824f359841f8dd4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config.meta new file mode 100644 index 0000000..6161780 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 40189d25f112643478949e00c1955bef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs new file mode 100644 index 0000000..ac71333 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; +using TouchSocket.Http.WebSockets; + +namespace TouchSocket.Sockets +{ + /// + /// WebSocketConfigExtensions + /// + public static class WebSocketConfigExtensions + { + /// + /// 构建WebSocketClient类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithWebSocketClient(this TouchSocketConfig config) where TClient : IWebSocketClient + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Connect(); + return client; + } + + /// + /// 构建WebSocketClient类客户端,并连接 + /// + /// + /// + public static WebSocketClient BuildWithWebSocketClient(this TouchSocketConfig config) + { + return BuildWithWebSocketClient(config); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs.meta new file mode 100644 index 0000000..717a461 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Config/WebSocketConfigExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76f9e038c8279394a97747255e7ecee0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter.meta new file mode 100644 index 0000000..3758fe8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 791063ff04234124c952b4f4f5ff8187 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs new file mode 100644 index 0000000..a28222a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs @@ -0,0 +1,290 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocket适配器 + /// + public class WebSocketDataHandlingAdapter : DataHandlingAdapter + { + private WSDataFrame m_dataFrameTemp; + + /// + /// 数据包剩余长度 + /// + private int m_surPlusLength = 0; + + /// + /// 临时包 + /// + private ByteBlock m_tempByteBlock; + + /// + /// + /// + public override bool CanSplicingSend => false; + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// 解码 + /// + /// + /// + /// + /// + /// + public FilterResult DecodingFromBytes(byte[] dataBuffer, ref int offset, int length, out WSDataFrame dataFrame) + { + int index = offset; + dataFrame = new WSDataFrame(); + dataFrame.RSV1 = dataBuffer[offset].GetBit(6) == 1; + dataFrame.RSV2 = dataBuffer[offset].GetBit(5) == 1; + dataFrame.RSV3 = dataBuffer[offset].GetBit(4) == 1; + dataFrame.FIN = (dataBuffer[offset] >> 7) == 1; + dataFrame.Opcode = (WSDataType)(dataBuffer[offset] & 0xf); + dataFrame.Mask = (dataBuffer[++offset] >> 7) == 1; + + int payloadLength = dataBuffer[offset] & 0x7f; + if (payloadLength < 126) + { + offset++; + } + else if (payloadLength == 126) + { + if (length < 4) + { + offset = index; + return FilterResult.Cache; + } + payloadLength = TouchSocketBitConverter.BigEndian.ToUInt16(dataBuffer, ++offset); + offset += 2; + } + else if (payloadLength == 127) + { + if (length < 12) + { + if (m_tempByteBlock == null) + { + m_tempByteBlock = new ByteBlock(); + } + m_tempByteBlock.Write(dataBuffer, index, length); + offset = index; + return FilterResult.GoOn; + } + payloadLength = (int)TouchSocketBitConverter.BigEndian.ToUInt64(dataBuffer, ++offset); + offset += 8; + } + + dataFrame.PayloadLength = payloadLength; + + if (dataFrame.Mask) + { + if (length < (offset - index) + 4) + { + if (m_tempByteBlock == null) + { + m_tempByteBlock = new ByteBlock(); + } + m_tempByteBlock.Write(dataBuffer, index, length); + offset = index; + return FilterResult.GoOn; + } + dataFrame.MaskingKey = new byte[4]; + dataFrame.MaskingKey[0] = dataBuffer[offset++]; + dataFrame.MaskingKey[1] = dataBuffer[offset++]; + dataFrame.MaskingKey[2] = dataBuffer[offset++]; + dataFrame.MaskingKey[3] = dataBuffer[offset++]; + } + + ByteBlock byteBlock = new ByteBlock(payloadLength); + dataFrame.PayloadData = byteBlock; + + int surlen = length - (offset - index); + if (payloadLength <= surlen) + { + byteBlock.Write(dataBuffer, offset, payloadLength); + offset += payloadLength; + } + else + { + byteBlock.Write(dataBuffer, offset, surlen); + offset += surlen; + } + + return FilterResult.Success; + } + + /// + /// 当接收到数据时处理数据 + /// + /// 数据流 + protected override void PreviewReceived(ByteBlock byteBlock) + { + byte[] buffer = byteBlock.Buffer; + int r = byteBlock.Len; + + if (m_tempByteBlock != null) + { + m_tempByteBlock.Write(buffer, 0, r); + buffer = m_tempByteBlock.ToArray(); + r = m_tempByteBlock.Pos; + m_tempByteBlock.Dispose(); + m_tempByteBlock = null; + } + + if (m_dataFrameTemp == null) + { + SplitPackage(buffer, 0, r); + } + else + { + if (m_surPlusLength == r) + { + m_dataFrameTemp.PayloadData.Write(buffer, 0, m_surPlusLength); + PreviewHandle(m_dataFrameTemp); + m_dataFrameTemp = null; + m_surPlusLength = 0; + } + else if (m_surPlusLength < r) + { + m_dataFrameTemp.PayloadData.Write(buffer, 0, m_surPlusLength); + PreviewHandle(m_dataFrameTemp); + m_dataFrameTemp = null; + SplitPackage(buffer, m_surPlusLength, r); + } + else + { + m_dataFrameTemp.PayloadData.Write(buffer, 0, r); + m_surPlusLength -= r; + } + } + } + + /// + /// 当发送数据前处理数据 + /// + /// + /// + /// + protected override void PreviewSend(byte[] buffer, int offset, int length) + { + GoSend(buffer, offset, length); + } + + /// + /// + /// + /// + protected override void PreviewSend(IList> transferBytes) + { + throw new System.NotImplementedException();//因为设置了不支持拼接发送,所以该方法可以不实现。 + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + throw new NotImplementedException(); + } + + /// + /// + /// + protected override void Reset() + { + m_tempByteBlock = null; + m_dataFrameTemp = null; + m_surPlusLength = 0; + base.Reset(); + } + + private void PreviewHandle(WSDataFrame dataFrame) + { + try + { + if (dataFrame.Mask) + { + WSTools.DoMask(dataFrame.PayloadData.Buffer, 0, dataFrame.PayloadData.Buffer, 0, dataFrame.PayloadData.Len, dataFrame.MaskingKey); + } + GoReceived(null, dataFrame); + } + finally + { + dataFrame.Dispose(); + } + } + + /// + /// 分解包 + /// + /// + /// + /// + private void SplitPackage(byte[] dataBuffer, int offset, int length) + { + while (offset < length) + { + if (length - offset < 2) + { + if (m_tempByteBlock == null) + { + m_tempByteBlock = new ByteBlock(); + } + m_tempByteBlock.Write(dataBuffer, offset, length - offset); + return; + } + + switch (DecodingFromBytes(dataBuffer, ref offset, length - offset, out WSDataFrame dataFrame)) + { + case FilterResult.Cache: + { + if (m_tempByteBlock == null) + { + m_tempByteBlock = new ByteBlock(); + } + m_tempByteBlock.Write(dataBuffer, offset, length - offset); + return; + } + case FilterResult.Success: + { + if (dataFrame.PayloadLength == dataFrame.PayloadData.Len) + { + PreviewHandle(dataFrame); + } + else + { + m_surPlusLength = dataFrame.PayloadLength - dataFrame.PayloadData.Len; + m_dataFrameTemp = dataFrame; + } + } + break; + + case FilterResult.GoOn: + default: + return; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..12533a1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DataAdapter/WebSocketDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc4f9c6b09e25b848bcd1d01139d8ff6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs new file mode 100644 index 0000000..5a8cdbf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Http.WebSockets +{ + /// + /// 收到WebSocket数据 + /// + /// + /// + public delegate void WSDataFrameEventHandler(TClient client, WSDataFrame dataFrame); +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs.meta new file mode 100644 index 0000000..012dbc9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/DelegateCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1657ec296b8cb1647b98f96598b72abb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum.meta new file mode 100644 index 0000000..79232a5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c0613082a9de9fe43b0acc9f4dc72d7e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs new file mode 100644 index 0000000..65a8200 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocket数据类型 + /// + public enum WSDataType : ushort + { + /// + /// 表示一个中间数据包,denotes a continuation frame + /// + Cont = 0, + + /// + /// 表示一个text类型数据包 + /// + Text = 1, + + /// + /// 表示一个binary类型数据包 + /// + Binary = 2, + + /// + /// 表示一个断开连接类型数据包 + /// + Close = 8, + + /// + /// 表示一个ping类型数据包 + /// + Ping = 9, + + /// + /// 表示一个pong类型数据包 + /// + Pong = 10 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs.meta new file mode 100644 index 0000000..d825bab --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Enum/WSDataType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d267ceedb8454d4fbc612f0ffd3a699 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs.meta new file mode 100644 index 0000000..a8cbe9c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62c306d556f7e9f419562506720e4cc6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs new file mode 100644 index 0000000..0dcd0ee --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WS数据事件类 + /// + public class WSDataFrameEventArgs : TouchSocketEventArgs + { + /// + /// 构造函数 + /// + /// + public WSDataFrameEventArgs(WSDataFrame dataFrame) + { + DataFrame = dataFrame; + } + + /// + /// WS数据帧。 + /// + public WSDataFrame DataFrame { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs.meta new file mode 100644 index 0000000..bcf8af6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/EventArgs/WSDataFrameEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c02a4869d0c7744fa3145be8a97c902 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions.meta new file mode 100644 index 0000000..e479fcd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b39554fc0734d9341a6fb75be10cc3e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs new file mode 100644 index 0000000..cf3b84c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocket连接异常。 + /// + [Serializable] + public class WebSocketConnectException : Exception + { + /// + ///构造函数 + /// + /// + /// + public WebSocketConnectException(string mes, HttpContext context) : base(mes) + { + Context = context; + } + + /// + /// HttpContext + /// + public HttpContext Context { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs.meta new file mode 100644 index 0000000..67699b5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Exceptions/WebSocketConnectException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4bdde9ab001e57243bd855f5db223ee1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions.meta new file mode 100644 index 0000000..63c71a0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62a98a236f7028f4cba1d8ea257bf97b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs new file mode 100644 index 0000000..8b664ce --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs @@ -0,0 +1,811 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +using TouchSocket.Core; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// IWSClientBase辅助扩展 + /// + public static class WSClientExtensions + { + /// + /// 是否已经完成握手 + /// + /// + /// + public static bool GetHandshaked(this IHttpClientBase client) + { + return client.GetValue(WebSocketServerPlugin.HandshakedProperty); + } + + /// + /// 获取WebSocket版本号。 + /// + /// + /// + public static string GetWebSocketVersion(this IHttpClientBase client) + { + return client.GetValue(WebSocketServerPlugin.WebSocketVersionProperty); + } + + /// + /// 设置WebSocket版本号。 + /// + public static void SetWebSocketVersion(this IHttpClientBase client, string value) + { + client.SetValue(WebSocketServerPlugin.WebSocketVersionProperty, value); + } + + #region 客户端 + + /// + /// 发送Ping报文。 + /// + /// + /// + public static bool PingWS(this HttpClientBase client) + { + try + { + SendWithWS(client, new WSDataFrame() { FIN = true, Opcode = WSDataType.Ping }); + return true; + } + catch + { + return false; + } + } + + /// + /// 发送Pong报文。 + /// + /// + /// + public static bool PongWS(this HttpClientBase client) + { + try + { + SendWithWS(client, new WSDataFrame() { FIN = true, Opcode = WSDataType.Pong }); + return true; + } + catch + { + return false; + } + } + + /// + /// 发送Close报文。 + /// + /// + /// + /// + public static bool CloseWithWS(this HttpClientBase client, string msg) + { + try + { + SendWithWS(client, new WSDataFrame() { FIN = true, Opcode = WSDataType.Close }.AppendText(msg)); + return true; + } + catch + { + return false; + } + } + + #region 同步发送 + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + /// + /// + public static void SendWithWS(this HttpClientBase client, byte[] buffer, int offset, int length) + { + using (ByteBlock byteBlock = new ByteBlock(length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendBinary(buffer, offset, length).BuildRequest(byteBlock); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWS(this HttpClientBase client, ByteBlock byteBlock) + { + SendWithWS(client, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWS(this HttpClientBase client, byte[] buffer) + { + SendWithWS(client, buffer, 0, buffer.Length); + } + + /// + /// 采用WebSocket协议,发送文本数据。 + /// + /// + /// + public static void SendWithWS(this HttpClientBase client, string text) + { + using (ByteBlock byteBlock = new ByteBlock(text.Length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendText(text).BuildRequest(byteBlock); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送WS数据。 + /// + /// + /// + public static void SendWithWS(this HttpClientBase client, WSDataFrame dataFrame) + { + using (ByteBlock byteBlock = new ByteBlock(dataFrame.PayloadLength + 1024)) + { + dataFrame.BuildRequest(byteBlock); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + #endregion 同步发送 + + #region 异步发送 + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + /// + /// + public static void SendWithWSAsync(this HttpClientBase client, byte[] buffer, int offset, int length) + { + using (ByteBlock byteBlock = new ByteBlock(length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendBinary(buffer, offset, length).BuildRequest(byteBlock); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpClientBase client, ByteBlock byteBlock) + { + SendWithWSAsync(client, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpClientBase client, byte[] buffer) + { + SendWithWSAsync(client, buffer, 0, buffer.Length); + } + + /// + /// 采用WebSocket协议,发送文本数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpClientBase client, string text) + { + using (ByteBlock byteBlock = new ByteBlock(text.Length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendText(text).BuildRequest(byteBlock); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送WS数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpClientBase client, WSDataFrame dataFrame) + { + using (ByteBlock byteBlock = new ByteBlock(dataFrame.PayloadLength + 1024)) + { + dataFrame.BuildRequest(byteBlock); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + #endregion 异步发送 + + #region 同步分包发送 + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + /// + /// + public static void SubSendWithWS(this HttpClientBase client, byte[] buffer, int offset, int length, int packageSize) + { + lock (client) + { + if (packageSize >= length) + { + SendWithWS(client, buffer, offset, length); + return; + } + int sentLen = 0; + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.SetMaskString("RRQM"); + dataFrame.Mask = true; + dataFrame.FIN = false; + dataFrame.Opcode = WSDataType.Binary; + + int count; + if (length % packageSize == 0) + { + count = length / packageSize; + } + else + { + count = length / packageSize + 1; + } + + for (int i = 0; i < count; i++) + { + if (i > 0) + { + dataFrame.Opcode = WSDataType.Cont; + } + if (i == count - 1)//最后 + { + dataFrame.FIN = true; + } + using (ByteBlock byteBlock = new ByteBlock(packageSize + 1024)) + { + int thisLen = Math.Min(packageSize, length - sentLen); + WSTools.Build(byteBlock, dataFrame, buffer, offset, thisLen); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + sentLen += thisLen; + offset += thisLen; + } + } + } + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWS(this HttpClientBase client, byte[] buffer, int packageSize) + { + SubSendWithWS(client, buffer, 0, buffer.Length, packageSize); + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWS(this HttpClientBase client, ByteBlock byteBlock, int packageSize) + { + SubSendWithWS(client, byteBlock.Buffer, 0, byteBlock.Len, packageSize); + } + + #endregion 同步分包发送 + + #region 异步分包发送 + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + /// + /// + public static void SubSendWithWSAsync(this HttpClientBase client, byte[] buffer, int offset, int length, int packageSize) + { + lock (client) + { + if (packageSize >= length) + { + SendWithWSAsync(client, buffer, offset, length); + return; + } + int sentLen = 0; + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.SetMaskString("RRQM"); + dataFrame.Mask = true; + dataFrame.FIN = false; + dataFrame.Opcode = WSDataType.Binary; + + int count; + if (length % packageSize == 0) + { + count = length / packageSize; + } + else + { + count = length / packageSize + 1; + } + + for (int i = 0; i < count; i++) + { + if (i > 0) + { + dataFrame.Opcode = WSDataType.Cont; + } + if (i == count - 1)//最后 + { + dataFrame.FIN = true; + } + using (ByteBlock byteBlock = new ByteBlock(packageSize + 1024)) + { + int thisLen = Math.Min(packageSize, length - sentLen); + WSTools.Build(byteBlock, dataFrame, buffer, offset, thisLen); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + sentLen += thisLen; + offset += thisLen; + } + } + } + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWSAsync(this HttpClientBase client, byte[] buffer, int packageSize) + { + SubSendWithWSAsync(client, buffer, 0, buffer.Length, packageSize); + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWSAsync(this HttpClientBase client, ByteBlock byteBlock, int packageSize) + { + SubSendWithWSAsync(client, byteBlock.Buffer, 0, byteBlock.Len, packageSize); + } + + #endregion 异步分包发送 + + #endregion 客户端 + + #region 服务器 + + /// + /// 发送WebSocket协议的Ping报文。 + /// + /// + /// + public static bool PingWS(this HttpSocketClient client) + { + try + { + SendWithWS(client, new WSDataFrame() { FIN = true, Opcode = WSDataType.Ping }); + return true; + } + catch + { + return false; + } + } + + /// + /// 发送WebSocket协议的Pong报文。 + /// + /// + /// + public static bool PongWS(this HttpSocketClient client) + { + try + { + SendWithWS(client, new WSDataFrame() { FIN = true, Opcode = WSDataType.Pong }); + return true; + } + catch + { + return false; + } + } + + /// + /// 发送WebSocket协议的Close报文。 + /// + /// + /// + /// + public static bool CloseWithWS(this HttpSocketClient client, string msg) + { + try + { + SendWithWS(client, new WSDataFrame() { FIN = true, Opcode = WSDataType.Close }.AppendText(msg)); + return true; + } + catch + { + return false; + } + } + + #region 同步发送 + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + /// + /// + public static void SendWithWS(this HttpSocketClient client, byte[] buffer, int offset, int length) + { + using (ByteBlock byteBlock = new ByteBlock(length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendBinary(buffer, offset, length).BuildResponse(byteBlock); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWS(this HttpSocketClient client, ByteBlock byteBlock) + { + SendWithWS(client, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWS(this HttpSocketClient client, byte[] buffer) + { + SendWithWS(client, buffer, 0, buffer.Length); + } + + /// + /// 采用WebSocket协议,发送文本数据。 + /// + /// + /// + public static void SendWithWS(this HttpSocketClient client, string text) + { + using (ByteBlock byteBlock = new ByteBlock(text.Length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendText(text).BuildResponse(byteBlock); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送WS数据。 + /// + /// + /// + public static void SendWithWS(this HttpSocketClient client, WSDataFrame dataFrame) + { + using (ByteBlock byteBlock = new ByteBlock(dataFrame.PayloadLength + 1024)) + { + dataFrame.BuildResponse(byteBlock); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + #endregion 同步发送 + + #region 异步发送 + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + /// + /// + public static void SendWithWSAsync(this HttpSocketClient client, byte[] buffer, int offset, int length) + { + using (ByteBlock byteBlock = new ByteBlock(length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendBinary(buffer, offset, length).BuildResponse(byteBlock); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpSocketClient client, ByteBlock byteBlock) + { + SendWithWSAsync(client, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 采用WebSocket协议,发送二进制流数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpSocketClient client, byte[] buffer) + { + SendWithWSAsync(client, buffer, 0, buffer.Length); + } + + /// + /// 采用WebSocket协议,发送文本数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpSocketClient client, string text) + { + using (ByteBlock byteBlock = new ByteBlock(text.Length + 1024)) + { + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.AppendText(text).BuildResponse(byteBlock); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// 采用WebSocket协议,发送WS数据。 + /// + /// + /// + public static void SendWithWSAsync(this HttpSocketClient client, WSDataFrame dataFrame) + { + using (ByteBlock byteBlock = new ByteBlock(dataFrame.PayloadLength + 1024)) + { + dataFrame.BuildResponse(byteBlock); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + #endregion 异步发送 + + #region 同步分包发送 + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + /// + /// + public static void SubSendWithWS(this HttpSocketClient client, byte[] buffer, int offset, int length, int packageSize) + { + lock (client) + { + if (packageSize >= length) + { + SendWithWS(client, buffer, offset, length); + return; + } + int sentLen = 0; + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.FIN = false; + dataFrame.Opcode = WSDataType.Binary; + + int count; + if (length % packageSize == 0) + { + count = length / packageSize; + } + else + { + count = length / packageSize + 1; + } + + for (int i = 0; i < count; i++) + { + if (i > 0) + { + dataFrame.Opcode = WSDataType.Cont; + } + if (i == count - 1)//最后 + { + dataFrame.FIN = true; + } + using (ByteBlock byteBlock = new ByteBlock(packageSize + 1024)) + { + int thisLen = Math.Min(packageSize, length - sentLen); + WSTools.Build(byteBlock, dataFrame, buffer, offset, thisLen); + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + sentLen += thisLen; + offset += thisLen; + } + } + } + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWS(this HttpSocketClient client, byte[] buffer, int packageSize) + { + SubSendWithWS(client, buffer, 0, buffer.Length, packageSize); + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWS(this HttpSocketClient client, ByteBlock byteBlock, int packageSize) + { + SubSendWithWS(client, byteBlock.Buffer, 0, byteBlock.Len, packageSize); + } + + #endregion 同步分包发送 + + #region 异步分包发送 + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + /// + /// + public static void SubSendWithWSAsync(this HttpSocketClient client, byte[] buffer, int offset, int length, int packageSize) + { + lock (client) + { + if (packageSize >= length) + { + SendWithWSAsync(client, buffer, offset, length); + return; + } + int sentLen = 0; + WSDataFrame dataFrame = new WSDataFrame(); + dataFrame.FIN = false; + dataFrame.Opcode = WSDataType.Binary; + + int count; + if (length % packageSize == 0) + { + count = length / packageSize; + } + else + { + count = length / packageSize + 1; + } + + for (int i = 0; i < count; i++) + { + if (i > 0) + { + dataFrame.Opcode = WSDataType.Cont; + } + if (i == count - 1)//最后 + { + dataFrame.FIN = true; + } + using (ByteBlock byteBlock = new ByteBlock(packageSize + 1024)) + { + int thisLen = Math.Min(packageSize, length - sentLen); + WSTools.Build(byteBlock, dataFrame, buffer, offset, thisLen); + client.DefaultSendAsync(byteBlock.Buffer, 0, byteBlock.Len); + sentLen += thisLen; + offset += thisLen; + } + } + } + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWSAsync(this HttpSocketClient client, byte[] buffer, int packageSize) + { + SubSendWithWSAsync(client, buffer, 0, buffer.Length, packageSize); + } + + /// + /// 分包发送。 + /// + /// 按packageSize的值,每次发送数据包。 + /// + /// + /// + /// + /// + public static void SubSendWithWSAsync(this HttpSocketClient client, ByteBlock byteBlock, int packageSize) + { + SubSendWithWSAsync(client, byteBlock.Buffer, 0, byteBlock.Len, packageSize); + } + + #endregion 异步分包发送 + + #endregion 服务器 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs.meta new file mode 100644 index 0000000..c0fbf92 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSClientExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dad5d49edb721f244bd3241780e3ab0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs new file mode 100644 index 0000000..7a37f4b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs @@ -0,0 +1,158 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Text; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WSDataFrame辅助扩展类 + /// + public static class WSDataFrameExtensions + { + /// + /// 追加文本 + /// + /// + /// + /// + /// + public static WSDataFrame AppendText(this WSDataFrame dataFrame, string text, Encoding encoding = default) + { + dataFrame.Opcode = WSDataType.Text; + byte[] data = (encoding == default ? Encoding.UTF8 : encoding).GetBytes(text); + if (dataFrame.PayloadData == null) + { + dataFrame.PayloadData = new ByteBlock(); + } + dataFrame.PayloadData.Write(data); + return dataFrame; + } + + /// + /// 追加二进制流 + /// + /// + /// + /// + /// + /// + public static WSDataFrame AppendBinary(this WSDataFrame dataFrame, byte[] buffer, int offset, int length) + { + dataFrame.Opcode = WSDataType.Binary; + if (dataFrame.PayloadData == null) + { + dataFrame.PayloadData = new ByteBlock(); + } + dataFrame.PayloadData.Write(buffer, offset, length); + return dataFrame; + } + + /// + /// 构建请求数据(含Make) + /// + /// + /// + /// + public static bool BuildRequest(this WSDataFrame dataFrame, ByteBlock byteBlock) + { + dataFrame.FIN = true; + dataFrame.Mask = true; + if (dataFrame.MaskingKey == null) + { + dataFrame.SetMaskString("RRQM"); + } + return dataFrame.Build(byteBlock, true); + } + + /// + /// 构建请求数据(含Make) + /// + /// + /// + public static byte[] BuildRequestToBytes(this WSDataFrame dataFrame) + { + dataFrame.FIN = true; + dataFrame.Mask = true; + if (dataFrame.MaskingKey == null) + { + dataFrame.SetMaskString("RRQM"); + } + using (ByteBlock byteBlock = new ByteBlock()) + { + dataFrame.Build(byteBlock, true); + byte[] data = byteBlock.ToArray(); + return data; + } + } + + /// + /// 构建响应数据(无Make) + /// + /// + /// + /// + public static bool BuildResponse(this WSDataFrame dataFrame, ByteBlock byteBlock) + { + dataFrame.FIN = true; + + return dataFrame.Build(byteBlock, false); + } + + /// + /// 构建响应数据(无Make) + /// + /// + /// + public static byte[] BuildResponseToBytes(this WSDataFrame dataFrame) + { + dataFrame.FIN = true; + + using (ByteBlock byteBlock = new ByteBlock()) + { + dataFrame.Build(byteBlock, false); + byte[] data = byteBlock.ToArray(); + return data; + } + } + + /// + /// 设置Mask。 + /// + /// + /// + /// + public static WSDataFrame SetMaskString(this WSDataFrame dataFrame, string mask) + { + byte[] masks = Encoding.UTF8.GetBytes(mask); + if (masks.Length != 4) + { + throw new OverlengthException("Mask只能为ASCII,且只能为四位。"); + } + dataFrame.MaskingKey = masks; + return dataFrame; + } + + /// + /// 当时,转换为Text消息。 + /// + /// + /// + /// + public static string ToText(this WSDataFrame dataFrame, Encoding encoding = default) + { + return (encoding == default ? Encoding.UTF8 : encoding).GetString(dataFrame.PayloadData.Buffer, 0, dataFrame.PayloadLength); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs.meta new file mode 100644 index 0000000..ef2c663 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WSDataFrameExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dfdc188f94e4b694eb804395ad37c9e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs new file mode 100644 index 0000000..51537dd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocketExtensions + /// + public static class WebSocketExtensions + { + /// + /// 心跳Timer + /// + public static readonly DependencyProperty HeartbeatTimerProperty = + DependencyProperty.Register("HeartbeatTimer", typeof(WebSocketExtensions), null); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs.meta new file mode 100644 index 0000000..42e8b37 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 88605be1b81e1c44c8639d4e66bdef12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs new file mode 100644 index 0000000..f62d6db --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Http.WebSockets; + +namespace TouchSocket.Core +{ + /// + /// WebSocketPluginsManagerExtension + /// + public static class WebSocketPluginsManagerExtension + { + /// + /// 使用WebSocket插件 + /// + /// 插件类型实例 + public static WebSocketServerPlugin UseWebSocket(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + + /// + /// 使用WebSocket心跳插件(仅客户端生效) + /// + /// 插件类型实例 + public static WebSocketHeartbeatPlugin UseWebSocketHeartbeat(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs.meta new file mode 100644 index 0000000..c6cc6c2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketPluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6088ea5a60182fa48a6d63ab96b77814 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs new file mode 100644 index 0000000..395716f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs @@ -0,0 +1,95 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocketServerExtensions + /// + public static class WebSocketServerExtensions + { + /// + /// 转化Protocol协议标识为 + /// + /// + /// Http上下文 + public static bool SwitchProtocolToWebSocket(this TClient client, HttpContext httpContext) where TClient : HttpSocketClient + { + if (client.Protocol == Protocol.WebSocket) + { + return true; + } + if (client.Protocol == Protocol.Http) + { + if (WSTools.TryGetResponse(httpContext.Request, httpContext.Response)) + { + HttpContextEventArgs args = new HttpContextEventArgs(new HttpContext(httpContext.Request, httpContext.Response)) + { + IsPermitOperation = true + }; + client.PluginsManager.Raise(nameof(IWebSocketPlugin.OnHandshaking), client, args); + if (args.Context.Response.Responsed) + { + return false; + } + if (args.IsPermitOperation) + { + client.SetDataHandlingAdapter(new WebSocketDataHandlingAdapter()); + client.Protocol = Protocol.WebSocket; + client.SetValue(WebSocketServerPlugin.HandshakedProperty, true);//设置握手状态 + + using (ByteBlock byteBlock = new ByteBlock()) + { + args.Context.Response.Build(byteBlock); + client.DefaultSend(byteBlock); + } + client.PluginsManager.Raise(nameof(IWebSocketPlugin.OnHandshaked), client, new HttpContextEventArgs(httpContext)); + return true; + } + else + { + args.Context.Response.SetStatus("403", "Forbidden"); + using (ByteBlock byteBlock = new ByteBlock()) + { + args.Context.Response.Build(byteBlock); + client.DefaultSend(byteBlock); + } + + client.Close("主动拒绝WebSocket连接"); + } + } + else + { + client.Close("WebSocket连接协议不正确"); + } + } + return false; + } + + /// + /// 转化Protocol协议标识为 + /// + /// + /// Http上下文 + public static Task SwitchProtocolToWebSocketAsync(this TClient client, HttpContext httpContext) where TClient : HttpSocketClient + { + return EasyTask.Run(() => + { + return SwitchProtocolToWebSocket(client, httpContext); + }); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs.meta new file mode 100644 index 0000000..27f350a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Extensions/WebSocketServerExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2631e82adb330e24084b9b72d2e2085f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface.meta new file mode 100644 index 0000000..b7baf3a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d4528d7497dc09742b2e0783ad0e974e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs new file mode 100644 index 0000000..d855c9b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// 用户终端接口 + /// + public interface IWebSocketClient : IHttpClient + { + /// + /// 连接到ws服务器 + /// + /// + /// + /// + ITcpClient Connect(CancellationToken token, int timeout = 5000); + + /// + /// 异步连接到ws服务器 + /// + /// + /// + /// + Task ConnectAsync(CancellationToken token, int timeout = 5000); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs.meta new file mode 100644 index 0000000..7c42131 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 742060dfddbfa8944830807fdfc8ef20 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs new file mode 100644 index 0000000..787a324 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs @@ -0,0 +1,87 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocket插件 + /// + public interface IWebSocketPlugin : IPlugin + { + /// + /// 表示收到断开连接报文。如果对方直接断开连接,此方法则不会触发。 + /// + /// + /// + [AsyncRaiser] + void OnClosing(ITcpClientBase client, MsgEventArgs e); + + /// + /// 表示收到断开连接报文。如果对方直接断开连接,此方法则不会触发。 + /// + /// + /// + Task OnClosingAsync(ITcpClientBase client, MsgEventArgs e); + + /// + /// 当收到WS数据时。 + /// + /// + /// + [AsyncRaiser] + void OnHandleWSDataFrame(ITcpClientBase client, WSDataFrameEventArgs e); + + /// + /// 当收到WS数据时。 + /// + /// + /// + /// + Task OnHandleWSDataFrameAsync(ITcpClientBase client, WSDataFrameEventArgs e); + + /// + /// 表示完成握手后。 + /// + /// + /// + [AsyncRaiser] + void OnHandshaked(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 表示完成握手后。 + /// + /// + /// + /// + Task OnHandshakedAsync(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 表示在即将握手连接时。 + /// + /// + /// + [AsyncRaiser] + void OnHandshaking(ITcpClientBase client, HttpContextEventArgs e); + + /// + /// 表示在即将握手连接时。 + /// + /// + /// + /// + Task OnHandshakingAsync(ITcpClientBase client, HttpContextEventArgs e); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs.meta new file mode 100644 index 0000000..8788af2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Interface/IWebSocketPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7df4aaa5535531146a48a04101254612 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins.meta new file mode 100644 index 0000000..18487a3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac743a978e34add4fb1ca545f03c9b40 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs new file mode 100644 index 0000000..3aff937 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs @@ -0,0 +1,138 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WS命令行插件。 + /// + public abstract class WSCommandLinePlugin : WebSocketPluginBase + { + private readonly Dictionary pairs = new Dictionary(); + private readonly ILog m_logger; + + /// + /// 字符串转换器,默认支持基础类型和Json。可以自定义。 + /// + public StringConverter Converter { get; } + + /// + /// 是否返回执行异常。 + /// + public bool ReturnException { get; set; } = true; + + /// + /// 当有执行异常时,不返回异常。 + /// + /// + public WSCommandLinePlugin NoReturnException() + { + ReturnException = false; + return this; + } + + /// + /// WSCommandLinePlugin + /// + /// + /// + protected WSCommandLinePlugin(ILog logger) + { + m_logger = logger ?? throw new ArgumentNullException(nameof(logger)); + Converter = new StringConverter(); + var ms = GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(a => a.Name.EndsWith("Command")); + foreach (var item in ms) + { + pairs.Add(item.Name.Replace("Command", string.Empty), new Method(item)); + } + } + + /// + /// + /// + /// + /// + protected override void OnHandleWSDataFrame(ITcpClientBase client, WSDataFrameEventArgs e) + { + if (e.DataFrame.Opcode == WSDataType.Text) + { + try + { + string[] strs = e.DataFrame.ToText().Split(' '); + if (strs.Length > 0 && pairs.TryGetValue(strs[0], out Method method)) + { + var ps = method.Info.GetParameters(); + object[] os = new object[ps.Length]; + int index = 0; + for (int i = 0; i < ps.Length; i++) + { + if (ps[i].ParameterType.IsInterface && typeof(ITcpClientBase).IsAssignableFrom(ps[i].ParameterType)) + { + os[i] = client; + } + else + { + os[i] = Converter.ConvertFrom(strs[index + 1], ps[i].ParameterType); + index++; + } + } + + e.Handled = true; + + try + { + object result = method.Invoke(this, os); + if (method.HasReturn) + { + if (client is HttpClient httpClient) + { + httpClient.SendWithWS(Converter.ConvertTo(result)); + } + else if (client is HttpSocketClient httpSocketClient) + { + httpSocketClient.SendWithWS(Converter.ConvertTo(result)); + } + } + } + catch (Exception ex) + { + if (ReturnException) + { + if (client is HttpClient httpClient) + { + httpClient.SendWithWS(Converter.ConvertTo(ex.Message)); + } + else if (client is HttpSocketClient httpSocketClient) + { + httpSocketClient.SendWithWS(Converter.ConvertTo(ex.Message)); + } + } + } + } + } + catch (Exception ex) + { + m_logger.Exception(this, ex); + } + } + + base.OnHandleWSDataFrame(client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs.meta new file mode 100644 index 0000000..138f920 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WSCommandLinePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10530bc6078890f41b6327e27e4799b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs new file mode 100644 index 0000000..6e104ed --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs @@ -0,0 +1,81 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WebSocketHeartbeatPlugin + /// + [SingletonPlugin] + public class WebSocketHeartbeatPlugin : WebSocketPluginBase + { + private TimeSpan m_timeTick=TimeSpan.FromSeconds(5); + + /// + /// 初始化一个适用于WebSocket的心跳插件 + /// + public WebSocketHeartbeatPlugin() + { + + } + + /// + /// 设置心跳间隔,默认5秒。 + /// + /// + public void Tick(TimeSpan timeSpan) + { + this.m_timeTick = timeSpan; + } + + /// + /// + /// + /// + /// + protected override void OnHandshaked(ITcpClientBase client, HttpContextEventArgs e) + { + if (client is HttpClientBase httpClientBase) + { + if (client.GetValue(WebSocketExtensions.HeartbeatTimerProperty) is Timer timer) + { + timer.Dispose(); + } + client.SetValue(WebSocketExtensions.HeartbeatTimerProperty, new Timer((o) => + { + httpClientBase.PingWS(); + }, null, m_timeTick, m_timeTick)); + } + base.OnHandshaked(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnDisconnected(ITcpClientBase client, DisconnectEventArgs e) + { + base.OnDisconnected(client, e); + if (client.GetValue(WebSocketExtensions.HeartbeatTimerProperty) is Timer timer) + { + timer.SafeDispose(); + client.SetValue(WebSocketExtensions.HeartbeatTimerProperty, null); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs.meta new file mode 100644 index 0000000..84a7ac0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketHeartbeatPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ccbc63b9a70147b4fa6f801e5f1e8c37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs new file mode 100644 index 0000000..2420a06 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs @@ -0,0 +1,157 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// WS插件基类 + /// + public class WebSocketPluginBase : WebSocketPluginBase + { + } + + /// + /// WS插件基类 + /// + public class WebSocketPluginBase : HttpPluginBase, IWebSocketPlugin + { + #region 虚函数 + + /// + /// 表示收到断开连接报文。如果对方直接断开连接,此方法则不会触发。 + /// + /// + /// + protected virtual void OnClosing(ITcpClientBase client, MsgEventArgs e) + { + } + + /// + /// 表示收到断开连接报文。如果对方直接断开连接,此方法则不会触发。 + /// + /// + /// + /// + protected virtual Task OnClosingAsync(ITcpClientBase client, MsgEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 处理WS数据帧。 + /// + /// + /// + protected virtual void OnHandleWSDataFrame(TClient client, WSDataFrameEventArgs e) + { + } + + /// + /// 处理WS数据帧。 + /// + /// + /// + /// + protected virtual Task OnHandleWSDataFrameAsync(TClient client, WSDataFrameEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 表示完成握手后。 + /// + /// + /// + protected virtual void OnHandshaked(TClient client, HttpContextEventArgs e) + { + } + + /// + /// 表示完成握手后。 + /// + /// + /// + /// + protected virtual Task OnHandshakedAsync(TClient client, HttpContextEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 表示在即将握手连接时。 + /// 在此处拒绝操作,则会返回403 Forbidden。 + /// 也可以向注入更多信息。 + /// + /// + /// + protected virtual void OnHandshaking(TClient client, HttpContextEventArgs e) + { + } + + /// + /// 表示在即将握手连接时。 + /// + /// + /// + /// + protected virtual Task OnHandshakingAsync(TClient client, HttpContextEventArgs e) + { + return EasyTask.CompletedTask; + } + + #endregion 虚函数 + + void IWebSocketPlugin.OnClosing(ITcpClientBase client, MsgEventArgs e) + { + OnClosing(client, e); + } + + Task IWebSocketPlugin.OnClosingAsync(ITcpClientBase client, MsgEventArgs e) + { + return OnClosingAsync(client, e); + } + + void IWebSocketPlugin.OnHandleWSDataFrame(ITcpClientBase client, WSDataFrameEventArgs e) + { + OnHandleWSDataFrame((TClient)client, e); + } + + Task IWebSocketPlugin.OnHandleWSDataFrameAsync(ITcpClientBase client, WSDataFrameEventArgs e) + { + return OnHandleWSDataFrameAsync((TClient)client, e); + } + + void IWebSocketPlugin.OnHandshaked(ITcpClientBase client, HttpContextEventArgs e) + { + OnHandshaked((TClient)client, e); + } + + Task IWebSocketPlugin.OnHandshakedAsync(ITcpClientBase client, HttpContextEventArgs e) + { + return OnHandshakedAsync((TClient)client, e); + } + + void IWebSocketPlugin.OnHandshaking(ITcpClientBase client, HttpContextEventArgs e) + { + OnHandshaking((TClient)client, e); + } + + Task IWebSocketPlugin.OnHandshakingAsync(ITcpClientBase client, HttpContextEventArgs e) + { + return OnHandshakingAsync((TClient)client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs.meta new file mode 100644 index 0000000..61ec836 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketPluginBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2066d6fe6449d144a840c02f88262d0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs new file mode 100644 index 0000000..84c90a9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs @@ -0,0 +1,183 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Http.WebSockets +{ + /// + /// 基于Http的WebSocket的扩展。 + /// 此组件只能挂载在 + /// + [SingletonPlugin] + public class WebSocketServerPlugin : HttpPluginBase + { + /// + /// 表示是否完成WS握手 + /// + public static readonly DependencyProperty HandshakedProperty = + DependencyProperty.Register("Handshaked", typeof(WebSocketServerPlugin), false); + + /// + /// 表示WebSocketVersion + /// + public static readonly DependencyProperty WebSocketVersionProperty = + DependencyProperty.Register("WebSocketVersion", typeof(WebSocketServerPlugin), "13"); + + private readonly IPluginsManager m_pluginsManager; + + private string m_wSUrl = "/ws"; + + /// + /// WebSocketServerPlugin + /// + /// + public WebSocketServerPlugin(IPluginsManager pluginsManager) + { + m_pluginsManager = pluginsManager ?? throw new ArgumentNullException(nameof(pluginsManager)); + } + + /// + /// 是否默认处理Close报文。 + /// + public bool AutoClose { get; set; } = true; + + /// + /// 当收到ping报文时,是否自动回应pong。 + /// + public bool AutoPong { get; set; } + + /// + /// 处理WS数据的回调 + /// + public Action HandleWSDataFrameCallback { get; set; } + + /// + /// 用于WebSocket连接的路径,默认为“/ws” + /// 如果设置为null或空,则意味着所有的连接都将解释为WS + /// + public string WSUrl + { + get => m_wSUrl; + set => m_wSUrl = string.IsNullOrEmpty(value) ? "/" : value; + } + + /// + /// 不处理Close报文。 + /// + /// + public WebSocketServerPlugin NoAutoClose() + { + AutoClose = false; + return this; + } + + /// + /// 当收到ping报文时,自动回应pong。 + /// + /// + public WebSocketServerPlugin UseAutoPong() + { + AutoPong = true; + return this; + } + + /// + /// 设置处理WS数据的回调。 + /// + /// + public WebSocketServerPlugin SetCallback(Action action) + { + HandleWSDataFrameCallback = action; + return this; + } + + /// + /// 用于WebSocket连接的路径,默认为“/ws” + /// 如果设置为null或空,则意味着所有的连接都将解释为WS + /// + /// + /// + public WebSocketServerPlugin SetWSUrl(string url) + { + WSUrl = url; + return this; + } + + /// + /// + /// + /// + /// + protected override void OnGet(ITcpClientBase client, HttpContextEventArgs e) + { + if (WSUrl == "/" || e.Context.Request.UrlEquals(WSUrl)) + { + if (client.Protocol == Protocol.Http) + { + e.Handled = true; + if (client is HttpSocketClient socketClient) + { + socketClient.SwitchProtocolToWebSocket(e.Context); + } + } + } + base.OnGet(client, e); + } + + /// + /// 处理WS数据帧。覆盖父类方法将不会触发回调和插件。 + /// + /// + /// + protected virtual void OnHandleWSDataFrame(ITcpClientBase client, WSDataFrameEventArgs e) + { + if (AutoClose&&e.DataFrame.Opcode == WSDataType.Close) + { + string msg = e.DataFrame.PayloadData?.ToString(); + m_pluginsManager.Raise(nameof(IWebSocketPlugin.OnClosing), client, new MsgEventArgs() { Message = msg }); + client.Close(msg); + return; + } + if (AutoPong&& e.DataFrame.Opcode == WSDataType.Ping) + { + ((HttpSocketClient)client).PongWS(); + return; + } + if (m_pluginsManager.Raise(nameof(IWebSocketPlugin.OnHandleWSDataFrame), client, e)) + { + return; + } + HandleWSDataFrameCallback?.Invoke(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnReceivedData(ITcpClientBase client, ReceivedDataEventArgs e) + { + if (client.Protocol == Protocol.WebSocket) + { + if (e.RequestInfo is WSDataFrame dataFrame) + { + e.Handled = true; + OnHandleWSDataFrame(client, new WSDataFrameEventArgs(dataFrame)); + } + } + base.OnReceivedData(client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs.meta new file mode 100644 index 0000000..e3b42d5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Http/WebSockets/Plugins/WebSocketServerPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8d280376baaa574fa52fa7cd7f9be27 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources.meta new file mode 100644 index 0000000..90a8675 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 415cc6ede527851459ef1192a8c5cf9c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs new file mode 100644 index 0000000..04b334a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs @@ -0,0 +1,18 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Runtime.CompilerServices; + +#if NET6_0_OR_GREATER +#else +[assembly: SuppressIldasm()] +#endif diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs.meta new file mode 100644 index 0000000..b34a74e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cacab45659d308644b8cd0945ae196c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs new file mode 100644 index 0000000..7406387 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs @@ -0,0 +1,251 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.ComponentModel; + +namespace TouchSocket.Resources +{ + /// + /// TouchSocket资源枚举 + /// + public enum TouchSocketStatus : byte + { + /// + /// 未知错误 + /// + [Description("未知错误")] + UnknownError, + + /// + /// 操作成功 + /// + [Description("操作成功")] + Success, + + /// + /// 操作超时 + /// + [Description("操作超时")] + Overtime, + + /// + /// 用户主动取消操作。 + /// + [Description("用户主动取消操作。")] + Canceled, + + /// + /// 参数‘{0}’为空。 + /// + [Description("参数‘{0}’为空。")] + ArgumentNull, + + /// + ///发生异常,信息:{0}。 + /// + [Description("发生异常,信息:{0}。")] + Exception, + + #region TouchRpc + + /// + /// 不允许路由该包,信息:{0}。 + /// + [Description("不允许路由该包,信息:{0}。")] + RoutingNotAllowed, + + /// + /// 未找到该公共方法,或该方法未标记为Rpc + /// + [Description("未找到该公共方法,或该方法未标记为Rpc")] + RpcMethodNotFind, + + /// + /// 方法已被禁用 + /// + [Description("方法已被禁用")] + RpcMethodDisable, + + /// + /// 函数执行异常,详细信息:{0} + /// + [Description("函数执行异常,详细信息:{0}")] + RpcInvokeException, + + /// + /// 事件操作器异常 + /// + [Description("事件操作器异常。")] + GetEventArgsFail, + + /// + /// 通道设置失败。 + /// + [Description("通道设置失败。")] + SetChannelFail, + + /// + /// ID为{0}的通道已存在。 + /// + [Description("ID为{0}的通道已存在。")] + ChannelExisted, + + /// + /// 远程终端拒绝该操作,反馈信息:{0}。 + /// + [Description("远程终端拒绝该操作,反馈信息:{0}。")] + RemoteRefuse, + + /// + /// 从‘{0}’创建写入流失败,信息:{1}。" + /// + [Description("从‘{0}’创建写入流失败,信息:{1}。")] + CreateWriteStreamFail, + + /// + ///没有找到路径‘{0}’对应的流文件。 + /// + [Description("没有找到路径‘{0}’对应的流文件。")] + StreamNotFind, + + /// + /// 没有找到ID为{0}的客户端。 + /// + [Description("没有找到ID为{0}的客户端。")] + ClientNotFind, + + /// + /// 路径‘{0}’对应的流文件,仍然被‘{1}’对象应用。 + /// + [Description("路径‘{0}’对应的流文件,仍然被‘{1}’对象应用。")] + StreamReferencing, + + /// + /// 接收流容器为空 + /// + [Description("流容器为空。")] + StreamBucketNull, + + /// + /// 从‘{0}’路径加载流异常,信息:‘{1}’。 + /// + [Description("从‘{0}’路径加载流异常,信息:‘{1}’。")] + LoadStreamFail, + + /// + /// 目录‘{0}’已存在。 + /// + [Description("目录‘{0}’已存在。")] + DirectoryExisted, + + /// + /// 文件‘{0}’已存在。 + /// + [Description("文件‘{0}’已存在。")] + FileExisted, + + /// + /// 文件‘{0}’不存在。 + /// + [Description("文件‘{0}’不存在。")] + FileNotExists, + + /// + /// 目录‘{0}’不存在。 + /// + [Description("目录‘{0}’不存在。")] + DirectoryNotExists, + + /// + /// 名称为“{0}”的事件已存在 + /// + [Description("名称为“{0}”的事件已存在。")] + EventExisted, + + /// + /// 名称为“{0}”的事件不存在 + /// + [Description("名称为“{0}”的事件不存在。")] + EventNotExist, + + /// + /// 资源句柄{0}对应的资源没有找到,可能操作已超时。 + /// + [Description("资源句柄{0}对应的资源没有找到,可能操作已超时。")] + ResourceHandleNotFind, + + /// + /// 还有{0}个资源没有完成。 + /// + [Description("还有{0}个资源没有完成。")] + HasUnFinished, + + /// + /// 文件长度太长。 + /// + [Description("文件长度太长。")] + FileLengthTooLong, + + /// + /// 读取文件长度错误。 + /// + [Description("读取文件长度错误。")] + LengthErrorWhenRead, + + /// + /// 没有找到任何可用的目标Id。 + /// + [Description("没有找到任何可用的目标Id。")] + NotFindAnyTargetId, + + #endregion TouchRpc + + #region Core + + /// + /// Token消息为‘{0}’的已注册。 + /// + [Description("Token消息为‘{0}’的已注册。")] + TokenExisted, + + /// + /// Token消息为‘{0}’的未注册。 + /// + [Description("Token消息为‘{0}’的未注册。")] + MessageNotFound, + + #endregion Core + + #region Client + + /// + /// 数据处理适配器为空,可能客户端已掉线。 + /// + [Description("数据处理适配器为空,可能客户端已掉线。")] + NullDataAdapter, + + /// + /// 客户端没有连接 + /// + [Description("客户端没有连接。")] + NotConnected, + + /// + /// 授权密钥无效,程序将在5秒后退出。请检查密钥,或者不使用企业版功能。 + /// + [Description("授权密钥无效,程序将在5秒后退出。请检查密钥,或者不使用企业版功能。")] + LicenceKeyInvalid, + + #endregion Client + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs.meta new file mode 100644 index 0000000..749d603 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 131ec7fcf133baf49b45cc95541aaae1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs new file mode 100644 index 0000000..d0a9b24 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Resources +{ + /// + /// StatusExtension + /// + internal static class TouchSocketStatusExtension + { + /// + /// 转为状态字 + /// + /// + /// + public static TouchSocketStatus ToStatus(this byte value) + { + return (TouchSocketStatus)value; + } + + /// + /// 转为数值 + /// + /// + /// + public static byte ToValue(this TouchSocketStatus value) + { + return (byte)value; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs.meta new file mode 100644 index 0000000..945702d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Resources/TouchSocketStatusExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10b4d7a9babcb45408c95e91398488c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc.meta new file mode 100644 index 0000000..ee94a09 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cff7de458692e364da4c75dbea0cbb47 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global.meta new file mode 100644 index 0000000..a91ff01 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b7a1b8f4110c84419ab74ed83da7e54 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute.meta new file mode 100644 index 0000000..8e4529a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 24aecbbdb8df69543aff56bcbd6bf166 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs new file mode 100644 index 0000000..5cc5697 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs @@ -0,0 +1,81 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; + +namespace TouchSocket.Rpc +{ + /// + /// RPC行为过滤器。 + /// + public interface IRpcActionFilter + { + /// + /// 成功执行Rpc后。 + /// 如果修改的InvokeStatus,或Result。则会影响RPC最终结果 + /// + /// + /// + /// + void Executed(ICallContext callContext,object[] parameters, ref InvokeResult invokeResult); + + /// + /// 成功执行Rpc后。 + /// 如果修改的InvokeStatus,或Result。则会影响RPC最终结果 + /// + /// + /// + /// + Task ExecutedAsync(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult); + + /// + /// 执行Rpc遇见异常。 + /// 如果修改的InvokeStatus,或Result。则会影响RPC最终结果 + /// + /// + /// + /// + /// + void ExecutException(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult, Exception exception); + + /// + /// 执行Rpc遇见异常。 + /// 如果修改的InvokeStatus,或Result。则会影响RPC最终结果 + /// + /// + /// + /// + /// + Task ExecutExceptionAsync(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult, Exception exception); + + /// + /// 在执行Rpc之前。 + /// 的InvokeStatus不为。则不会执行RPC + /// 同时,当的InvokeStatus为。会直接返回结果 + /// + /// + /// + /// + void Executing(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult); + + /// + /// 在执行Rpc之前。 + /// 的InvokeStatus不为。则不会执行RPC + /// 同时,当的InvokeStatus为。会直接返回结果 + /// + /// + /// + /// + Task ExecutingAsync(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs.meta new file mode 100644 index 0000000..3ba6cd7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/IRpcActionFilter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8fafcecef85cf0543940e3ea285e4bc3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs new file mode 100644 index 0000000..70b7d66 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs @@ -0,0 +1,57 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc +{ + /// + /// RpcActionFilterAttribute + /// + public abstract class RpcActionFilterAttribute : Attribute, IRpcActionFilter + { + /// + public virtual void Executed(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult) + { + } + + /// + public virtual Task ExecutedAsync(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult) + { + return EasyTask.CompletedTask; + } + + /// + public virtual void ExecutException(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult, Exception exception) + { + } + + /// + public virtual Task ExecutExceptionAsync(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult, Exception exception) + { + return EasyTask.CompletedTask; + } + + /// + public virtual void Executing(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult) + { + } + + /// + public virtual Task ExecutingAsync(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult) + { + return EasyTask.CompletedTask; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs.meta new file mode 100644 index 0000000..f8b6bf7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcActionFilterAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38abfb943e55dd5479e0f5dc8fe06807 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs new file mode 100644 index 0000000..5dd6f2e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs @@ -0,0 +1,902 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using TouchSocket.Core; + +namespace TouchSocket.Rpc +{ + /// + /// Rpc方法属性基类 + /// + [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] + public abstract class RpcAttribute : Attribute + { + private readonly Dictionary m_exceptions = new Dictionary(); + + /// + /// 构造函数 + /// + public RpcAttribute() + { + MethodFlags = MethodFlags.None; + m_exceptions.Add(typeof(TimeoutException), "调用超时"); + m_exceptions.Add(typeof(RpcInvokeException), "Rpc调用异常"); + m_exceptions.Add(typeof(Exception), "其他异常"); + } + + /// + /// 类生成器 + /// + public ClassCodeGenerator ClassCodeGenerator { get; private set; } + + /// + /// 异常提示 + /// + public Dictionary Exceptions => m_exceptions; + + /// + /// 生成代码 + /// + public CodeGeneratorFlag GeneratorFlag { get; set; } = + CodeGeneratorFlag.InstanceSync | CodeGeneratorFlag.InstanceAsync | CodeGeneratorFlag.ExtensionSync | CodeGeneratorFlag.ExtensionAsync + | CodeGeneratorFlag.InterfaceSync | CodeGeneratorFlag.InterfaceAsync; + + /// + /// 生成泛型方法的约束 + /// + public Type[] GenericConstraintTypes { get; set; } = new Type[] { typeof(IRpcClient) }; + + /// + /// 调用键。 + /// + public string InvokeKey { get; set; } + + /// + /// 函数标识 + /// + public MethodFlags MethodFlags { get; set; } + + /// + /// 是否仅以函数名调用,当为True是,调用时仅需要传入方法名即可。 + /// + public bool MethodInvoke { get; set; } + + /// + /// 重新指定生成的函数名称。可以使用类似“JsonRpc_{0}”的模板格式。 + /// + public string MethodName { get; set; } + + /// + /// 当使用TryCanInvoke不能调用时,执行的代码。 + /// + /// + public virtual string GetCannotInvoke(MethodInstance methodInstance) + { + return "throw new RpcException(\"Rpc无法执行。\");"; + } + + /// + /// 获取注释信息 + /// + /// + /// + public virtual string GetDescription(MethodInstance methodInstance) + { + return string.IsNullOrEmpty(methodInstance.GetDescription()) ? "无注释信息" : methodInstance.GetDescription(); + } + + /// + /// 获取扩展的代理代码 + /// + /// + /// + public virtual string GetExtensionsMethodProxyCode(MethodInstance methodInstance) + { + StringBuilder codeString = new StringBuilder(); + + string description = GetDescription(methodInstance); + + List parametersStr = GetParameters(methodInstance, out bool isOut, out bool isRef, out ParameterInfo[] parameters); + var InterfaceTypes = GetGenericConstraintTypes(); + if (GeneratorFlag.HasFlag(CodeGeneratorFlag.ExtensionSync)) + { + codeString.AppendLine("///"); + codeString.AppendLine($"///{description}"); + codeString.AppendLine("///"); + foreach (var item in Exceptions) + { + codeString.AppendLine($"/// {item.Value}"); + } + + codeString.Append("public static "); + codeString.Append(GetReturn(methodInstance, false)); + codeString.Append(" "); + codeString.Append(GetMethodName(methodInstance, false)); + codeString.Append("(");//方法参数 + + codeString.Append($"this TClient client"); + + codeString.Append(","); + for (int i = 0; i < parametersStr.Count; i++) + { + if (i > 0) + { + codeString.Append(","); + } + + codeString.Append(parametersStr[i]); + } + if (parametersStr.Count > 0) + { + codeString.Append(","); + } + codeString.Append(GetInvokeOption()); + codeString.AppendLine(") where TClient:"); + + for (int i = 0; i < InterfaceTypes.Length; i++) + { + if (i > 0) + { + codeString.Append(","); + } + + codeString.Append(InterfaceTypes[i].FullName); + } + + codeString.AppendLine("{");//方法开始 + + codeString.AppendLine("if (client.TryCanInvoke?.Invoke(client)==false)"); + codeString.AppendLine("{"); + codeString.AppendLine(GetCannotInvoke(methodInstance)); + codeString.AppendLine("}"); + + if (parametersStr.Count > 0) + { + codeString.Append($"object[] parameters = new object[]"); + codeString.Append("{"); + + foreach (ParameterInfo parameter in parameters) + { + if (parameter.ParameterType.Name.Contains("&") && parameter.IsOut) + { + codeString.Append($"default({GetProxyParameterName(parameter)})"); + } + else + { + codeString.Append(parameter.Name); + } + if (parameter != parameters[parameters.Length - 1]) + { + codeString.Append(","); + } + } + codeString.AppendLine("};"); + + if (isOut || isRef) + { + codeString.Append($"Type[] types = new Type[]"); + codeString.Append("{"); + foreach (ParameterInfo parameter in parameters) + { + codeString.Append($"typeof({GetProxyParameterName(parameter)})"); + if (parameter != parameters[parameters.Length - 1]) + { + codeString.Append(","); + } + } + codeString.AppendLine("};"); + } + } + + if (methodInstance.HasReturn) + { + if (parametersStr.Count == 0) + { + codeString.Append(string.Format("{0} returnData=client.Invoke<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else if (isOut || isRef) + { + codeString.Append(string.Format("{0} returnData=client.Invoke<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption,ref parameters,types);"); + } + else + { + codeString.Append(string.Format("{0} returnData=client.Invoke<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + else + { + if (parametersStr.Count == 0) + { + codeString.Append("client.Invoke("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else if (isOut || isRef) + { + codeString.Append("client.Invoke("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption,ref parameters,types);"); + } + else + { + codeString.Append("client.Invoke("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + if (isOut || isRef) + { + codeString.AppendLine("if(parameters!=null)"); + codeString.AppendLine("{"); + for (int i = 0; i < parameters.Length; i++) + { + codeString.AppendLine(string.Format("{0}=({1})parameters[{2}];", parameters[i].Name, GetProxyParameterName(parameters[i]), i)); + } + codeString.AppendLine("}"); + if (isOut) + { + codeString.AppendLine("else"); + codeString.AppendLine("{"); + for (int i = 0; i < parameters.Length; i++) + { + if (parameters[i].IsOut) + { + codeString.AppendLine(string.Format("{0}=default({1});", parameters[i].Name, GetProxyParameterName(parameters[i]))); + } + } + codeString.AppendLine("}"); + } + } + + if (methodInstance.HasReturn) + { + codeString.AppendLine("return returnData;"); + } + + codeString.AppendLine("}"); + } + + //以下生成异步 + if (GeneratorFlag.HasFlag(CodeGeneratorFlag.ExtensionAsync) && !isOut && !isRef)//没有out或者ref + { + codeString.AppendLine("///"); + codeString.AppendLine($"///{description}"); + codeString.AppendLine("///"); + codeString.Append("public static "); + codeString.Append(GetReturn(methodInstance, true)); + codeString.Append(" "); + codeString.Append(GetMethodName(methodInstance, true)); + codeString.Append("(");//方法参数 + + codeString.Append($"this TClient client"); + + codeString.Append(","); + for (int i = 0; i < parametersStr.Count; i++) + { + if (i > 0) + { + codeString.Append(","); + } + codeString.Append(parametersStr[i]); + } + if (parametersStr.Count > 0) + { + codeString.Append(","); + } + codeString.Append(GetInvokeOption()); + codeString.AppendLine(") where TClient:"); + + for (int i = 0; i < InterfaceTypes.Length; i++) + { + if (i > 0) + { + codeString.Append(","); + } + + codeString.Append(InterfaceTypes[i].FullName); + } + + codeString.AppendLine("{");//方法开始 + + codeString.AppendLine("if (client.TryCanInvoke?.Invoke(client)==false)"); + codeString.AppendLine("{"); + codeString.AppendLine($"throw new RpcException(\"Rpc无法执行。\");"); + codeString.AppendLine("}"); + + if (parametersStr.Count > 0) + { + codeString.Append($"object[] parameters = new object[]"); + codeString.Append("{"); + foreach (ParameterInfo parameter in parameters) + { + codeString.Append(parameter.Name); + if (parameter != parameters[parameters.Length - 1]) + { + codeString.Append(","); + } + } + codeString.AppendLine("};"); + } + + if (methodInstance.HasReturn) + { + if (parametersStr.Count == 0) + { + codeString.Append(string.Format("return client.InvokeAsync<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else + { + codeString.Append(string.Format("return client.InvokeAsync<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + else + { + if (parametersStr.Count == 0) + { + codeString.Append("return client.InvokeAsync("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else + { + codeString.Append("return client.InvokeAsync("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + codeString.AppendLine("}"); + } + return codeString.ToString(); + } + + /// + /// 获取生成的函数泛型限定名称。默认 + /// + /// + public virtual Type[] GetGenericConstraintTypes() + { + return GenericConstraintTypes; + } + + /// + /// 获取生成实体类时的代码块 + /// + /// + /// + public virtual string GetInstanceProxyCode(MethodInstance methodInstance) + { + StringBuilder codeString = new StringBuilder(); + + string description = GetDescription(methodInstance); + ParameterInfo[] parameters; + bool isOut; + bool isRef; + List parametersStr = GetParameters(methodInstance, out isOut, out isRef, out parameters); + if (GeneratorFlag.HasFlag(CodeGeneratorFlag.InstanceSync)) + { + codeString.AppendLine("///"); + codeString.AppendLine($"///{description}"); + codeString.AppendLine("///"); + foreach (var item in Exceptions) + { + codeString.AppendLine($"/// {item.Value}"); + } + + codeString.Append("public "); + codeString.Append(GetReturn(methodInstance, false)); + codeString.Append(" "); + codeString.Append(GetMethodName(methodInstance, false)); + codeString.Append("(");//方法参数 + + for (int i = 0; i < parametersStr.Count; i++) + { + if (i > 0) + { + codeString.Append(","); + } + codeString.Append(parametersStr[i]); + } + if (parametersStr.Count > 0) + { + codeString.Append(","); + } + codeString.Append(GetInvokeOption()); + codeString.AppendLine(")"); + + codeString.AppendLine("{");//方法开始 + + codeString.AppendLine("if(Client==null)"); + codeString.AppendLine("{"); + codeString.AppendLine("throw new RpcException(\"IRpcClient为空,请先初始化或者进行赋值\");"); + codeString.AppendLine("}"); + codeString.AppendLine("if (Client.TryCanInvoke?.Invoke(Client)==false)"); + codeString.AppendLine("{"); + codeString.AppendLine($"throw new RpcException(\"Rpc无法执行。\");"); + codeString.AppendLine("}"); + + if (parametersStr.Count > 0) + { + codeString.Append($"object[] parameters = new object[]"); + codeString.Append("{"); + + foreach (ParameterInfo parameter in parameters) + { + if (parameter.ParameterType.Name.Contains("&") && parameter.IsOut) + { + codeString.Append($"default({GetProxyParameterName(parameter)})"); + } + else + { + codeString.Append(parameter.Name); + } + if (parameter != parameters[parameters.Length - 1]) + { + codeString.Append(","); + } + } + codeString.AppendLine("};"); + + if (isOut || isRef) + { + codeString.Append($"Type[] types = new Type[]"); + codeString.Append("{"); + foreach (ParameterInfo parameter in parameters) + { + codeString.Append($"typeof({GetProxyParameterName(parameter)})"); + if (parameter != parameters[parameters.Length - 1]) + { + codeString.Append(","); + } + } + codeString.AppendLine("};"); + } + } + + if (methodInstance.HasReturn) + { + if (parametersStr.Count == 0) + { + codeString.Append(string.Format("{0} returnData=Client.Invoke<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else if (isOut || isRef) + { + codeString.Append(string.Format("{0} returnData=Client.Invoke<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption,ref parameters,types);"); + } + else + { + codeString.Append(string.Format("{0} returnData=Client.Invoke<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + else + { + if (parametersStr.Count == 0) + { + codeString.Append("Client.Invoke("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else if (isOut || isRef) + { + codeString.Append("Client.Invoke("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption,ref parameters,types);"); + } + else + { + codeString.Append("Client.Invoke("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + if (isOut || isRef) + { + codeString.AppendLine("if(parameters!=null)"); + codeString.AppendLine("{"); + for (int i = 0; i < parameters.Length; i++) + { + codeString.AppendLine(string.Format("{0}=({1})parameters[{2}];", parameters[i].Name, GetProxyParameterName(parameters[i]), i)); + } + codeString.AppendLine("}"); + if (isOut) + { + codeString.AppendLine("else"); + codeString.AppendLine("{"); + for (int i = 0; i < parameters.Length; i++) + { + if (parameters[i].IsOut) + { + codeString.AppendLine(string.Format("{0}=default({1});", parameters[i].Name, GetProxyParameterName(parameters[i]))); + } + } + codeString.AppendLine("}"); + } + } + + if (methodInstance.HasReturn) + { + codeString.AppendLine("return returnData;"); + } + + codeString.AppendLine("}"); + } + + //以下生成异步 + if (GeneratorFlag.HasFlag(CodeGeneratorFlag.InstanceAsync) && !isOut && !isRef)//没有out或者ref + { + codeString.AppendLine("///"); + codeString.AppendLine($"///{description}"); + codeString.AppendLine("///"); + codeString.Append("public "); + codeString.Append(GetReturn(methodInstance, true)); + codeString.Append(" "); + codeString.Append(GetMethodName(methodInstance, true)); + codeString.Append("(");//方法参数 + + for (int i = 0; i < parametersStr.Count; i++) + { + if (i > 0) + { + codeString.Append(","); + } + codeString.Append(parametersStr[i]); + } + if (parametersStr.Count > 0) + { + codeString.Append(","); + } + codeString.Append(GetInvokeOption()); + codeString.AppendLine(")"); + + codeString.AppendLine("{");//方法开始 + + codeString.AppendLine("if(Client==null)"); + codeString.AppendLine("{"); + codeString.AppendLine("throw new RpcException(\"IRpcClient为空,请先初始化或者进行赋值\");"); + codeString.AppendLine("}"); + + codeString.AppendLine("if (Client.TryCanInvoke?.Invoke(Client)==false)"); + codeString.AppendLine("{"); + codeString.AppendLine($"throw new RpcException(\"Rpc无法执行。\");"); + codeString.AppendLine("}"); + + if (parametersStr.Count > 0) + { + codeString.Append($"object[] parameters = new object[]"); + codeString.Append("{"); + foreach (ParameterInfo parameter in parameters) + { + codeString.Append(parameter.Name); + if (parameter != parameters[parameters.Length - 1]) + { + codeString.Append(","); + } + } + codeString.AppendLine("};"); + } + + if (methodInstance.HasReturn) + { + if (parametersStr.Count == 0) + { + codeString.Append(string.Format("return Client.InvokeAsync<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else + { + codeString.Append(string.Format("return Client.InvokeAsync<{0}>", GetProxyParameterName(methodInstance.Info.ReturnParameter))); + codeString.Append("("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + else + { + if (parametersStr.Count == 0) + { + codeString.Append("return Client.InvokeAsync("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, null);"); + } + else + { + codeString.Append("return Client.InvokeAsync("); + codeString.Append($"\"{GetInvokenKey(methodInstance)}\""); + codeString.AppendLine(",invokeOption, parameters);"); + } + } + codeString.AppendLine("}"); + } + return codeString.ToString(); + } + + /// + /// 获取接口的代理代码 + /// + /// + /// + public virtual string GetInterfaceProxyCode(MethodInstance methodInstance) + { + StringBuilder codeString = new StringBuilder(); + bool isOut = false; + bool isRef = false; + string description = GetDescription(methodInstance); + List parameters = GetParameters(methodInstance, out isOut, out isRef, out _); + if (GeneratorFlag.HasFlag(CodeGeneratorFlag.InterfaceSync)) + { + codeString.AppendLine("///"); + codeString.AppendLine($"///{description}"); + codeString.AppendLine("///"); + foreach (var item in Exceptions) + { + codeString.AppendLine($"/// {item.Value}"); + } + + codeString.Append(GetReturn(methodInstance, false)); + codeString.Append(" "); + codeString.Append(GetMethodName(methodInstance, false)); + codeString.Append("(");//方法参数 + for (int i = 0; i < parameters.Count; i++) + { + if (i > 0) + { + codeString.Append(","); + } + codeString.Append(parameters[i]); + } + if (parameters.Count > 0) + { + codeString.Append(","); + } + codeString.Append(GetInvokeOption()); + codeString.AppendLine(");"); + } + + if (GeneratorFlag.HasFlag(CodeGeneratorFlag.InterfaceAsync) && !isOut && !isRef)//没有out或者ref + { + codeString.AppendLine("///"); + codeString.AppendLine($"///{description}"); + codeString.AppendLine("///"); + foreach (var item in Exceptions) + { + codeString.AppendLine($"/// {item.Value}"); + } + + codeString.Append(GetReturn(methodInstance, true)); + codeString.Append(" "); + codeString.Append(GetMethodName(methodInstance, true)); + codeString.Append("(");//方法参数 + + for (int i = 0; i < parameters.Count; i++) + { + if (i > 0) + { + codeString.Append(","); + } + codeString.Append(parameters[i]); + } + if (parameters.Count > 0) + { + codeString.Append(","); + } + codeString.Append(GetInvokeOption()); + codeString.AppendLine(");"); + } + + return codeString.ToString(); + } + + /// + /// 获取调用键 + /// + /// + /// + public virtual string GetInvokenKey(MethodInstance methodInstance) + { + if (MethodInvoke) + { + return GetMethodName(methodInstance, false); + } + else + { + if (!InvokeKey.IsNullOrEmpty()) + { + return InvokeKey; + } + return $"{methodInstance.ServerType.FullName}.{methodInstance.Name}".ToLower(); + } + } + + /// + /// 获取调用配置 + /// + /// + public virtual string GetInvokeOption() + { + return "IInvokeOption invokeOption = default"; + } + + /// + /// 获取生成的函数名称 + /// + /// + /// + /// + public virtual string GetMethodName(MethodInstance methodInstance, bool isAsync) + { + string name; + if (string.IsNullOrEmpty(MethodName)) + { + name = methodInstance.Name; + } + else + { + name = MethodName.Format(methodInstance.Name); + } + return isAsync ? name + "Async" : name; + } + + /// + /// 获取参数生成 + /// + /// + /// + /// + /// + /// + public virtual List GetParameters(MethodInstance methodInstance, out bool isOut, out bool isRef, out ParameterInfo[] parameters) + { + List list = new List(); + isOut = false; + isRef = false; + + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + List infos = new List(methodInstance.Parameters); + infos.RemoveAt(0); + parameters = infos.ToArray(); + } + else + { + parameters = methodInstance.Parameters; + } + + for (int i = 0; i < parameters.Length; i++) + { + StringBuilder codeString = new StringBuilder(); + if (parameters[i].ParameterType.Name.Contains("&")) + { + if (parameters[i].IsOut) + { + isOut = true; + codeString.Append(string.Format("out {0} {1}", GetProxyParameterName(parameters[i]), parameters[i].Name)); + } + else + { + isRef = true; + codeString.Append(string.Format("ref {0} {1}", GetProxyParameterName(parameters[i]), parameters[i].Name)); + } + } + else + { + codeString.Append(string.Format("{0} {1}", GetProxyParameterName(parameters[i]), parameters[i].Name)); + } + + if (parameters[i].HasDefaultValue) + { + object defaultValue = parameters[i].DefaultValue; + if (defaultValue == null) + { + codeString.Append(string.Format("=null")); + } + else if (defaultValue.ToString() == string.Empty) + { + codeString.Append(string.Format("=\"\"")); + } + else if (defaultValue.GetType() == typeof(string)) + { + codeString.Append(string.Format("=\"{0}\"", defaultValue)); + } + else if (defaultValue.GetType() == typeof(bool)) + { + codeString.Append(string.Format("={0}", defaultValue.ToString().ToLower())); + } + else if (typeof(ValueType).IsAssignableFrom(defaultValue.GetType())) + { + codeString.Append(string.Format("={0}", defaultValue)); + } + } + + list.Add(codeString.ToString()); + } + + return list; + } + + /// + /// 从类型获取代理名 + /// + /// + /// + public virtual string GetProxyParameterName(ParameterInfo parameterInfo) + { + return ClassCodeGenerator.GetTypeFullName(parameterInfo); + } + + /// + /// 获取返回值 + /// + /// + /// + /// + public virtual string GetReturn(MethodInstance methodInstance, bool isAsync) + { + if (isAsync) + { + if (methodInstance.ReturnType == null) + { + return "Task"; + } + else + { + return $"Task<{GetProxyParameterName(methodInstance.Info.ReturnParameter)}>"; + } + } + else + { + if (methodInstance.ReturnType == null) + { + return "void"; + } + else + { + return GetProxyParameterName(methodInstance.Info.ReturnParameter); + } + } + } + + internal void SetClassCodeGenerator(ClassCodeGenerator classCodeGenerator) + { + ClassCodeGenerator = classCodeGenerator; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs.meta new file mode 100644 index 0000000..1889e5d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7252e05ae411aa49b7a34ec40ef371e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs new file mode 100644 index 0000000..27bce8e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs @@ -0,0 +1,49 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc +{ + /// + /// 代理类 + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum)] + public class RpcProxyAttribute : Attribute + { + /// + /// 构造函数 + /// + /// + public RpcProxyAttribute(string className) + { + if (string.IsNullOrEmpty(className)) + { + throw new ArgumentException($"“{nameof(className)}”不能为 null 或空。", nameof(className)); + } + + ClassName = className; + } + + /// + /// 构造函数 + /// + public RpcProxyAttribute() + { + } + + /// + /// 代理类名 + /// + public string ClassName { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs.meta new file mode 100644 index 0000000..dd1d1f3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Attribute/RpcProxyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f31a3d41d1dae7c418d764f659e7f76f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code.meta new file mode 100644 index 0000000..c91b6e2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 22b73f9e3f070e741827270253b91546 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs new file mode 100644 index 0000000..82abcf4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// 属性单元代码。 + /// + public class ClassCellCode + { + /// + /// 属性名 + /// + public string Name { get; set; } + + /// + /// 代码本体 + /// + public string Code { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs.meta new file mode 100644 index 0000000..edda707 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCellCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1761a182e8e9da745851f8e102e4775c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs new file mode 100644 index 0000000..822ed61 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs @@ -0,0 +1,547 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc +{ + /// + /// 代码辅助类 + /// + public class ClassCodeGenerator + { + private static readonly string[] m_dicType = { "Dictionary`2", "IDictionary`2" }; + private static readonly string[] m_listType = { "List`1", "HashSet`1", "IList`1", "ISet`1", "ICollection`1", "IEnumerable`1" }; + private readonly Assembly[] m_assembly; + + /// + /// 构造函数 + /// + /// + public ClassCodeGenerator(Assembly[] assembly) + { + m_assembly = assembly; + PropertyDic = new ConcurrentDictionary(); + //GenericTypeDic = new ConcurrentDictionary(); + } + + /// + /// 程序集 + /// + public Assembly[] Assembly => m_assembly; + + ///// + ///// 泛型类型字典 + ///// + //public ConcurrentDictionary GenericTypeDic { get; private set; } + + /// + /// 属性类型字典。 + /// + public ConcurrentDictionary PropertyDic { get; private set; } + + /// + /// 获取类单元参数 + /// + /// + public ClassCellCode[] GetClassCellCodes() + { + return PropertyDic.Values.ToArray(); + } + + /// + /// 获取类型全名 + /// + /// + /// + public string GetTypeFullName(Type type) + { + if (type.FullName == null) + { + return type.Name.Replace("&", string.Empty); + } + else if (type == typeof(void)) + { + return null; + } + else if (typeof(Task).IsAssignableFrom(type)) + { + Type[] ts = type.GetGenericArguments(); + if (ts.Length == 1) + { + return ts[0].Name; + } + else + { + return type.Name; + } + } + else if (type.IsArray) + { + Type elementType = type.GetElementType(); + return GetTypeFullName(elementType) + type.Name.Replace(elementType.Name, string.Empty); + } + else if (type.IsNullableType()) + { + return GetTypeFullName(type.GetGenericArguments().Length==0? type: type.GetGenericArguments()[0]); + } + else if (type.IsValueTuple()) + { + Type[] elementTypes = type.GetGenericArguments(); + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append("("); + + List strings = new List(); + var tupleNames = new List(); + if (tupleElementNames != null && tupleElementNames.Count > 0) + { + tupleNames.AddRange(tupleElementNames.Skip(0).Take(elementTypes.Length)); + tupleElementNames.RemoveRange(0, elementTypes.Length); + } + for (int i = 0; i < elementTypes.Length; i++) + { + string item = GetTypeFullName(elementTypes[i]); + if (tupleNames.Count > 0) + { + strings.Add($"{item} {tupleNames[i]}"); + } + else + { + strings.Add($"{item}"); + } + } + //var strs = elementTypes.Select(e => GetTypeFullName(e)); + + + //foreach (var item in strs) + //{ + + //} + stringBuilder.Append(string.Join(",", strings)); + stringBuilder.Append(")"); + return stringBuilder.ToString(); + } + else if (type.IsByRef) + { + return GetTypeFullName(type.GetElementType()); + } + else if (type.IsPrimitive || type == typeof(string)) + { + return type.FullName; + } + else if (m_listType.Contains(type.Name)) + { + string typeInnerString = GetTypeFullName(type.GetGenericArguments()[0]); + string typeString = $"System.Collections.Generic.{type.Name.Replace("`1", string.Empty)}<{typeInnerString}>"; + return typeString; + } + else if (m_listType.Contains(type.Name) || m_dicType.Contains(type.Name)) + { + string keyString = GetTypeFullName(type.GetGenericArguments()[0]); + string valueString = GetTypeFullName(type.GetGenericArguments()[1]); + string typeString = $"System.Collections.Generic.{type.Name.Replace("`2", string.Empty)}<{keyString},{valueString}>"; + return typeString; + } + else if (PropertyDic.ContainsKey(type)) + { + return PropertyDic[type].Name; + } + else + { + return type.FullName; + } + } + + private List tupleElementNames; + /// + /// 获取类型全名 + /// + /// + /// + public string GetTypeFullName(ParameterInfo parameterInfo) + { + if (parameterInfo.ParameterType.FullName.Contains("System.ValueTuple")) + { + tupleElementNames = parameterInfo.GetTupleElementNames()?.ToList(); + } + else + { + tupleElementNames = default; + } + return GetTypeFullName(parameterInfo.ParameterType); + } + + /// + /// 获取类型全名 + /// + /// + /// + public string GetTypeFullName(PropertyInfo propertyInfo) + { + if (propertyInfo.PropertyType.FullName.Contains("System.ValueTuple")) + { + tupleElementNames = propertyInfo.GetTupleElementNames()?.ToList(); + } + else + { + tupleElementNames = default; + } + return GetTypeFullName(propertyInfo.PropertyType); + } + + /// + /// 获取类型全名 + /// + /// + /// + public string GetTypeFullName(FieldInfo fieldInfo) + { + if (fieldInfo.FieldType.FullName.Contains("System.ValueTuple")) + { + tupleElementNames = fieldInfo.GetTupleElementNames()?.ToList(); + } + else + { + tupleElementNames = default; + } + return GetTypeFullName(fieldInfo.FieldType); + } + + internal void CheckDeep() + { + //foreach (var strItem in GenericTypeDic) + //{ + // bool goon = true; + // string strItemNew = strItem.Value; + // while (goon) + // { + // goon = false; + // foreach (var item in GenericTypeDic.Keys) + // { + // if (strItemNew.Contains(item.FullName)) + // { + // strItemNew = strItemNew.Replace(item.FullName, item.Name); + // goon = true; + // } + // } + // } + // GenericTypeDic[strItem.Key] = strItemNew; + //} + + foreach (var strItem in PropertyDic) + { + bool goon = true; + string strItemNew = strItem.Value.Code; + while (goon) + { + goon = false; + foreach (var item in PropertyDic.Keys) + { + if (strItemNew.Contains(item.FullName)) + { + strItemNew = strItemNew.Replace(item.FullName, item.Name); + goon = true; + } + } + } + PropertyDic[strItem.Key].Code = strItemNew; + } + } + + /// + /// 添加类型字符串 + /// + /// + /// + public void AddTypeString(Type type, ref int deep) + { + if (CodeGenerator.m_ignoreTypes.Contains(type)) + { + return; + } + if (CodeGenerator.m_ignoreAssemblies.Contains(type.Assembly)) + { + return; + } + deep++; + if (deep > 50) + { + return; + } + if (type.IsByRef) + { + type = type.GetRefOutType(); + } + + if (type.IsPrimitive || type == typeof(string)) + { + return; + } + + if (type == TouchSocketCoreUtility.objType) + { + return; + } + if (type.IsInterface || type.IsAbstract) + { + return; + } + if (type.IsArray) + { + AddTypeString(type.GetElementType(), ref deep); + } + else if (type.IsGenericType) + { + Type[] types = type.GetGenericArguments(); + foreach (Type itemType in types) + { + AddTypeString(itemType, ref deep); + } + } + else if (type.IsEnum) + { + Type baseType = Enum.GetUnderlyingType(type); + StringBuilder stringBuilder = new StringBuilder(); + if (baseType == TouchSocketCoreUtility.byteType) + { + stringBuilder.AppendLine($"public enum {type.Name}:byte"); + stringBuilder.AppendLine("{"); + Array array = Enum.GetValues(type); + foreach (object item in array) + { + string enumString = item.ToString(); + stringBuilder.AppendLine($"{enumString}={(byte)item},"); + } + } + else if (baseType == TouchSocketCoreUtility.shortType) + { + stringBuilder.AppendLine($"public enum {type.Name}:short"); + stringBuilder.AppendLine("{"); + Array array = Enum.GetValues(type); + foreach (object item in array) + { + string enumString = item.ToString(); + stringBuilder.AppendLine($"{enumString}={(short)item},"); + } + } + else if (baseType == TouchSocketCoreUtility.intType) + { + stringBuilder.AppendLine($"public enum {type.Name}:int"); + stringBuilder.AppendLine("{"); + Array array = Enum.GetValues(type); + foreach (object item in array) + { + string enumString = item.ToString(); + stringBuilder.AppendLine($"{enumString}={(int)item},"); + } + } + else if (baseType == TouchSocketCoreUtility.longType) + { + stringBuilder.AppendLine($"public enum {type.Name}:long"); + stringBuilder.AppendLine("{"); + Array array = Enum.GetValues(type); + foreach (object item in array) + { + string enumString = item.ToString(); + stringBuilder.AppendLine($"{enumString}={(long)item},"); + } + } + + stringBuilder.AppendLine("}"); + if (!PropertyDic.ContainsKey(type)) + { + string className; + if (type.GetCustomAttribute() is RpcProxyAttribute attribute) + { + className = attribute.ClassName ?? type.Name; + } + else if (CodeGenerator.TryGetProxyTypeName(type, out className)) + { + } + else if (AllowGen(type.Assembly)) + { + className = type.Name; + } + else + { + return; + } + PropertyDic.TryAdd(type, new ClassCellCode() { Name = className, Code = stringBuilder.ToString() }); + } + } + else + { + string className; + if (type.GetCustomAttribute() is RpcProxyAttribute attribute) + { + className = attribute.ClassName ?? type.Name; + } + else if (CodeGenerator.TryGetProxyTypeName(type, out className)) + { + } + else if (AllowGen(type.Assembly)) + { + className = type.Name; + } + else + { + return; + } + StringBuilder stringBuilder = new StringBuilder(); + + stringBuilder.AppendLine(""); + if (type.IsStruct()) + { + stringBuilder.AppendLine($"public struct {className}"); + } + else + { + stringBuilder.AppendLine($"public class {className}"); + } + + if (!type.IsStruct() && type.BaseType != typeof(object)) + { + AddTypeString(type.BaseType, ref deep); + if (type.BaseType.IsGenericType) + { + Type[] types = type.BaseType.GetGenericArguments(); + foreach (Type itemType in types) + { + AddTypeString(itemType, ref deep); + } + if (m_listType.Contains(type.BaseType.Name)) + { + string typeString = GetTypeFullName(types[0]); + stringBuilder.Append($":{type.BaseType.Name.Replace("`1", string.Empty)}<{typeString}>"); + } + else if (m_dicType.Contains(type.BaseType.Name)) + { + string keyString = GetTypeFullName(types[0]); + string valueString = GetTypeFullName(types[1]); + stringBuilder.Append($": {type.BaseType.Name.Replace("`2", string.Empty)}<{keyString},{valueString}>"); + } + } + else if (type.BaseType.IsClass) + { + stringBuilder.AppendLine($": {GetTypeFullName(type.BaseType)}"); + } + } + + stringBuilder.AppendLine("{"); + foreach (PropertyInfo itemProperty in type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.GetProperty | BindingFlags.SetProperty)) + { + AddTypeString(itemProperty.PropertyType, ref deep); + if (PropertyDic.ContainsKey(itemProperty.PropertyType)) + { + stringBuilder.Append($"public {itemProperty.PropertyType.Name} {itemProperty.Name}"); + } + else if (itemProperty.IsNullableType()) + { + stringBuilder.Append($"public {GetTypeFullName(itemProperty)}? {itemProperty.Name}"); + } + else if (itemProperty.PropertyType.IsGenericType) + { + Type[] types = itemProperty.PropertyType.GetGenericArguments(); + foreach (Type itemType in types) + { + AddTypeString(itemType, ref deep); + } + if (m_listType.Contains(itemProperty.PropertyType.Name)) + { + string typeString = GetTypeFullName(types[0]); + stringBuilder.Append($"public {itemProperty.PropertyType.Name.Replace("`1", string.Empty)}<{typeString}> {itemProperty.Name}"); + } + else if (m_dicType.Contains(itemProperty.PropertyType.Name)) + { + string keyString = GetTypeFullName(types[0]); + string valueString = GetTypeFullName(types[1]); + stringBuilder.Append($"public {itemProperty.PropertyType.Name.Replace("`2", string.Empty)}<{keyString},{valueString}> {itemProperty.Name}"); + } + } + else + { + AddTypeString(itemProperty.PropertyType, ref deep); + stringBuilder.Append($"public {GetTypeFullName(itemProperty.PropertyType)} {itemProperty.Name}"); + } + + stringBuilder.AppendLine("{get;set;}"); + } + + foreach (FieldInfo itemField in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)) + { + AddTypeString(itemField.FieldType, ref deep); + if (PropertyDic.ContainsKey(itemField.FieldType)) + { + stringBuilder.Append($"public {itemField.FieldType.Name} {itemField.Name}"); + } + else if (itemField.IsNullableType()) + { + stringBuilder.Append($"public {GetTypeFullName(itemField)}? {itemField.Name}"); + } + else if (itemField.FieldType.IsGenericType) + { + Type[] types = itemField.FieldType.GetGenericArguments(); + foreach (Type itemType in types) + { + AddTypeString(itemType, ref deep); + } + if (m_listType.Contains(itemField.FieldType.Name)) + { + string typeString = GetTypeFullName(types[0]); + stringBuilder.Append($"public {itemField.FieldType.Name.Replace("`1", string.Empty)}<{typeString}> {itemField.Name}"); + } + else if (m_dicType.Contains(itemField.FieldType.Name)) + { + string keyString = GetTypeFullName(types[0]); + string valueString = GetTypeFullName(types[1]); + stringBuilder.Append($"public {itemField.FieldType.Name.Replace("`2", string.Empty)}<{keyString},{valueString}> {itemField.Name}"); + } + } + else + { + AddTypeString(itemField.FieldType, ref deep); + stringBuilder.Append($"public {GetTypeFullName(itemField.FieldType)} {itemField.Name}"); + } + + stringBuilder.AppendLine(";"); + } + + stringBuilder.AppendLine("}"); + + if (!PropertyDic.ContainsKey(type)) + { + PropertyDic.TryAdd(type, new ClassCellCode() { Name = className, Code = stringBuilder.ToString() }); + } + } + } + + private bool AllowGen(Assembly assembly) + { + foreach (var item in m_assembly) + { + if (assembly == item) + { + return true; + } + } + return false; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs.meta new file mode 100644 index 0000000..a189928 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ClassCodeGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20cbe4fc813730f4892219fcaead34d0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs new file mode 100644 index 0000000..b62cb94 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs @@ -0,0 +1,552 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using TouchSocket.Core; + +namespace TouchSocket.Rpc +{ + /// + /// 代码生成器 + /// + public static class CodeGenerator + { + internal static readonly List m_assemblies = new List(); + internal static readonly List m_ignoreAssemblies = new List(); + internal static readonly List m_ignoreTypes = new List(); + internal static readonly Dictionary m_proxyType = new Dictionary(); + private const BindingFlags m_methodFlags = BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public; + + /// + /// 添加不需要代理的程序集 + /// + /// + public static void AddIgnoreProxyAssembly(Assembly assembly) + { + m_ignoreAssemblies.Add(assembly); + } + + /// + /// 添加不需要代理的类型 + /// + /// + public static void AddIgnoreProxyType(Type type) + { + m_ignoreTypes.Add(type); + } + + /// + /// 添加需要代理的程序集 + /// + /// + public static void AddProxyAssembly(Assembly assembly) + { + m_assemblies.Add(assembly); + } + + /// + /// 添加代理类型 + /// + /// + /// + public static void AddProxyType(Type type, bool deepSearch = true) + { + if (type.IsPrimitive || type == typeof(string)) + { + return; + } + if (!m_proxyType.ContainsKey(type)) + { + RpcProxyAttribute attribute = type.GetCustomAttribute(); + m_proxyType.Add(type, attribute == null ? type.Name : attribute.ClassName); + if (deepSearch) + { + PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.SetProperty); + foreach (var item in properties) + { + AddProxyType(item.PropertyType); + } + } + } + } + + /// + /// 添加代理类型 + /// + /// + /// + public static void AddProxyType(bool deepSearch = true) + { + AddProxyType(typeof(T), deepSearch); + } + + /// + /// 是否包含类型 + /// + /// + /// + public static bool ContainsType(Type type) + { + return m_proxyType.ContainsKey(type); + } + + /// + /// 转换为cs代码。 + /// + /// + /// + /// + public static string ConvertToCode(string @namespace, params ServerCellCode[] serverCodes) + { + Dictionary serverCellCodes = new Dictionary(); + Dictionary classCellCodes = new Dictionary(); + StringBuilder codeString = new StringBuilder(); + foreach (var serverCellCode in serverCodes) + { + if (serverCellCodes.ContainsKey(serverCellCode.Name)) + { + if (serverCellCode.IncludeExtension) + { + serverCellCodes[serverCellCode.Name].IncludeExtension = true; + } + + if (serverCellCode.IncludeInstance) + { + serverCellCodes[serverCellCode.Name].IncludeInstance = true; + } + + if (serverCellCode.IncludeInterface) + { + serverCellCodes[serverCellCode.Name].IncludeInterface = true; + } + + var ccm = serverCellCodes[serverCellCode.Name].Methods; + foreach (var item in serverCellCode.Methods.Keys) + { + if (!ccm.ContainsKey(item)) + { + ccm.Add(item, serverCellCode.Methods[item]); + } + } + } + else + { + serverCellCodes.Add(serverCellCode.Name, serverCellCode); + } + + foreach (var item in serverCellCode.ClassCellCodes.Keys) + { + if (!classCellCodes.ContainsKey(item)) + { + classCellCodes.Add(item, serverCellCode.ClassCellCodes[item]); + } + } + } + + string namesp = string.IsNullOrEmpty(@namespace) ? "RRQMProxy" : @namespace; + + codeString.AppendLine("using System;"); + codeString.AppendLine("using TouchSocket.Core;"); + codeString.AppendLine("using TouchSocket.Sockets;"); + codeString.AppendLine("using TouchSocket.Rpc;"); + codeString.AppendLine("using TouchSocket.Rpc.TouchRpc;"); + codeString.AppendLine("using System.Collections.Generic;"); + codeString.AppendLine("using System.Diagnostics;"); + codeString.AppendLine("using System.Text;"); + codeString.AppendLine("using System.Threading.Tasks;"); + codeString.AppendLine(string.Format("namespace {0}", namesp)); + codeString.AppendLine("{"); + + foreach (var serverCellCode in serverCellCodes.Values) + { + if (serverCellCode.IncludeInterface) + { + //接口 + codeString.AppendLine($"public interface I{serverCellCode.Name}:{typeof(IRemoteServer).FullName}");//类开始 + codeString.AppendLine("{"); + foreach (var item in serverCellCode.Methods.Values) + { + codeString.AppendLine(item.InterfaceTemple); + } + codeString.AppendLine("}"); + //接口 + } + + if (serverCellCode.IncludeInstance) + { + //类 + if (serverCellCode.IncludeInterface) + { + codeString.AppendLine($"public class {serverCellCode.Name} :I{serverCellCode.Name}");//类开始 + } + else + { + codeString.AppendLine($"public class {serverCellCode.Name}");//类开始 + } + + codeString.AppendLine("{"); + codeString.AppendLine($"public {serverCellCode.Name}(IRpcClient client)"); + codeString.AppendLine("{"); + codeString.AppendLine("this.Client=client;"); + codeString.AppendLine("}"); + codeString.AppendLine("public IRpcClient Client{get;private set; }"); + foreach (var item in serverCellCode.Methods.Values) + { + codeString.AppendLine(item.CodeTemple); + } + codeString.AppendLine("}"); + //类 + } + + if (serverCellCode.IncludeExtension) + { + //扩展类 + codeString.AppendLine($"public static class {serverCellCode.Name}Extensions");//类开始 + codeString.AppendLine("{"); + foreach (var item in serverCellCode.Methods.Values) + { + codeString.AppendLine(item.ExtensionsTemple); + } + codeString.AppendLine("}"); + //扩展类 + } + } + + foreach (var item in classCellCodes.Values) + { + codeString.AppendLine(item.Code); + } + + codeString.AppendLine("}"); + + return codeString.ToString(); + } + + /// + /// 生成代码代理 + /// + /// 服务类型 + /// 属性标签 + /// + public static ServerCellCode Generator() where TServer : IRpcServer where TAttribute : RpcAttribute + { + return Generator(typeof(TServer), typeof(TAttribute)); + } + + /// + /// 生成代码代理 + /// + /// 服务类型 + /// + /// + public static ServerCellCode Generator(Type serverType, Type attributeType) + { + ServerCellCode serverCellCode = new ServerCellCode(); + MethodInstance[] methodInstances = GetMethodInstances(serverType, serverType); + + List assemblies = new List(m_assemblies); + assemblies.Add(serverType.Assembly); + + foreach (var item in m_ignoreAssemblies) + { + assemblies.Remove(item); + } + + ClassCodeGenerator classCodeGenerator = new ClassCodeGenerator(assemblies.ToArray()); + + serverCellCode.Name = serverType.IsInterface ? + (serverType.Name.StartsWith("I") ? serverType.Name.Remove(0, 1) : serverType.Name) : serverType.Name; + List instances = new List(); + + foreach (var item in m_proxyType.Keys) + { + int deep = 0; + classCodeGenerator.AddTypeString(item, ref deep); + } + + foreach (MethodInstance methodInstance in methodInstances) + { + foreach (RpcAttribute att in methodInstance.RpcAttributes) + { + if (attributeType == att.GetType()) + { + if (methodInstance.ReturnType != null) + { + int deep = 0; + classCodeGenerator.AddTypeString(methodInstance.ReturnType, ref deep); + } + + int i = 0; + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + i = 1; + } + for (; i < methodInstance.ParameterTypes.Length; i++) + { + int deep = 0; + classCodeGenerator.AddTypeString(methodInstance.ParameterTypes[i], ref deep); + } + + instances.Add(methodInstance); + break; + } + } + } + + classCodeGenerator.CheckDeep(); + + //foreach (var item in classCodeGenerator.GenericTypeDic.Keys.ToArray()) + //{ + // if (m_ignoreTypes.Contains(item)) + // { + // classCodeGenerator.GenericTypeDic.TryRemove(item, out _); + // } + + // if (m_ignoreAssemblies.Contains(item.Assembly)) + // { + // classCodeGenerator.GenericTypeDic.TryRemove(item, out _); + // } + //} + + foreach (var item in classCodeGenerator.PropertyDic.Keys.ToArray()) + { + if (m_ignoreTypes.Contains(item)) + { + classCodeGenerator.PropertyDic.TryRemove(item, out _); + } + + if (m_ignoreAssemblies.Contains(item.Assembly)) + { + classCodeGenerator.PropertyDic.TryRemove(item, out _); + } + } + + foreach (var item in classCodeGenerator.GetClassCellCodes()) + { + serverCellCode.ClassCellCodes.Add(item.Name, item); + } + + //ServerCodeGenerator serverCodeGenerator = new ServerCodeGenerator(classCodeGenerator); + + bool first = true; + foreach (var item in instances) + { + MethodCellCode methodCellCode = new MethodCellCode(); + RpcAttribute rpcAttribute = (RpcAttribute)item.GetAttribute(attributeType); + if (rpcAttribute == null) + { + continue; + } + rpcAttribute.SetClassCodeGenerator(classCodeGenerator); + if (first) + { + if (rpcAttribute.GeneratorFlag.HasFlag(CodeGeneratorFlag.InterfaceAsync) || rpcAttribute.GeneratorFlag.HasFlag(CodeGeneratorFlag.InterfaceSync)) + { + serverCellCode.IncludeInterface = true; + } + if (rpcAttribute.GeneratorFlag.HasFlag(CodeGeneratorFlag.InstanceAsync) || rpcAttribute.GeneratorFlag.HasFlag(CodeGeneratorFlag.InstanceSync)) + { + serverCellCode.IncludeInstance = true; + } + if (rpcAttribute.GeneratorFlag.HasFlag(CodeGeneratorFlag.ExtensionAsync) || rpcAttribute.GeneratorFlag.HasFlag(CodeGeneratorFlag.ExtensionSync)) + { + serverCellCode.IncludeExtension = true; + } + first = false; + } + + methodCellCode.InterfaceTemple = rpcAttribute.GetInterfaceProxyCode(item); + methodCellCode.CodeTemple = rpcAttribute.GetInstanceProxyCode(item); + methodCellCode.ExtensionsTemple = rpcAttribute.GetExtensionsMethodProxyCode(item); + methodCellCode.Name = ((RpcAttribute)item.GetAttribute(attributeType)).GetMethodName(item, false); + serverCellCode.Methods.Add(methodCellCode.Name, methodCellCode); + } + + return serverCellCode; + } + + /// + /// 从类型获取函数实例 + /// + /// + /// + public static MethodInstance[] GetMethodInstances() where TServer : IRpcServer + { + return GetMethodInstances(typeof(TServer), typeof(TServer)); + } + + /// + /// 从类型获取函数实例 + /// + /// + /// + /// + public static MethodInstance[] GetMethodInstances(Type serverFromType, Type serverToType) + { + if (!typeof(IRpcServer).IsAssignableFrom(serverFromType)) + { + throw new RpcException($"服务类型必须从{nameof(IRpcServer)}派生。"); + } + + if (!serverFromType.IsAssignableFrom(serverToType)) + { + throw new RpcException($"{serverToType}类型必须从{serverFromType}派生。"); + } + + List instances = new List(); + + var fromMethodInfos = new Dictionary(); + GetMethodInfos(serverFromType, ref fromMethodInfos); + + var toMethodInfos = new Dictionary(); + GetMethodInfos(serverToType, ref toMethodInfos); + + foreach (MethodInfo method in fromMethodInfos.Values) + { + if (method.IsGenericMethod) + { + continue; + } + IEnumerable attributes = method.GetCustomAttributes(true); + if (attributes.Count() > 0) + { + MethodInstance methodInstance = new MethodInstance(method) + { + ServerType = serverFromType, + IsEnable = true, + Parameters = method.GetParameters() + }; + if (!toMethodInfos.TryGetValue(GetMethodID(method), out var toMethod)) + { + throw new InvalidOperationException($"没有找到方法{method.Name}的实现"); + } + + List actionFilters = new List(); + foreach (var item in method.GetCustomAttributes(true)) + { + if (item is IRpcActionFilter filter) + { + actionFilters.Add(filter); + } + } + if (serverFromType!=serverToType) + { + foreach (var item in toMethod.GetCustomAttributes(true)) + { + if (item is IRpcActionFilter filter) + { + actionFilters.Add(filter); + } + } + } + + if (actionFilters.Count > 0) + { + methodInstance.Filters = actionFilters.ToArray(); + } + foreach (var item in attributes) + { + methodInstance.MethodFlags |= item.MethodFlags; + } + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + if (methodInstance.Parameters.Length == 0 || !typeof(ICallContext).IsAssignableFrom(methodInstance.Parameters[0].ParameterType)) + { + throw new RpcException($"函数:{method},标识包含{MethodFlags.IncludeCallContext}时,必须包含{nameof(ICallContext)}或其派生类参数,且为第一参数。"); + } + } + List names = new List(); + foreach (var parameterInfo in methodInstance.Parameters) + { + names.Add(parameterInfo.Name); + } + methodInstance.ParameterNames = names.ToArray(); + ParameterInfo[] parameters = method.GetParameters(); + List types = new List(); + foreach (var parameter in parameters) + { + types.Add(parameter.ParameterType.GetRefOutType()); + } + methodInstance.ParameterTypes = types.ToArray(); + instances.Add(methodInstance); + } + } + + return instances.ToArray(); + } + + /// + /// 生成代理代码 + /// + /// + /// + /// + /// + public static string GetProxyCodes(string @namespace, Type[] serverTypes, Type[] attributeTypes) + { + List serverCellCodeList = new List(); + foreach (var item in serverTypes) + { + foreach (var item1 in attributeTypes) + { + serverCellCodeList.Add(Generator(item, item1)); + } + } + return ConvertToCode(@namespace, serverCellCodeList.ToArray()); + } + + /// + /// 获取类型代理名称 + /// + /// + /// + /// + public static bool TryGetProxyTypeName(Type type, out string className) + { + return m_proxyType.TryGetValue(type, out className); + } + + private static string GetMethodID(MethodInfo method) + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append(method.Name); + foreach (var item in method.GetParameters()) + { + stringBuilder.Append(item.ParameterType.FullName); + } + + return stringBuilder.ToString(); + } + + private static void GetMethodInfos(Type type, ref Dictionary infos) + { + if (type.IsInterface) + { + foreach (var item in type.GetInterfaces()) + { + GetMethodInfos(item, ref infos); + } + } + foreach (var item in type.GetMethods(m_methodFlags)) + { + if (!infos.ContainsKey(GetMethodID(item))) + { + infos.Add(GetMethodID(item), item); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs.meta new file mode 100644 index 0000000..be2cda4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/CodeGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d5f385a41d078b14286c3a1f29aea0d1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs new file mode 100644 index 0000000..41f4889 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// 生成的代码单元 + /// + + public class MethodCellCode + { + /// + /// 方法名 + /// + public string Name { get; set; } + + /// + /// 代码本体 + /// + public string CodeTemple { get; set; } + + /// + /// 接口代码。 + /// + public string InterfaceTemple { get; set; } + + /// + /// 扩展代码 + /// + public string ExtensionsTemple { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs.meta new file mode 100644 index 0000000..43229b3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/MethodCellCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f8439dd60866f2b4285836dc68a8aabb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs new file mode 100644 index 0000000..5dd70d1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Generic; + +namespace TouchSocket.Rpc +{ + /// + /// 服务单元代码 + /// + public class ServerCellCode + { + /// + /// 构造函数 + /// + public ServerCellCode() + { + methods = new Dictionary(); + classCellCodes = new Dictionary(); + } + + /// + /// 包含接口 + /// + public bool IncludeInterface { get; set; } + + /// + /// 包含实例 + /// + public bool IncludeInstance { get; set; } + + /// + /// 包含扩展 + /// + public bool IncludeExtension { get; set; } + + /// + /// 服务名 + /// + public string Name { get; set; } + + private Dictionary methods; + + /// + /// 方法集合 + /// + public Dictionary Methods + { + get => methods; + set => methods = value; + } + + private Dictionary classCellCodes; + + /// + /// 类参数集合。 + /// + public Dictionary ClassCellCodes + { + get => classCellCodes; + set => classCellCodes = value; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs.meta new file mode 100644 index 0000000..0cce536 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Code/ServerCellCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9e0b61279454434c9838cb717158338 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common.meta new file mode 100644 index 0000000..bbdfb5c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e77b582ef29e1284ea3fd58f422bda85 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs new file mode 100644 index 0000000..b271040 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs @@ -0,0 +1,111 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; + +namespace TouchSocket.Rpc +{ + /// + /// 服务映射图 + /// + public class ActionMap : IEnumerable> + { + private readonly ConcurrentDictionary m_actionMap = new ConcurrentDictionary(); + + /// + /// 服务键集合 + /// + public IEnumerable ActionKeys => m_actionMap.Keys; + + /// + /// 添加调用 + /// + /// + /// + public void Add(string actionKey, MethodInstance methodInstance) + { + if (m_actionMap.ContainsKey(actionKey)) + { + throw new System.Exception($"调用键为{actionKey}的函数已存在。"); + } + m_actionMap.TryAdd(actionKey, methodInstance); + } + + /// + /// 获取所有服务函数实例 + /// + /// + public MethodInstance[] GetAllMethodInstances() + { + return m_actionMap.Values.ToArray(); + } + + /// + /// 返回迭代器 + /// + /// + public IEnumerator> GetEnumerator() + { + return m_actionMap.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return m_actionMap.GetEnumerator(); + } + + /// + /// 通过actionKey获取函数实例 + /// + /// + /// + public MethodInstance GetMethodInstance(string actionKey) + { + m_actionMap.TryGetValue(actionKey, out MethodInstance methodInstance); + return methodInstance; + } + + /// + /// 移除 + /// + /// + /// + public bool Remove(string actionKey, out MethodInstance methodInstance) + { + return m_actionMap.TryRemove(actionKey, out methodInstance); + } + + /// + /// 移除 + /// + /// + /// + public bool Remove(string actionKey) + { + return m_actionMap.TryRemove(actionKey, out _); + } + + /// + /// 通过actionKey获取函数实例 + /// + /// + /// + /// + public bool TryGetMethodInstance(string actionKey, out MethodInstance methodInstance) + { + return m_actionMap.TryGetValue(actionKey, out methodInstance); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs.meta new file mode 100644 index 0000000..903756c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/ActionMap.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6d37b54ecc115e4aaa2379bfadb6dad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs new file mode 100644 index 0000000..50e7a9c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// 反馈类型 + /// + public enum FeedbackType : byte + { + /// + /// 仅发送 + /// + OnlySend, + + /// + /// 等待,直到发送抵达 + /// + WaitSend, + + /// + /// 等待,直到调用完成 + /// + WaitInvoke + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs.meta new file mode 100644 index 0000000..263f399 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/FeedbackType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f908cb7067f474c4d8cdd26246850845 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs new file mode 100644 index 0000000..72c2fc6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Rpc +{ + /// + /// 调用结果 + /// + public struct InvokeResult + { + /// + /// 状态 + /// + public InvokeStatus Status { get; set; } + + /// + /// 信息 + /// + public string Message { get; set; } + + /// + /// 执行返回值结果 + /// + public object Result { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs.meta new file mode 100644 index 0000000..14e8bec --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/InvokeResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 240d0c13dddd1ad40afc69a3cfb9d367 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs new file mode 100644 index 0000000..73a4183 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs @@ -0,0 +1,151 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.ComponentModel; +using System.Linq; +using System.Reflection; +using TouchSocket.Core; + +namespace TouchSocket.Rpc +{ + /// + /// Rpc函数实例 + /// + public class MethodInstance : Method + { + private RpcAttribute[] m_rpcAttributes; + + private RpcAttribute[] m_serverRpcAttributes; + + /// + /// 构造函数 + /// + /// + public MethodInstance(MethodInfo methodInfo) : base(methodInfo) + { + } + + /// + /// 描述属性 + /// + public string GetDescription() + { + return this.Info.GetCustomAttribute()?.Description; + } + + /// + /// 筛选器 + /// + public IRpcActionFilter[] Filters { get; internal set; } + + /// + /// 是否可用 + /// + public bool IsEnable { get; set; } + + /// + /// 是否为单例 + /// + public bool IsSingleton { get; internal set; } + + /// + /// 函数标识 + /// + public MethodFlags MethodFlags { get; internal set; } + + /// + /// 参数名集合 + /// + public string[] ParameterNames { get; internal set; } + + /// + /// 参数集合 + /// + public ParameterInfo[] Parameters { get; internal set; } + + /// + /// 参数类型集合,已处理out及ref,无参数时为空集合, + /// + public Type[] ParameterTypes { get; internal set; } + + /// + /// Rpc属性集合 + /// + public RpcAttribute[] RpcAttributes + { + get + { + m_rpcAttributes ??= this.Info.GetCustomAttributes(true).ToArray(); + return this.m_rpcAttributes; + } + } + + /// + /// 服务实例工厂 + /// + public IRpcServerFactory ServerFactory { get; internal set; } + + /// + /// Rpc服务属性集合 + /// + public RpcAttribute[] ServerRpcAttributes + { + get + { + m_serverRpcAttributes ??= this.ServerType.GetCustomAttributes(true).ToArray(); + return this.m_serverRpcAttributes; + } + } + + /// + /// 实例类型 + /// + public Type ServerType { get; internal set; } + + /// + /// 获取指定类型属性标签 + /// + /// + /// + public T GetAttribute() + { + object attribute = this.GetAttribute(typeof(T)); + if (attribute != null) + { + return (T)attribute; + } + return default; + } + + /// + /// 获取指定类型属性标签 + /// + /// + /// + public object GetAttribute(Type attributeType) + { + object attribute = RpcAttributes.FirstOrDefault((a) => { return attributeType.IsAssignableFrom(a.GetType()); }); + if (attribute != null) + { + return attribute; + } + + attribute = ServerRpcAttributes.FirstOrDefault((a) => { return attributeType.IsAssignableFrom(a.GetType()); }); + if (attribute != null) + { + return attribute; + } + return default; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs.meta new file mode 100644 index 0000000..2929c46 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/MethodInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a72244fb5cdf50d49ac0b28b6f8b8c94 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs new file mode 100644 index 0000000..9009995 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// Rpc范围类 + /// + public abstract class RpcServer : IRpcServer + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs.meta new file mode 100644 index 0000000..333dee0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 14480b52ff0ff1644869b12392519fc8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs new file mode 100644 index 0000000..f1ba4a3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc +{ + /// + /// RpcServerFactory + /// + public class RpcServerFactory : IRpcServerFactory + { + private readonly IContainer m_container; + + /// + /// 构造函数 + /// + /// + public RpcServerFactory(IContainer container) + { + m_container = container; + } + + IRpcServer IRpcServerFactory.Create(ICallContext callContext, object[] ps) + { + return (IRpcServer)m_container.Resolve(callContext.MethodInstance.ServerType); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs.meta new file mode 100644 index 0000000..a3b4eaf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcServerFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87640c4da2fda224cb58fc8a283a3862 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs new file mode 100644 index 0000000..e29cf03 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs @@ -0,0 +1,704 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc +{ + /// + /// Rpc仓库 + /// + public class RpcStore : DisposableObject, IEnumerable + { + /// + /// 命名空间 + /// + public const string Namespace = "namespace"; + + /// + /// 代理键 + /// + public const string ProxyKey = "proxy"; + + private static readonly ConcurrentDictionary m_proxyAttributeMap = new ConcurrentDictionary(); + private readonly ConcurrentDictionary m_parsers = new ConcurrentDictionary(); + private readonly ConcurrentDictionary> m_serverTypes = new ConcurrentDictionary>(); + private string m_proxyUrl = "/proxy"; + private HttpService m_service; + + static RpcStore() + { + SearchAttribute(); + } + + /// + /// 实例化一个Rpc仓库。 + /// 需要指定容器。一般和对应的服务器、客户端共用一个容器比较好。 + /// 如果,仅仅是只有一个解析器的话,可以考虑从配置中,调用 + /// + public RpcStore(IContainer container) + { + Container = container ?? throw new ArgumentNullException(nameof(container)); + Container.RegisterSingleton(this); + + if (!container.IsRegistered(typeof(IRpcServerFactory))) + { + Container.RegisterSingleton(); + } + + SearchAttribute(); + } + + /// + /// 代理属性映射。 + /// + public static ConcurrentDictionary ProxyAttributeMap => m_proxyAttributeMap; + + /// + /// 内置IOC容器 + /// + public IContainer Container { get; private set; } + + /// + /// 解析器集合。 + /// 如果想快速获得对象,请使用,一般key为对象类型名称,或自定义的。 + /// + public IRpcParser[] RpcParsers => m_parsers.Values.ToArray(); + + /// + /// 请求代理。 + /// + public Func OnRequestProxy { get; set; } + + /// + /// 代理路径。默认为“/proxy”。 + /// 必须以“/”开头 + /// + public string ProxyUrl + { + get => m_proxyUrl; + set + { + if (string.IsNullOrEmpty(value)) + { + value = "/"; + } + m_proxyUrl = value; + } + } + + /// + /// 服务类型 + /// + public Type[] ServerTypes => m_serverTypes.Keys.ToArray(); + + /// + /// 获取IRpcParser + /// + /// + /// + public IRpcParser this[string key] => m_parsers[key]; + + /// + /// 从远程获取代理 + /// + /// + /// + public static string GetProxyInfo(string url) + { + string result = Get(url); + if (string.IsNullOrEmpty(result)) + { + throw new Exception("未知错误"); + } + return result; + } + + /// + /// 添加Rpc解析器 + /// + /// 名称 + /// 解析器实例 + /// 是否应用已注册服务 + public void AddRpcParser(string key, IRpcParser parser, bool applyServer = true) + { + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + if (!m_parsers.TryAdd(key, parser)) + { + throw new Exception("相同键值得解析器已经存在。"); + } + parser.SetRpcStore(this); + if (applyServer) + { + foreach (var item in m_serverTypes) + { + parser.OnRegisterServer(item.Value.ToArray()); + } + } + } + + /// + /// 获取服务类型对应的服务方法。 + /// + /// + /// + public MethodInstance[] GetServerMethodInstances(Type serverType) + { + return m_serverTypes[serverType].ToArray(); + } + + /// + /// 执行Rpc + /// + /// + /// + /// + /// + public InvokeResult Execute(IRpcServer rpcServer, object[] ps, ICallContext callContext) + { + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + InvokeResult invokeResult = new InvokeResult(); + try + { + if (callContext.MethodInstance.Filters != null) + { + for (int i = 0; i < callContext.MethodInstance.Filters.Length; i++) + { + callContext.MethodInstance.Filters[i].Executing(callContext,ps, ref invokeResult); + callContext.MethodInstance.Filters[i].ExecutingAsync(callContext, ps, ref invokeResult); + } + } + + if (invokeResult.Status != InvokeStatus.Ready) + { + return invokeResult; + } + + if (callContext.MethodInstance.HasReturn) + { + invokeResult.Result = callContext.MethodInstance.Invoke(rpcServer, ps); + } + else + { + callContext.MethodInstance.Invoke(rpcServer, ps); + } + invokeResult.Status = InvokeStatus.Success; + if (callContext.MethodInstance.Filters != null) + { + for (int i = 0; i < callContext.MethodInstance.Filters.Length; i++) + { + callContext.MethodInstance.Filters[i].Executed(callContext, ps, ref invokeResult); + callContext.MethodInstance.Filters[i].ExecutedAsync(callContext, ps, ref invokeResult); + } + } + } + catch (TargetInvocationException ex) + { + invokeResult.Status = InvokeStatus.InvocationException; + if (ex.InnerException != null) + { + invokeResult.Message = "函数内部发生异常,信息:" + ex.InnerException.Message; + } + else + { + invokeResult.Message = "函数内部发生异常,信息:未知"; + } + if (callContext.MethodInstance.Filters != null) + { + for (int i = 0; i < callContext.MethodInstance.Filters.Length; i++) + { + callContext.MethodInstance.Filters[i].ExecutException(callContext, ps, ref invokeResult, ex); + callContext.MethodInstance.Filters[i].ExecutExceptionAsync(callContext, ps, ref invokeResult, ex); + } + } + } + catch (Exception ex) + { + invokeResult.Status = InvokeStatus.Exception; + invokeResult.Message = ex.Message; + if (callContext.MethodInstance.Filters != null) + { + for (int i = 0; i < callContext.MethodInstance.Filters.Length; i++) + { + callContext.MethodInstance.Filters[i].ExecutException(callContext, ps, ref invokeResult, ex); + callContext.MethodInstance.Filters[i].ExecutExceptionAsync(callContext, ps, ref invokeResult, ex); + } + } + } + + return invokeResult; + } + + /// + /// 获取所有已注册的函数。 + /// + public MethodInstance[] GetAllMethods() + { + List methods = new List(); + foreach (var item in m_serverTypes.Values) + { + methods.AddRange(item); + } + + return methods.ToArray(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return m_parsers.Values.GetEnumerator(); + } + + /// + /// 返回枚举对象 + /// + /// + IEnumerator IEnumerable.GetEnumerator() + { + return m_parsers.Values.GetEnumerator(); + } + + /// + /// 本地获取代理 + /// + /// + /// + /// + public string GetProxyCodes(string @namespace, Type[] attrbuteTypes) + { + var cellCodes = GetProxyInfo(attrbuteTypes == null ? ProxyAttributeMap.Values.ToArray() : attrbuteTypes); + return CodeGenerator.ConvertToCode(@namespace, cellCodes); + } + + /// + /// 本地获取代理 + /// + /// + /// + public string GetProxyCodes(string @namespace) + { + return GetProxyCodes(@namespace, null); + } + + /// + /// 从本地获取代理 + /// + /// + public ServerCellCode[] GetProxyInfo() + { + return GetProxyInfo(ProxyAttributeMap.Values.ToArray()); + } + + /// + /// 从本地获取代理 + /// + /// + /// + public ServerCellCode[] GetProxyInfo(Type[] attrbuteType) + { + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + + List codes = new List(); + + foreach (var attrbute in attrbuteType) + { + foreach (var item in m_serverTypes.Keys) + { + ServerCellCode serverCellCode = CodeGenerator.Generator(item, attrbute); + codes.Add(serverCellCode); + } + } + return codes.ToArray(); + } + + /// + /// 移除Rpc解析器 + /// + /// + /// + /// + public bool RemoveRpcParser(string parserName, out IRpcParser parser) + { + return m_parsers.TryRemove(parserName, out parser); + } + + /// + /// 移除Rpc解析器 + /// + /// + /// + public bool RemoveRpcParser(string parserName) + { + return RemoveRpcParser(parserName, out _); + } + + /// + /// 分享代理。 + /// + /// + public void ShareProxy(IPHost iPHost) + { + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + + if (m_service != null) + { + return; + } + m_service = new HttpService(); + m_service.Setup(new TouchSocketConfig() + .SetListenIPHosts(new IPHost[] { iPHost })) + .Start(); + + m_service.AddPlugin(new InternalPlugin(this)); + } + + /// + /// 关闭分享中心 + /// + public void StopShareProxy() + { + m_service.SafeDispose(); + } + + /// + /// 获取IRpcParser + /// + /// + /// + /// + public bool TryGetRpcParser(string key, out IRpcParser parser) + { + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + return m_parsers.TryGetValue(key, out parser); + } + + /// + /// 移除注册服务 + /// + /// + /// + public int UnregisterServer(IRpcServer provider) + { + return UnregisterServer(provider.GetType()); + } + + /// + /// 移除注册服务 + /// + /// + /// + public int UnregisterServer(Type providerType) + { + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + + if (!typeof(IRpcServer).IsAssignableFrom(providerType)) + { + throw new RpcException("类型不相符"); + } + + if (RemoveServer(providerType, out MethodInstance[] instances)) + { + foreach (var parser in this) + { + parser.OnUnregisterServer(instances); + } + + return instances.Length; + } + return 0; + } + + /// + /// 移除注册服务 + /// + /// + /// + public int UnregisterServer() where T : IRpcServer + { + return UnregisterServer(typeof(T)); + } + + internal bool TryRemove(string key, out IRpcParser parser) + { + return m_parsers.TryRemove(key, out parser); + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (!DisposedValue) + { + StopShareProxy(); + foreach (var item in this) + { + item.SafeDispose(); + } + } + + base.Dispose(disposing); + } + + private static string Get(string url) + { + string result = null; + HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); + //添加参数 + HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); + Stream stream = resp.GetResponseStream(); + try + { + //获取内容 + using (StreamReader reader = new StreamReader(stream)) + { + result = reader.ReadToEnd(); + } + } + finally + { + resp.SafeDispose(); + stream.Close(); + } + return result; + } + + private static void SearchAttribute() + { + List types = new List(); + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + try + { + Type[] t1 = assembly.GetTypes().Where(p => typeof(RpcAttribute).IsAssignableFrom(p) && !p.IsAbstract).ToArray(); + types.AddRange(t1); + } + catch + { + } + } + + foreach (Type type in types) + { + ProxyAttributeMap.TryAdd(type.Name.Replace("Attribute", string.Empty).ToLower(), type); + } + } + + private bool RemoveServer(Type type, out MethodInstance[] methodInstances) + { + foreach (var newType in m_serverTypes.Keys) + { + if (newType.FullName == type.FullName) + { + m_serverTypes.TryRemove(newType, out var list); + methodInstances = list.ToArray(); + return true; + } + } + methodInstances = null; + return false; + } + + #region 注册 + + /// + /// 注册为单例服务 + /// + /// + /// + /// + public void RegisterServer(Type serverFromType, IRpcServer rpcServer) + { + if (!typeof(IRpcServer).IsAssignableFrom(serverFromType)) + { + throw new RpcException($"注册类型必须与{nameof(IRpcServer)}有继承关系"); + } + + if (!serverFromType.IsAssignableFrom(rpcServer.GetType())) + { + throw new RpcException("实例类型必须与注册类型有继承关系。"); + } + foreach (var item in m_serverTypes.Keys) + { + if (item.FullName == serverFromType.FullName) + { + throw new RpcException($"名为{serverFromType.FullName}的类型已注册。"); + } + } + + MethodInstance[] methodInstances = CodeGenerator.GetMethodInstances(serverFromType, rpcServer.GetType()); + foreach (var item in methodInstances) + { + item.IsSingleton = true; + //item.ServerFactory = new RpcServerFactory(this.Container); + item.ServerFactory = Container.Resolve() ?? throw new ArgumentNullException($"{nameof(IRpcServerFactory)}"); + } + m_serverTypes.TryAdd(serverFromType, new List(methodInstances)); + Container.RegisterSingleton(serverFromType, rpcServer); + + foreach (var parser in this) + { + parser.OnRegisterServer(methodInstances); + } + } + + /// + /// 注册服务 + /// + /// + /// + /// + public void RegisterServer(Type serverFromType, Type serverToType) + { + if (!typeof(IRpcServer).IsAssignableFrom(serverFromType)) + { + throw new RpcException($"注册类型必须与{nameof(IRpcServer)}有继承关系"); + } + + if (!serverFromType.IsAssignableFrom(serverToType)) + { + throw new RpcException("实例类型必须与注册类型有继承关系。"); + } + + foreach (var item in m_serverTypes.Keys) + { + if (item.FullName == serverFromType.FullName) + { + throw new RpcException($"名为{serverFromType.FullName}的类型已注册。"); + } + } + + bool singleton; + if (typeof(ITransientRpcServer).IsAssignableFrom(serverFromType)) + { + singleton = false; + Container.RegisterTransient(serverFromType, serverToType); + } + else + { + singleton = true; + Container.RegisterSingleton(serverFromType, serverToType); + } + MethodInstance[] methodInstances = CodeGenerator.GetMethodInstances(serverFromType, serverToType); + + foreach (var item in methodInstances) + { + item.IsSingleton = singleton; + //item.ServerFactory = new RpcServerFactory(this.Container); + item.ServerFactory = Container.Resolve() ?? throw new ArgumentNullException($"{nameof(IRpcServerFactory)}"); + } + + m_serverTypes.TryAdd(serverFromType, new List(methodInstances)); + + foreach (var parser in this) + { + parser.OnRegisterServer(methodInstances); + } + } + + #endregion 注册 + } + + internal class InternalPlugin : HttpPluginBase + { + private readonly RpcStore m_rpcStore; + + public InternalPlugin(RpcStore rpcCerter) + { + m_rpcStore = rpcCerter; + } + + protected override void OnGet(ITcpClientBase client, HttpContextEventArgs e) + { + if (e.Context.Request.UrlEquals(m_rpcStore.ProxyUrl)) + { + bool? b = m_rpcStore.OnRequestProxy?.Invoke(e.Context.Request); + if (b == false) + { + using (ByteBlock byteBlock = new ByteBlock()) + { + e.Context.Response + .FromText("拒绝响应内容") + .SetStatus("403", "Forbidden") + .Build(byteBlock); + client.DefaultSend(byteBlock); + } + return; + } + string value = e.Context.Request.Query[RpcStore.ProxyKey]; + List types = new List(); + + if (value.Equals("all", StringComparison.CurrentCultureIgnoreCase)) + { + types = RpcStore.ProxyAttributeMap.Values.ToList(); + } + else + { + string[] vs = value.Split(','); + foreach (var item in vs) + { + if (RpcStore.ProxyAttributeMap.TryGetValue(item, out Type type)) + { + types.Add(type); + } + } + } + + string names = e.Context.Request.Query[RpcStore.Namespace]; + + names = string.IsNullOrEmpty(names) ? "RRQMProxy" : names; + + string code = CodeGenerator.ConvertToCode(names, m_rpcStore.GetProxyInfo(types.ToArray())); + + using (ByteBlock byteBlock = new ByteBlock()) + { + e.Context.Response + .SetStatus() + .SetContent(code) + .SetContentTypeFromFileName($"{names}.cs") + .Build(byteBlock); + client.DefaultSend(byteBlock); + } + } + base.OnGet(client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs.meta new file mode 100644 index 0000000..d90a935 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/RpcStore.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6207e2cd295537a42bca7bb40cdd377c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs new file mode 100644 index 0000000..a302872 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// TransientRpcServer + /// + public abstract class TransientRpcServer : RpcServer, ITransientRpcServer where TCallContext : ICallContext + { + ICallContext ITransientRpcServer.CallContext { get; set; } + + /// + /// 调用上下文。 + /// + protected TCallContext CallContext => (((ITransientRpcServer)this).CallContext is TCallContext Transient) ? Transient : default; + } + + /// + /// TransientRpcServer + /// + public abstract class TransientRpcServer : RpcServer, ITransientRpcServer + { + ICallContext ITransientRpcServer.CallContext { get; set; } + + /// + /// 调用上下文。 + /// + protected ICallContext CallContext => ((ITransientRpcServer)this).CallContext; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs.meta new file mode 100644 index 0000000..f73692c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Common/TransientRpcServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aefdd0598dac30c418f353f4affaba9f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum.meta new file mode 100644 index 0000000..bb3939f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa16b73fdc45c104fb9085064ba2ec0d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs new file mode 100644 index 0000000..deb3de8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc +{ + /// + /// 代码生成标识 + /// + [Flags] + public enum CodeGeneratorFlag + { + /// + /// 生成同步代码(源代码生成无效) + /// + [Obsolete("该值已被弃用,请使用颗粒度更小的配置", true)] + Sync = 1, + + /// + /// 生成异步代码(源代码生成无效) + /// + [Obsolete("该值已被弃用,请使用颗粒度更小的配置", true)] + Async = 2, + + /// + /// 生成扩展同步代码 + /// + ExtensionSync = 4, + + /// + /// 生成扩展异步代码 + /// + ExtensionAsync = 8, + + /// + /// 包含接口(源代码生成无效) + /// + [Obsolete("该值已被弃用,请使用颗粒度更小的配置", true)] + IncludeInterface = 16, + + /// + /// 包含实例(源代码生成无效) + /// + [Obsolete("该值已被弃用,请使用颗粒度更小的配置", true)] + IncludeInstance = 32, + + /// + /// 包含扩展(源代码生成无效) + /// + [Obsolete("该值已被弃用,请使用颗粒度更小的配置", true)] + IncludeExtension = 64, + + /// + /// 生成实例类同步代码(源代码生成无效) + /// + InstanceSync = 128, + + /// + /// 生成实例类异步代码(源代码生成无效) + /// + InstanceAsync = 256, + + /// + /// 生成接口同步代码 + /// + InterfaceSync = 512, + + /// + /// 生成接口异步代码 + /// + InterfaceAsync = 1024, + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs.meta new file mode 100644 index 0000000..21208c1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/CodeGeneratorFlag.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab2f4599860e1dd4295f3b30f9e4f767 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs new file mode 100644 index 0000000..c4513d2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// 调用状态 + /// + public enum InvokeStatus : byte + { + /// + /// 就绪 + /// + Ready, + + /// + /// 未找到服务 + /// + UnFound, + + /// + /// 不可用 + /// + UnEnable, + + /// + /// 成功调用 + /// + Success, + + /// + /// 调用内部异常 + /// + InvocationException, + + /// + /// 其他异常 + /// + Exception + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs.meta new file mode 100644 index 0000000..8963bae --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/InvokeStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 640124f58e6b9914a8bdba151039e0f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs new file mode 100644 index 0000000..ffbeac1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc +{ + /// + /// 函数标识 + /// + [Flags] + public enum MethodFlags + { + /// + /// 空 + /// + None = 1, + + /// + /// 包含调用上下文 + /// + IncludeCallContext = 2 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs.meta new file mode 100644 index 0000000..1bd0244 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Enum/MethodFlags.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ca5aab8a5b91c844a5e021c9e814a72 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions.meta new file mode 100644 index 0000000..5e418de --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6eaa0e3a6db97e43a352c19640b4b3e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs new file mode 100644 index 0000000..6b6775a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Rpc +{ + /// + /// Rpc异常 + /// + [Serializable] + public class RpcException : Exception + { + /// + ///构造函数 + /// + public RpcException() : base() { } + + /// + ///构造函数 + /// + /// + public RpcException(string message) : base(message) { } + + /// + ///构造函数 + /// + /// + /// + public RpcException(string message, System.Exception inner) : base(message, inner) { } + + /// + ///构造函数 + /// + /// + /// + protected RpcException(System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } + + /// + /// Rpc调用异常 + /// + [Serializable] + public class RpcInvokeException : Exception + { + /// + ///构造函数 + /// + public RpcInvokeException() : base() { } + + /// + ///构造函数 + /// + /// + public RpcInvokeException(string message) : base(message) { } + + /// + ///构造函数 + /// + /// + /// + public RpcInvokeException(string message, System.Exception inner) : base(message, inner) { } + + /// + ///构造函数 + /// + /// + /// + protected RpcInvokeException(System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs.meta new file mode 100644 index 0000000..d528f3f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Exceptions/RpcExceptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 360b59e63b708594a8f91689685bec4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions.meta new file mode 100644 index 0000000..11e85a2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7478061b43212f04f80aa187c90725dc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs new file mode 100644 index 0000000..71ed437 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs @@ -0,0 +1,64 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using TouchSocket.Rpc; + +namespace TouchSocket.Core +{ + /// + /// RpcExtensions + /// + public static class RpcConfigExtensions + { + /// + /// 指定RpcStore的创建。 + /// + public static readonly DependencyProperty RpcStoreProperty = + DependencyProperty.Register("RpcStore", typeof(RpcConfigExtensions), null); + + /// + /// 配置RpcStore的创建。 + /// + /// + /// 当RpcStore完成配置时回调 + public static TouchSocketConfig ConfigureRpcStore(this TouchSocketConfig config, Action action) + { + var value = config.GetValue(RpcStoreProperty); + if (value == default) + { + value = new RpcStore(config.Container); + config.SetValue(RpcStoreProperty, value); + } + action?.Invoke(value); + return config; + } + + /// + /// 配置RpcStore的创建。 + /// + /// + /// 当RpcStore完成配置时回调 + /// 可以使用现有的值,如果赋值为null,则会重新创建。 + public static TouchSocketConfig ConfigureRpcStore(this TouchSocketConfig config, Action action, RpcStore value = default) + { + if (value == default) + { + value = new RpcStore(config.Container); + } + action?.Invoke(value); + config.SetValue(RpcStoreProperty, value); + return config; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs.meta new file mode 100644 index 0000000..2ba694f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcConfigExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2156e112999066c429073f8525198d47 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs new file mode 100644 index 0000000..6adde29 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs @@ -0,0 +1,198 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc +{ + /// + /// RpcParserExtensions + /// + public static class RpcParserExtensions + { + /// + /// 获取本地代理 + /// + /// + /// + /// + /// + public static string GetProxyCodes(this IRpcParser rpcParser, string @namespace, Type[] attrbuteTypes) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + return rpcParser.RpcStore.GetProxyCodes(@namespace, attrbuteTypes); + } + + /// + /// 获取本地代理 + /// + /// + /// + /// + public static string GetProxyCodes(this IRpcParser rpcParser, string @namespace) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + return rpcParser.RpcStore.GetProxyCodes(@namespace, null); + } + + /// + /// 注册所有服务 + /// + /// 返回搜索到的服务数 + public static int RegisterAllServer(this IRpcParser rpcParser) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + return rpcParser.RpcStore.RegisterAllServer(); + } + + /// + /// 注册所有服务 + /// + /// 返回注册实例 + public static void RegisterServer(this IRpcParser rpcParser) where TFrom : class, IRpcServer where TTo : TFrom + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + rpcParser.RpcStore.RegisterServer(); + } + + /// + /// 注册服务 + /// + /// + /// + /// + /// + public static void RegisterServer(this IRpcParser rpcParser, Type providerInterfaceType, Type providerType) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + rpcParser.RpcStore.RegisterServer(providerInterfaceType, providerType); + } + + /// + /// 注册为单例服务 + /// + /// + /// + /// + public static void RegisterServer(this IRpcParser rpcParser, TFrom serverProvider) where TFrom : class, IRpcServer + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + rpcParser.RpcStore.RegisterServer(serverProvider); + } + + /// + /// 注册为单例服务 + /// + /// + /// + /// + public static void RegisterServer(this IRpcParser rpcParser, Type providerInterfaceType, IRpcServer serverProvider) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + rpcParser.RpcStore.RegisterServer(providerInterfaceType, serverProvider); + } + + /// + /// 注册服务 + /// + /// + /// + public static void RegisterServer(this IRpcParser rpcParser) where T : IRpcServer + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + rpcParser.RpcStore.RegisterServer(); + } + + /// + /// 注册服务 + /// + /// + /// + /// + public static void RegisterServer(this IRpcParser rpcParser, Type fromType) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + rpcParser.RpcStore.RegisterServer(fromType); + } + + /// + /// 移除注册服务 + /// + /// + /// + /// + public static int UnregisterServer(this IRpcParser rpcParser, IRpcServer provider) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + return rpcParser.RpcStore.UnregisterServer(provider); + } + + /// + /// 移除注册服务 + /// + /// + /// + /// + public static int UnregisterServer(this IRpcParser rpcParser, Type providerType) + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + return rpcParser.RpcStore.UnregisterServer(providerType); + } + + /// + /// 移除注册服务 + /// + /// + /// + public static int UnregisterServer(this IRpcParser rpcParser) where T : RpcServer + { + if (rpcParser.RpcStore == null) + { + throw new ArgumentNullException(nameof(rpcParser.RpcStore), $"RpcStore为空,这一般是该解析器没有完成初始化配置所导致的。"); + } + return rpcParser.RpcStore.UnregisterServer(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs.meta new file mode 100644 index 0000000..9e86a33 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcParserExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f6ae61dd792e9a944aadb503a351d2fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs new file mode 100644 index 0000000..b4fc6b2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace TouchSocket.Rpc +{ + /// + /// RpcStoreExtensions + /// + public static class RpcStoreExtensions + { + /// + /// 注册所有服务 + /// + /// 返回搜索到的服务数 + public static int RegisterAllServer(this RpcStore rpcStore) + { + List types = new List(); + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + try + { + Type[] t1 = assembly.GetTypes().Where(p => typeof(IRpcServer).IsAssignableFrom(p) && !p.IsAbstract && p.IsClass).ToArray(); + types.AddRange(t1); + } + catch + { + } + } + + foreach (Type type in types) + { + rpcStore.RegisterServer(type); + } + return types.Count; + } + + /// + /// 注册服务 + /// + /// + /// + public static void RegisterServer(this RpcStore rpcStore) where T : IRpcServer + { + rpcStore.RegisterServer(typeof(T)); + } + + /// + /// 注册服务 + /// + /// + /// + /// + public static void RegisterServer(this RpcStore rpcStore, Type providerType) + { + rpcStore.RegisterServer(providerType, providerType); + } + + /// + /// 注册服务 + /// + /// + /// + /// + public static void RegisterServer(this RpcStore rpcStore) where TFrom : class, IRpcServer where TTo : TFrom + { + rpcStore.RegisterServer(typeof(TFrom), typeof(TTo)); + } + + /// + /// 注册为单例服务 + /// + /// + /// + public static void RegisterServer(this RpcStore rpcStore, TFrom rpcServer) where TFrom : class, IRpcServer + { + rpcStore.RegisterServer(typeof(TFrom), rpcServer); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs.meta new file mode 100644 index 0000000..7241228 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Extensions/RpcStoreExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b918d8a39a6612c449eb546c80a30223 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface.meta new file mode 100644 index 0000000..b728e6f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bc6a503e3233ea5418d097488c82b058 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs new file mode 100644 index 0000000..117b6a6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Threading; +using TouchSocket.Rpc.TouchRpc; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc +{ + /// + /// 调用上下文 + /// + public interface ICallContext + { + /// + /// 调用此服务的主体。 + /// + /// + /// 当该服务在及派生中调用时,该值一般为对象。 + /// 当该服务在及派生中调用时,该值一般为对象。 + /// 当该服务在及派生中调用时,该值一般为对象。 + /// + /// + /// + object Caller { get; } + + /// + /// 本次调用的 + /// + MethodInstance MethodInstance { get; } + + /// + /// 可取消的调用令箭 + /// + CancellationTokenSource TokenSource { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs.meta new file mode 100644 index 0000000..f3f2da8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ICallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38290baee2323064baed83efec34b07d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs new file mode 100644 index 0000000..210b989 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading; + +namespace TouchSocket.Rpc +{ + /// + /// 调用配置接口 + /// + public interface IInvokeOption + { + /// + /// 可以取消的调用令箭 + /// + public CancellationToken Token { get; set; } + + /// + /// 调用反馈 + /// + public FeedbackType FeedbackType { get; set; } + + /// + /// 调用超时 + /// + public int Timeout { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs.meta new file mode 100644 index 0000000..af89731 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IInvokeOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c5d59b541b87edf45a813d276fe443b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs new file mode 100644 index 0000000..b1c9c6e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// 远程服务接口 + /// + public interface IRemoteServer + { + /// + /// 客户端 + /// + IRpcClient Client { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs.meta new file mode 100644 index 0000000..4c75d5d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRemoteServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17e0954efb2e9344aa486650761e9098 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs new file mode 100644 index 0000000..4cc60cc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs @@ -0,0 +1,123 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Threading.Tasks; +using TouchSocket.Rpc.TouchRpc; + +namespace TouchSocket.Rpc +{ + /// + /// Rpc接口 + /// + public interface IRpcClient : IDisposable + { + /// + /// 检验能否执行Rpc调用 + /// + Func TryCanInvoke { get; set; } + + /// + /// Rpc调用 + /// 如果调用端为客户端,则会调用服务器Rpc服务。 + /// 如果调用端为服务器,则会反向调用客户端Rpc服务。 + /// + /// 调用键 + /// 参数 + /// Rpc调用设置 + /// 调用超时 + /// 序列化异常 + /// Rpc异常 + /// Rpc服务器未注册 + /// 其他异常 + void Invoke(string invokeKey, IInvokeOption invokeOption, params object[] parameters); + + /// + /// Rpc调用 + /// 如果调用端为客户端,则会调用服务器Rpc服务。 + /// 如果调用端为服务器,则会反向调用客户端Rpc服务。 + /// + /// 调用键 + /// 参数 + /// Rpc调用设置 + /// 调用超时 + /// 序列化异常 + /// Rpc异常 + /// Rpc服务器未注册 + /// 其他异常 + /// 服务器返回结果 + T Invoke(string invokeKey, IInvokeOption invokeOption, params object[] parameters); + + /// + /// Rpc调用 + /// 如果调用端为客户端,则会调用服务器Rpc服务。 + /// 如果调用端为服务器,则会反向调用客户端Rpc服务。 + /// + /// 调用键 + /// 参数 + /// 对应类型集合 + /// Rpc调用设置 + /// 调用超时 + /// 序列化异常 + /// Rpc异常 + /// Rpc服务器未注册 + /// 其他异常 + /// 返回值 + T Invoke(string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types); + + /// + /// Rpc调用 + /// + /// 调用键 + /// 参数 + /// + /// Rpc调用设置 + /// 调用超时 + /// 序列化异常 + /// Rpc异常 + /// Rpc服务器未注册 + /// 其他异常 + void Invoke(string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types); + + /// + /// Rpc调用 + /// 如果调用端为客户端,则会调用服务器Rpc服务。 + /// 如果调用端为服务器,则会反向调用客户端Rpc服务。 + /// + /// 调用键 + /// 参数 + /// Rpc调用设置 + /// 调用超时 + /// 序列化异常 + /// Rpc异常 + /// Rpc服务器未注册 + /// 其他异常 + Task InvokeAsync(string invokeKey, IInvokeOption invokeOption, params object[] parameters); + + /// + /// Rpc调用 + /// 如果调用端为客户端,则会调用服务器Rpc服务。 + /// 如果调用端为服务器,则会反向调用客户端Rpc服务。 + /// + /// 调用键 + /// 参数 + /// Rpc调用设置 + /// 调用超时 + /// 序列化异常 + /// Rpc异常 + /// Rpc服务器未注册 + /// 其他异常 + /// 服务器返回结果 + Task InvokeAsync(string invokeKey, IInvokeOption invokeOption, params object[] parameters); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs.meta new file mode 100644 index 0000000..a93a9a3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e82b92b1793f9a04a8385250e5cc6813 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs new file mode 100644 index 0000000..215cefb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Rpc +{ + /// + /// Rpc解析器 + /// + public interface IRpcParser : IDisposable + { + /// + /// RPC仓库。 + /// + public RpcStore RpcStore { get; } + + /// + /// 设置此解析器的服务器实例 + /// + void SetRpcStore(RpcStore rpcStore); + + /// + /// 注册服务 + /// + /// + void OnRegisterServer(MethodInstance[] methodInstances); + + /// + /// 取消注册服务 + /// + /// + void OnUnregisterServer(MethodInstance[] methodInstances); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs.meta new file mode 100644 index 0000000..046a9a1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 92fbd8715d1a76f42b601aeec30daa61 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs new file mode 100644 index 0000000..8b0ed87 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// Rpc服务接口 + /// + public interface IRpcServer + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs.meta new file mode 100644 index 0000000..4dc70a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ef38075116eba7458634dcaad084d8f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs new file mode 100644 index 0000000..0eb92a9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// IRpcServerFactory + /// + public interface IRpcServerFactory + { + /// + /// 创建rpc实例 + /// + /// + /// + /// + public IRpcServer Create(ICallContext callContext, object[] ps); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs.meta new file mode 100644 index 0000000..6620443 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/IRpcServerFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f9f04d5b7783a74ab4295370b3a8a1d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs new file mode 100644 index 0000000..cce1021 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc +{ + /// + /// Rpc服务接口 + /// + public interface ITransientRpcServer : IRpcServer + { + /// + /// 调用上下文 + /// + ICallContext CallContext { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs.meta new file mode 100644 index 0000000..038cdcd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/Global/Interface/ITransientRpcServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 553aa2ed1a7919747b55c2dd736cbfcc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc.meta new file mode 100644 index 0000000..5afe600 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6b4f12c41b520e46b765b4e21486e6e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute.meta new file mode 100644 index 0000000..dc08e39 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de8a2e5da699750428b392304d8ce259 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs new file mode 100644 index 0000000..c5cc801 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// 适用于JsonRpc的标记 + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class JsonRpcAttribute : RpcAttribute + { + /// + /// 适用于JsonRpc的标记. + /// 是否仅以函数名调用,当为True是,调用时仅需要传入方法名即可。 + /// + /// + public JsonRpcAttribute(bool methodInvoke = false) + { + MethodInvoke = methodInvoke; + } + + /// + /// 适用于JsonRpc的标记. + /// + /// + public JsonRpcAttribute(string invokenKey) + { + InvokeKey = invokenKey; + } + + /// + /// + /// + /// + public override Type[] GetGenericConstraintTypes() + { + return new Type[] { typeof(IJsonRpcClient) }; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs.meta new file mode 100644 index 0000000..cc16809 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Attribute/JsonRpcAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c811999aa4ac0ee488a28a40da6bc0a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common.meta new file mode 100644 index 0000000..2a109e9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82707567c1392ed4b995921d5a53d771 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs new file mode 100644 index 0000000..13caeb2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpc响应器 + /// + public class JsonResponseContext + { + /// + /// jsonrpc + /// + public string jsonrpc { get; set; } + + /// + /// result + /// + public object result { get; set; } + + /// + /// error + /// + public error error { get; set; } + + /// + /// id + /// + public string id { get; set; } + } + + /// + /// 错误 + /// +#pragma warning disable IDE1006 // 命名样式 + + public class error +#pragma warning restore IDE1006 // 命名样式 + { + /// + /// code + /// + public int code { get; set; } + + /// + /// message + /// + public string message { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs.meta new file mode 100644 index 0000000..d015b61 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonResponseContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 168b744eacfd2d84daf26b71a4d0afc2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs new file mode 100644 index 0000000..af69df5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Threading; +using TouchSocket.Http; + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpc调用上下文 + /// + internal class JsonRpcCallContext : IJsonRpcCallContext + { + private CancellationTokenSource m_tokenSource; + + /// + /// Json字符串 + /// + public string JsonString { get; internal set; } + + /// + /// + /// + public object Caller { get; internal set; } + + /// + /// JsonRpc上下文 + /// + public JsonRpcContext JsonRpcContext { get; internal set; } + + /// + /// + /// + public MethodInstance MethodInstance { get; internal set; } + + /// + /// + /// + public CancellationTokenSource TokenSource + { + get + { + if (m_tokenSource == null) + { + m_tokenSource = new CancellationTokenSource(); + } + return m_tokenSource; + } + } + + /// + /// + /// + public HttpContext HttpContext { get; internal set; } + + /// + /// + /// + public JRPT JRPT { get; internal set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs.meta new file mode 100644 index 0000000..e571108 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 88fe775045c01694eb98061d25204fca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs new file mode 100644 index 0000000..d8dcaf7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpcPackage + /// + public class JsonRpcContext : JsonRpcRequest + { + /// + /// parameters + /// + public object[] parameters; + + /// + /// needResponse + /// + public bool needResponse; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs.meta new file mode 100644 index 0000000..07f1b15 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9819c427a8c84e24a938e73b60b4ae94 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs new file mode 100644 index 0000000..b67ae22 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpcRequest + /// + public class JsonRpcRequest + { + /// + /// jsonrpc + /// + public string jsonrpc = "2.0"; + + /// + /// method + /// + public string method; + + /// + /// @params + /// + public object @params; + + /// + /// id + /// + public string id; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs.meta new file mode 100644 index 0000000..7e80287 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65e403dd2f8e3b0439b4be82c4c20dbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs new file mode 100644 index 0000000..06515d1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs @@ -0,0 +1,57 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpcSuccessResponse + /// + public class JsonRpcSuccessResponse + { + /// + /// jsonrpc + /// + public string jsonrpc = "2.0"; + + /// + /// result + /// + public object result; + + /// + /// id + /// + public string id; + } + + /// + /// JsonRpcErrorResponse + /// + public class JsonRpcErrorResponse + { + /// + /// jsonrpc + /// + public string jsonrpc = "2.0"; + + /// + /// error + /// + public error error; + + /// + /// id + /// + public string id; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs.meta new file mode 100644 index 0000000..c5080ff --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcResponse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a114beb31777a7244971c47069937363 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs new file mode 100644 index 0000000..315554b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.JsonRpc +{ + internal class JsonRpcWaitResult : WaitResult + { + internal object Return; + + internal error error; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs.meta new file mode 100644 index 0000000..528484b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Common/JsonRpcWaitResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 55be131117607eb47af244da0de68246 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components.meta new file mode 100644 index 0000000..1a73035 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38377b33d0895004f9fa079c1630ec8e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs new file mode 100644 index 0000000..f4c8359 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs @@ -0,0 +1,874 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Sockets; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Http.WebSockets; +using TouchSocket.Rpc.TouchRpc; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpc客户端 + /// + public class JsonRpcClient : DisposableObject, ITcpClient, IJsonRpcClient + { + private readonly WaitHandlePool m_waitHandle; + private JRPT m_jrpt; + + /// + /// 构造函数 + /// + public JsonRpcClient() + { + m_waitHandle = new WaitHandlePool(); + } + + /// + /// + /// + public int BufferLength => Client.BufferLength; + + /// + /// + /// + public bool CanSend => Client.CanSend; + + /// + /// + /// + public bool CanSetDataHandlingAdapter => Client.CanSetDataHandlingAdapter; + + /// + /// 内部客户端 + /// + public ITcpClient Client { get; private set; } + + /// + /// + /// + public TouchSocketConfig Config => Client.Config; + + /// + /// + /// + public MessageEventHandler Connected { get => Client.Connected; set => Client.Connected = value; } + + /// + /// + /// + public ConnectingEventHandler Connecting { get => Client.Connecting; set => Client.Connecting = value; } + + /// + /// + /// + public IContainer Container => ((IClient)Client).Container; + + /// + /// + /// + public DataHandlingAdapter DataHandlingAdapter => Client.DataHandlingAdapter; + + /// + /// + /// + public DisconnectEventHandler Disconnected { get => Client.Disconnected; set => Client.Disconnected = value; } + + /// + public DisconnectEventHandler Disconnecting { get => Client.Disconnecting; set => Client.Disconnecting = value; } + + /// + /// + /// + public string IP => Client.IP; + + /// + public bool IsClient => Client.IsClient; + + /// + /// 协议类型 + /// + public JRPT JRPT => m_jrpt; + + /// + /// + /// + public DateTime LastReceivedTime => Client.LastReceivedTime; + + /// + /// + /// + public DateTime LastSendTime => Client.LastSendTime; + + /// + /// + /// + public ILog Logger => Client.Logger; + + /// + /// + /// + public Socket MainSocket => Client.MainSocket; + + /// + /// + /// + public Func OnHandleRawBuffer { get => Client.OnHandleRawBuffer; set => Client.OnHandleRawBuffer = value; } + + /// + /// + /// + public Func OnHandleReceivedData { get => Client.OnHandleReceivedData; set => Client.OnHandleReceivedData = value; } + + /// + /// + /// + public bool Online => Client.Online; + + /// + /// + /// + public IPluginsManager PluginsManager => Client.PluginsManager; + + /// + /// + /// + public int Port => Client.Port; + + /// + /// + /// + public Protocol Protocol { get => Client.Protocol; set => Client.Protocol = value; } + + /// + /// + /// + public ReceiveType ReceiveType => Client.ReceiveType; + + /// + /// + /// + public IPHost RemoteIPHost => Client.RemoteIPHost; + + /// + /// + /// + public Func TryCanInvoke { get; set; } + + /// + /// + /// + public bool UsePlugin => Client.UsePlugin; + + /// + /// + /// + public bool UseSsl => Client.UseSsl; + + /// + /// + /// + public void Close() + { + Client.Close(); + } + + /// + /// + /// + public void Close(string msg) + { + Client.Close(msg); + } + + /// + /// + /// + public ITcpClient Connect(int timeout = 5000) + { + Client.OnHandleReceivedData = HandleReceivedData; + Client.Connect(timeout); + return this; + } + + /// + /// + /// + public Task ConnectAsync(int timeout = 5000) + { + return EasyTask.Run(() => + { + return Connect(timeout); + }); + } + + /// + /// + /// + public void DefaultSend(byte[] buffer, int offset, int length) + { + Client.DefaultSend(buffer, offset, length); + } + + /// + /// + /// + public Task DefaultSendAsync(byte[] buffer, int offset, int length) + { + return Client.DefaultSendAsync(buffer, offset, length); + } + + /// + /// + /// + public Stream GetStream() + { + return Client.GetStream(); + } + + /// + /// + /// + public TValue GetValue(IDependencyProperty dp) + { + return Client.GetValue(dp); + } + + /// + /// + /// + public void Send(byte[] buffer, int offset, int length) + { + Client.Send(buffer, offset, length); + } + + /// + /// + /// + public void Send(IRequestInfo requestInfo) + { + Client.Send(requestInfo); + } + + /// + /// + /// + public void Send(IList> transferBytes) + { + Client.Send(transferBytes); + } + + /// + /// + /// + public Task SendAsync(byte[] buffer, int offset, int length) + { + return Client.SendAsync(buffer, offset, length); + } + + /// + /// + /// + public Task SendAsync(IRequestInfo requestInfo) + { + return Client.SendAsync(requestInfo); + } + + /// + /// + /// + public Task SendAsync(IList> transferBytes) + { + return Client.SendAsync(transferBytes); + } + + /// + /// + /// + public void SetDataHandlingAdapter(DataHandlingAdapter adapter) + { + Client.SetDataHandlingAdapter(adapter); + } + + /// + /// + /// + public ITcpClient Setup(TouchSocketConfig config) + { + m_jrpt = config.GetValue(JsonRpcConfigExtensions.JRPTProperty); + switch (m_jrpt) + { + case JRPT.Http: + Client ??= new HttpClient(); + break; + + case JRPT.Websocket: + Client ??= new WebSocketClient(); + break; + + case JRPT.Tcp: + default: + Client ??= new Sockets.TcpClient(); + break; + } + return Client.Setup(config); + } + + /// + /// + /// + public ITcpClient Setup(string ipHost) + { + TouchSocketConfig config = new TouchSocketConfig(); + config.SetRemoteIPHost(new IPHost(ipHost)); + return Setup(config); + } + + /// + /// + /// + public DependencyObject SetValue(IDependencyProperty dp, TValue value) + { + return Client.SetValue(dp, value); + } + + /// + /// 处理数据 + /// + /// + /// + private bool HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + string jsonString = null; + switch (m_jrpt) + { + case JRPT.Http: + { + HttpResponse httpResponse = (HttpResponse)requestInfo; + jsonString = httpResponse.GetBody(); + break; + } + case JRPT.Websocket: + { + if (requestInfo is WSDataFrame dataFrame && dataFrame.Opcode == WSDataType.Text) + { + jsonString = dataFrame.ToText(); + } + break; + } + case JRPT.Tcp: + default: + { + if (byteBlock == null) + { + return true; + } + else + { + jsonString = byteBlock.ToString(); + } + break; + } + } + + if (string.IsNullOrEmpty(jsonString)) + { + return true; + } + + try + { + if (jsonString.Contains("error") || jsonString.Contains("result")) + { + JsonResponseContext responseContext = jsonString.FromJson(); + if (responseContext != null && !responseContext.id.IsNullOrEmpty()) + { + JsonRpcWaitResult waitContext = new JsonRpcWaitResult + { + Status = 1, + Sign = long.Parse(responseContext.id), + error = responseContext.error, + Return = responseContext.result + }; + m_waitHandle.SetRun(waitContext); + } + } + } + catch + { + } + return true; + } + + #region RPC调用 + + /// + /// + /// + /// + /// + public bool HasValue(IDependencyProperty dp) + { + return Client.HasValue(dp); + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + JsonRpcWaitResult context = new JsonRpcWaitResult(); + WaitData waitData = m_waitHandle.GetWaitData(context); + + using (ByteBlock byteBlock = BytePool.Default.GetByteBlock(BufferLength)) + { + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + parameters ??= new object[0]; + JsonRpcRequest jsonRpcRequest = new JsonRpcRequest() + { + method = method, + @params = parameters + }; + + if (invokeOption.FeedbackType == FeedbackType.WaitInvoke) + { + jsonRpcRequest.id = context.Sign.ToString(); + } + else + { + jsonRpcRequest.id = null; + } + switch (m_jrpt) + { + case JRPT.Tcp: + { + byteBlock.Write(SerializeConvert.JsonSerializeToBytes(jsonRpcRequest)); + break; + } + case JRPT.Http: + { + HttpRequest request = new HttpRequest(); + request.Method = "POST"; + request.SetUrl(RemoteIPHost.GetUrlPath()); + request.FromJson(jsonRpcRequest.ToJson()); + request.Build(byteBlock); + break; + } + case JRPT.Websocket: + { + ((WebSocketClient)Client).SendWithWS(jsonRpcRequest.ToJson()); + break; + } + } + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return default; + } + case FeedbackType.WaitSend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return default; + } + case FeedbackType.WaitInvoke: + { + this.Send(byteBlock); + waitData.Wait(invokeOption.Timeout); + JsonRpcWaitResult resultContext = (JsonRpcWaitResult)waitData.WaitResult; + m_waitHandle.Destroy(waitData); + + if (resultContext.Status == 0) + { + throw new TimeoutException("等待结果超时"); + } + if (resultContext.error != null) + { + throw new RpcException(resultContext.error.message); + } + + if (resultContext.Return == null) + { + return default; + } + if (typeof(T).IsPrimitive || typeof(T) == typeof(string)) + { + return (T)resultContext.Return.ToString().ParseToType(typeof(T)); + } + + return resultContext.Return.ToJson().FromJson(); + } + default: + return default; + } + } + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + JsonRpcWaitResult context = new JsonRpcWaitResult(); + WaitData waitData = m_waitHandle.GetWaitData(context); + + using (ByteBlock byteBlock = BytePool.Default.GetByteBlock(BufferLength)) + { + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + parameters ??= new object[0]; + JsonRpcRequest jsonRpcRequest = new JsonRpcRequest() + { + method = method, + @params = parameters + }; + + if (invokeOption.FeedbackType == FeedbackType.WaitInvoke) + { + jsonRpcRequest.id = context.Sign.ToString(); + } + else + { + jsonRpcRequest.id = null; + } + switch (m_jrpt) + { + case JRPT.Tcp: + { + byteBlock.Write(SerializeConvert.JsonSerializeToBytes(jsonRpcRequest)); + break; + } + case JRPT.Websocket: + { + ((WebSocketClient)Client).SendWithWS(jsonRpcRequest.ToJson()); + break; + } + case JRPT.Http: + { + HttpRequest request = new HttpRequest(); + request.Method = "POST"; + request.SetUrl(RemoteIPHost.GetUrlPath()); + request.FromJson(jsonRpcRequest.ToJson()); + request.Build(byteBlock); + } + break; + } + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return; + } + case FeedbackType.WaitSend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return; + } + case FeedbackType.WaitInvoke: + { + this.Send(byteBlock); + waitData.Wait(invokeOption.Timeout); + JsonRpcWaitResult resultContext = (JsonRpcWaitResult)waitData.WaitResult; + m_waitHandle.Destroy(waitData); + + if (resultContext.Status == 0) + { + throw new TimeoutException("等待结果超时"); + } + if (resultContext.error != null) + { + throw new RpcException(resultContext.error.message); + } + break; + } + default: + return; + } + } + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + Invoke(method, invokeOption, ref parameters, null); + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return Invoke(method, invokeOption, ref parameters, null); + } + + /// + /// 函数式调用 + /// + /// 函数名 + /// 参数 + /// Rpc调用设置 + /// + /// + /// + public async Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + JsonRpcWaitResult context = new JsonRpcWaitResult(); + WaitData waitData = m_waitHandle.GetWaitData(context); + + using (ByteBlock byteBlock = BytePool.Default.GetByteBlock(BufferLength)) + { + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + parameters ??= new object[0]; + JsonRpcRequest jsonRpcRequest = new JsonRpcRequest() + { + method = method, + @params = parameters + }; + + if (invokeOption.FeedbackType == FeedbackType.WaitInvoke) + { + jsonRpcRequest.id = context.Sign.ToString(); + } + else + { + jsonRpcRequest.id = null; + } + switch (m_jrpt) + { + case JRPT.Tcp: + { + byteBlock.Write(SerializeConvert.JsonSerializeToBytes(jsonRpcRequest)); + break; + } + case JRPT.Websocket: + { + ((WebSocketClient)Client).SendWithWS(jsonRpcRequest.ToJson()); + break; + } + case JRPT.Http: + { + HttpRequest request = new HttpRequest(); + request.Method = "POST"; + request.SetUrl(RemoteIPHost.GetUrlPath()); + request.FromJson(jsonRpcRequest.ToJson()); + request.Build(byteBlock); + } + break; + } + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return; + } + case FeedbackType.WaitSend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return; + } + case FeedbackType.WaitInvoke: + { + this.Send(byteBlock); + await waitData.WaitAsync(invokeOption.Timeout); + JsonRpcWaitResult resultContext = (JsonRpcWaitResult)waitData.WaitResult; + m_waitHandle.Destroy(waitData); + + if (resultContext.Status == 0) + { + throw new TimeoutException("等待结果超时"); + } + if (resultContext.error != null) + { + throw new RpcException(resultContext.error.message); + } + break; + } + default: + return; + } + } + } + + /// + /// 函数式调用 + /// + /// 方法名 + /// 参数 + /// Rpc调用设置 + /// 调用超时 + /// Rpc异常 + /// 其他异常 + /// 服务器返回结果 + public async Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + JsonRpcWaitResult context = new JsonRpcWaitResult(); + WaitData waitData = m_waitHandle.GetWaitData(context); + + using (ByteBlock byteBlock = BytePool.Default.GetByteBlock(BufferLength)) + { + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + parameters ??= new object[0]; + JsonRpcRequest jsonRpcRequest = new JsonRpcRequest() + { + method = method, + @params = parameters + }; + + if (invokeOption.FeedbackType == FeedbackType.WaitInvoke) + { + jsonRpcRequest.id = context.Sign.ToString(); + } + else + { + jsonRpcRequest.id = null; + } + switch (m_jrpt) + { + case JRPT.Tcp: + { + byteBlock.Write(SerializeConvert.JsonSerializeToBytes(jsonRpcRequest)); + break; + } + case JRPT.Http: + { + HttpRequest request = new HttpRequest(); + request.Method = "POST"; + request.SetUrl(RemoteIPHost.GetUrlPath()); + request.FromJson(jsonRpcRequest.ToJson()); + request.Build(byteBlock); + break; + } + case JRPT.Websocket: + { + ((WebSocketClient)Client).SendWithWS(jsonRpcRequest.ToJson()); + break; + } + } + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return default; + } + case FeedbackType.WaitSend: + { + this.Send(byteBlock); + m_waitHandle.Destroy(waitData); + return default; + } + case FeedbackType.WaitInvoke: + { + this.Send(byteBlock); + await waitData.WaitAsync(invokeOption.Timeout); + JsonRpcWaitResult resultContext = (JsonRpcWaitResult)waitData.WaitResult; + m_waitHandle.Destroy(waitData); + + if (resultContext.Status == 0) + { + throw new TimeoutException("等待结果超时"); + } + if (resultContext.error != null) + { + throw new RpcException(resultContext.error.message); + } + + if (resultContext.Return == null) + { + return default; + } + if (typeof(T).IsPrimitive || typeof(T) == typeof(string)) + { + return (T)resultContext.Return.ToString().ParseToType(typeof(T)); + } + + return resultContext.Return.ToJson().FromJson(); + } + default: + return default; + } + } + } + + /// + /// + /// + /// + /// + /// + public DependencyObject RemoveValue(IDependencyProperty dp) + { + return Client.RemoveValue(dp); + } + + #endregion RPC调用 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs.meta new file mode 100644 index 0000000..b372aa6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Components/JsonRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1990bdce7c330b42ae1cdc8f9526c1f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config.meta new file mode 100644 index 0000000..8dec952 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bc6a243e86ce3d8409faf283aad67ce4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs new file mode 100644 index 0000000..e3976f0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs @@ -0,0 +1,79 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; +using TouchSocket.Rpc.JsonRpc; + +namespace TouchSocket.Sockets +{ + /// + /// JsonRpcConfigExtensions + /// + public static class JsonRpcConfigExtensions + { + /// + /// 构建JsonRpc类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithJsonRpcClient(this TouchSocketConfig config) where TClient : IJsonRpcClient + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Connect(); + return client; + } + + /// + /// 构建JsonRpc类客户端,并连接 + /// + /// + /// + public static JsonRpcClient BuildWithJsonRpcClient(this TouchSocketConfig config) + { + return BuildWithJsonRpcClient(config); + } + + /// + /// TcpJsonRpc + /// + public static Protocol TcpJsonRpc { get; private set; } = new Protocol("TcpJsonRpc"); + + /// + /// 转化Protocol协议标识 + /// + /// + public static void SwitchProtocolToTcpJsonRpc(this ITcpClientBase client) + { + client.Protocol = TcpJsonRpc; + } + + /// + /// 设置JsonRpc的协议。 + /// + public static readonly DependencyProperty JRPTProperty = + DependencyProperty.Register("JRPT", typeof(JsonRpcConfigExtensions), JRPT.Tcp); + + /// + /// 设置JsonRpc的协议。默认为 + /// + /// + /// + /// + public static TouchSocketConfig SetJRPT(this TouchSocketConfig config, JRPT value) + { + config.SetValue(JRPTProperty, value); + return config; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs.meta new file mode 100644 index 0000000..c54f3bc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Config/JsonRpcConfigExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40c56915f26efc04292b4a0c9bbc9326 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum.meta new file mode 100644 index 0000000..03c7e77 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e211974f6879d6b4eaa5bdb56b204310 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs new file mode 100644 index 0000000..103e658 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpc协议类型 + /// + public enum JRPT : byte + { + /// + /// 普通TCP协议 + /// + Tcp, + + /// + /// Http协议 + /// + Http, + + /// + /// Websocket协议 + /// + Websocket + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs.meta new file mode 100644 index 0000000..4579818 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Enum/JRPT.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05ccfe7ab45b4c04484201f1e1a7fb5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions.meta new file mode 100644 index 0000000..ac3ca70 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b1acdb85eca819b42a2015c4f02749a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs new file mode 100644 index 0000000..f8b0465 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Rpc.JsonRpc; + +namespace TouchSocket.Core +{ + /// + /// JsonRpcPluginsManagerExtension + /// + public static class JsonRpcPluginsManagerExtension + { + /// + /// 使用JsonRpc的插件。仅服务器可用。 + /// + /// + /// + public static JsonRpcParserPlugin UseJsonRpc(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs.meta new file mode 100644 index 0000000..a68147b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Extensions/JsonRpcPluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9e183c66a372d04da7b05e289b485d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface.meta new file mode 100644 index 0000000..7a13fb5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7742d06a3b2866247bfc7ed1495b8540 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs new file mode 100644 index 0000000..999c48d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Rpc.WebApi; + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// IJsonRpcCallContext + /// + public interface IJsonRpcCallContext : IHttpCallContext + { + /// + /// Json字符串 + /// + public string JsonString { get; } + + /// + /// JsonRpc数据包 + /// + public JsonRpcContext JsonRpcContext { get; } + + /// + /// 表明当前的调用协议。 + /// + JRPT JRPT { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs.meta new file mode 100644 index 0000000..e29e82c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 706a557f1cc75004ea5967ae0ac36e91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs new file mode 100644 index 0000000..09f108e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// IJsonRpcClient + /// + public interface IJsonRpcClient : ITcpClient, IRpcClient + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs.meta new file mode 100644 index 0000000..016445f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Interface/IJsonRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9cfb2f8c21d0beb4198bff92cd3edc37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins.meta new file mode 100644 index 0000000..5cedb91 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9f4d59f6e6befc849ad4cabcc72f4c37 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs new file mode 100644 index 0000000..a8831a9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs @@ -0,0 +1,430 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Http.WebSockets; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.JsonRpc +{ + /// + /// JsonRpcParser解析器插件 + /// + public class JsonRpcParserPlugin : WebSocketPluginBase, IRpcParser + { + private readonly ActionMap m_actionMap; + private string m_jsonRpcUrl = "/jsonrpc"; + private RpcStore m_rpcStore; + + /// + /// 构造函数 + /// + public JsonRpcParserPlugin([DependencyParamterInject(true)] RpcStore rpcStore) + { + m_actionMap = new ActionMap(); + rpcStore?.AddRpcParser(GetType().Name, this); + } + + /// + /// JsonRpc的调用键。 + /// + public ActionMap ActionMap => m_actionMap; + + /// + /// 自动转换协议 + /// + public bool AutoSwitch { get; set; } = true; + + /// + /// 当挂载在时,匹配Url然后响应。当设置为null或空时,会全部响应。 + /// + public string JsonRpcUrl + { + get => m_jsonRpcUrl; + set => m_jsonRpcUrl = string.IsNullOrEmpty(value) ? "/" : value; + } + + /// + /// + /// + public RpcStore RpcStore => m_rpcStore; + + /// + /// 不需要自动转化协议。 + /// 仅当服务器是TCP时生效。此时如果携带协议为TcpJsonRpc时才会解释为jsonRpc。 + /// + /// + public JsonRpcParserPlugin NoSwitchProtocol() + { + AutoSwitch = false; + return this; + } + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is JsonRpcAttribute attribute) + { + m_actionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is JsonRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcService) + { + m_rpcStore = rpcService; + } + + #endregion RPC解析器 + + /// + /// 当挂载在时,匹配Url然后响应。当设置为null或空时,会全部响应。 + /// + /// + /// + public JsonRpcParserPlugin SetJsonRpcUrl(string jsonRpcUrl) + { + JsonRpcUrl = jsonRpcUrl; + return this; + } + + /// + /// + /// + /// + /// + protected override void OnConnecting(ITcpClientBase client, OperationEventArgs e) + { + if (AutoSwitch && client.Protocol == Protocol.TCP) + { + client.SwitchProtocolToTcpJsonRpc(); + } + base.OnConnecting(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnHandleWSDataFrame(ITcpClientBase client, WSDataFrameEventArgs e) + { + if (e.DataFrame.Opcode == WSDataType.Text) + { + string jsonRpcStr = e.DataFrame.ToText(); + if (jsonRpcStr.Contains("jsonrpc")) + { + e.Handled = true; + ThreadPool.QueueUserWorkItem(InvokeWaitCallback, new JsonRpcCallContext() + { + Caller = client, + JRPT = JRPT.Websocket, + JsonString = jsonRpcStr + }); + } + } + } + + /// + /// + /// + /// + /// + protected override void OnPost(ITcpClientBase client, HttpContextEventArgs e) + { + if (m_jsonRpcUrl == "/" || e.Context.Request.UrlEquals(m_jsonRpcUrl)) + { + e.Handled = true; + ThreadPool.QueueUserWorkItem(InvokeWaitCallback, new JsonRpcCallContext() + { + Caller = client, + JRPT = JRPT.Http, + JsonString = e.Context.Request.GetBody(), + HttpContext = e.Context + }); + } + base.OnPost(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnReceivedData(ITcpClientBase client, ReceivedDataEventArgs e) + { + if (client.Protocol == JsonRpcConfigExtensions.TcpJsonRpc) + { + string jsonRpcStr = e.ByteBlock.ToString(); + if (jsonRpcStr.Contains("jsonrpc")) + { + e.Handled = true; + ThreadPool.QueueUserWorkItem(InvokeWaitCallback, new JsonRpcCallContext() + { + Caller = client, + JRPT = JRPT.Tcp, + JsonString = e.ByteBlock.ToString() + }); + } + } + base.OnReceivedData(client, e); + } + + private static void Response(JsonRpcCallContext callContext, object result, error error) + { + try + { + using (ByteBlock responseByteBlock = new ByteBlock()) + { + object jobject = null; + if (error == null) + { + jobject = new JsonRpcSuccessResponse + { + result = result, + id = callContext.JsonRpcContext.id + }; + } + else + { + jobject = new JsonRpcErrorResponse + { + error = error, + id = callContext.JsonRpcContext.id + }; + } + ITcpClientBase client = (ITcpClientBase)callContext.Caller; + if (callContext.JRPT == JRPT.Http) + { + HttpResponse httpResponse = callContext.HttpContext.Response; + httpResponse.FromJson(jobject.ToJson()); + httpResponse.Answer(); + } + else if (callContext.JRPT == JRPT.Websocket) + { + ((HttpSocketClient)client).SendWithWS(jobject.ToJson()); + } + else + { + responseByteBlock.Write(jobject.ToJson().ToUTF8Bytes()); + client.Send(responseByteBlock); + } + } + } + catch + { + } + } + + private void BuildRequestContext(ref JsonRpcCallContext callContext) + { + JsonRpcContext jsonRpcContext = SerializeConvert.JsonDeserializeFromString(callContext.JsonString); + callContext.JsonRpcContext = jsonRpcContext; + if (jsonRpcContext.id != null) + { + jsonRpcContext.needResponse = true; + } + + if (m_actionMap.TryGetMethodInstance(jsonRpcContext.method, out MethodInstance methodInstance)) + { + callContext.MethodInstance = methodInstance; + if (jsonRpcContext.@params == null) + { + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + if (methodInstance.ParameterNames.Length > 1) + { + throw new RpcException("调用参数计数不匹配"); + } + else + { + jsonRpcContext.parameters = new object[] { callContext }; + } + } + else + { + if (methodInstance.ParameterNames.Length != 0) + { + throw new RpcException("调用参数计数不匹配"); + } + } + } + if (jsonRpcContext.@params is Dictionary obj) + { + jsonRpcContext.parameters = new object[methodInstance.ParameterNames.Length]; + //内联 + int i = 0; + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + jsonRpcContext.parameters[0] = callContext; + i = 1; + } + for (; i < methodInstance.ParameterNames.Length; i++) + { + if (obj.TryGetValue(methodInstance.ParameterNames[i], out object jToken)) + { + Type type = methodInstance.ParameterTypes[i]; + jsonRpcContext.parameters[i] = jToken.ToJson().FromJson(type); + } + else if (methodInstance.Parameters[i].HasDefaultValue) + { + jsonRpcContext.parameters[i] = methodInstance.Parameters[i].DefaultValue; + } + else + { + throw new RpcException("调用参数计数不匹配"); + } + } + } + else + { + IList array = (IList)jsonRpcContext.@params; + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + if (array.Count != methodInstance.ParameterNames.Length - 1) + { + throw new RpcException("调用参数计数不匹配"); + } + jsonRpcContext.parameters = new object[methodInstance.ParameterNames.Length]; + + jsonRpcContext.parameters[0] = callContext; + for (int i = 0; i < array.Count; i++) + { + jsonRpcContext.parameters[i + 1] = array[i].ToJson().FromJson(methodInstance.ParameterTypes[i + 1]); + } + } + else + { + if (array.Count != methodInstance.ParameterNames.Length) + { + throw new RpcException("调用参数计数不匹配"); + } + jsonRpcContext.parameters = new object[methodInstance.ParameterNames.Length]; + + for (int i = 0; i < array.Count; i++) + { + jsonRpcContext.parameters[i] = array[i].ToJson().FromJson(methodInstance.ParameterTypes[i]); + } + } + } + } + } + + private void InvokeWaitCallback(object context) + { + if (context is null) + { + return; + } + JsonRpcCallContext callContext = (JsonRpcCallContext)context; + InvokeResult invokeResult = new InvokeResult(); + + try + { + BuildRequestContext(ref callContext); + } + catch (Exception ex) + { + invokeResult.Status = InvokeStatus.Exception; + invokeResult.Message = ex.Message; + } + + if (callContext.MethodInstance != null) + { + if (!callContext.MethodInstance.IsEnable) + { + invokeResult.Status = InvokeStatus.UnEnable; + } + } + else + { + invokeResult.Status = InvokeStatus.UnFound; + } + + if (invokeResult.Status == InvokeStatus.Ready) + { + IRpcServer rpcServer = callContext.MethodInstance.ServerFactory.Create(callContext, callContext.JsonRpcContext.parameters); + if (rpcServer is ITransientRpcServer transientRpcServer) + { + transientRpcServer.CallContext = callContext; + } + + invokeResult = m_rpcStore.Execute(rpcServer, callContext.JsonRpcContext.parameters, callContext); + } + + if (!callContext.JsonRpcContext.needResponse) + { + return; + } + error error = null; + switch (invokeResult.Status) + { + case InvokeStatus.Success: + { + break; + } + case InvokeStatus.UnFound: + { + error = new error(); + error.code = -32601; + error.message = "函数未找到"; + break; + } + case InvokeStatus.UnEnable: + { + error = new error(); + error.code = -32601; + error.message = "函数已被禁用"; + break; + } + case InvokeStatus.InvocationException: + { + error = new error(); + error.code = -32603; + error.message = "函数内部异常"; + break; + } + case InvokeStatus.Exception: + { + error = new error(); + error.code = -32602; + error.message = invokeResult.Message; + break; + } + default: + return; + } + + Response(callContext, invokeResult.Result, error); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs.meta new file mode 100644 index 0000000..b9af73e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/JsonRpc/Plugins/JsonRpcParserPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bafb1a58b1281446a20a5990f36fa89 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc.meta new file mode 100644 index 0000000..415d4e6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9fdb706e482df954cb2edc0b6d4bd88d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute.meta new file mode 100644 index 0000000..e8d6a65 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb92f215b63dad7429c451b3c106be7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs new file mode 100644 index 0000000..314fcf8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpc方法标记属性类 + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class TouchRpcAttribute : RpcAttribute + { + /// + /// 适用于TouchRpc的标记. + /// 是否仅以函数名调用,当为True是,调用时仅需要传入方法名即可。 + /// + /// + public TouchRpcAttribute(bool methodInvoke = false) + { + MethodInvoke = methodInvoke; + } + + /// + /// 适用于TouchRpc的标记. + /// + /// + public TouchRpcAttribute(string invokenKey) + { + InvokeKey = invokenKey; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs.meta new file mode 100644 index 0000000..cb1bb15 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Attribute/TouchRpcAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 620f669647fc850478c2015dfc4b030e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel.meta new file mode 100644 index 0000000..1a726dc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d7a675253278cf4ca8e58d8819211d4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs new file mode 100644 index 0000000..c0ac8b6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs @@ -0,0 +1,745 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 通道 + /// + [DebuggerDisplay("ID={ID},Status={Status}")] + public abstract class Channel : DisposableObject + { + /// + /// 是否具有数据可读 + /// + public abstract int Available { get; } + + /// + /// 缓存容量 + /// + public abstract int CacheCapacity { get; set; } + + /// + /// 判断当前通道能否调用 + /// + public abstract bool CanMoveNext { get; } + + /// + /// 能否写入 + /// + public abstract bool CanWrite { get; } + + /// + /// 通道ID + /// + public abstract int ID { get; } + + /// + /// 最后一次操作时显示消息 + /// + public abstract string LastOperationMes { get; } + + /// + /// 状态 + /// + public abstract ChannelStatus Status { get; } + + /// + /// 目的ID地址。仅当该通道由两个客户端打通时有效。 + /// + public abstract string TargetId { get; } + + /// + /// 超时时间,默认1000*10ms。 + /// + public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(10); + + /// + /// 是否被使用 + /// + public abstract bool Using { get; } + + /// + /// 取消 + /// + public abstract void Cancel(string operationMes = null); + + /// + /// 异步取消 + /// + /// + public Task CancelAsync(string operationMes = null) + { + return EasyTask.Run(() => + { + this.Cancel(operationMes); + }); + } + + /// + /// 完成操作 + /// + public abstract void Complete(string operationMes = null); + + /// + /// 异步完成操作 + /// + /// + public Task CompleteAsync(string operationMes = null) + { + return EasyTask.Run(() => + { + this.Complete(operationMes); + }); + } + + /// + /// 获取当前的数据 + /// + public abstract byte[] GetCurrent(); + + /// + /// 继续。 + /// 调用该指令时,接收方会跳出接收,但是通道依然可用,所以接收方需要重新调用 + /// + /// + public abstract void HoldOn(string operationMes = null); + + /// + /// 异步调用继续 + /// + /// + /// + public Task HoldOnAsync(string operationMes = null) + { + return EasyTask.Run(() => + { + this.HoldOn(operationMes); + }); + } + + /// + /// 转向下个元素 + /// + /// + public abstract bool MoveNext(); + + /// + /// 转向下个元素 + /// + /// + public Task MoveNextAsync() + { + return EasyTask.Run(() => + { + return this.MoveNext(); + }); + } + + /// + /// 阻塞读取数据,直到有数据,或者超时。 + /// + /// + public Task ReadAsync() + { + return EasyTask.Run(() => + { + if (this.MoveNext()) + { + return this.GetCurrent(); + } + return null; + }); + } + + /// + /// 尝试写入。 + /// + /// + /// + /// + /// + public bool TryWrite(byte[] data, int offset, int length) + { + if (this.CanWrite) + { + try + { + this.Write(data, offset, length); + return true; + } + catch + { + } + } + return false; + } + + /// + /// 尝试写入 + /// + /// + /// + public bool TryWrite(byte[] data) + { + return this.TryWrite(data, 0, data.Length); + } + + /// + /// 异步尝试写入 + /// + /// + /// + /// + /// + public async Task TryWriteAsync(byte[] data, int offset, int length) + { + if (this.CanWrite) + { + try + { + await this.WriteAsync(data, offset, length); + return true; + } + catch + { + } + } + return false; + } + + /// + /// 异步尝试写入 + /// + /// + /// + public Task TryWriteAsync(byte[] data) + { + return this.TryWriteAsync(data, 0, data.Length); + } + + /// + /// 写入通道 + /// + /// + /// + /// + public abstract void Write(byte[] data, int offset, int length); + + /// + /// 写入通道 + /// + /// + public void Write(byte[] data) + { + this.Write(data, 0, data.Length); + } + + /// + /// 写入通道 + /// + /// + /// + /// + public Task WriteAsync(byte[] data, int offset, int length) + { + return Task.Run(() => + { + this.Write(data, offset, length); + }); + } + + /// + /// 写入通道 + /// + /// + public void WriteAsync(byte[] data) + { + this.WriteAsync(data, 0, data.Length); + } + } + + internal class InternalChannel : Channel + { + private readonly RpcActor m_actor; + private readonly IntelligentDataQueue m_dataQueue; + private readonly AutoResetEvent m_moveWaitHandle; + private readonly string m_targetId; + private readonly Timer m_timer; + private int m_cacheCapacity; + private volatile bool m_canFree; + private byte[] m_currentData; + private int m_id; + private string m_lastOperationMes; + private DateTime m_lastOperationTime; + private ChannelStatus m_status; + private bool m_using; + + public InternalChannel(RpcActor client, string targetId) + { + this.m_actor = client; + this.m_lastOperationTime = DateTime.Now; + this.m_targetId = targetId; + this.m_status = ChannelStatus.Default; + this.m_cacheCapacity = 1024 * 1024 * 5; + this.m_dataQueue = new IntelligentDataQueue(this.m_cacheCapacity) + { + OverflowWait = false, + OnQueueChanged = OnQueueChanged + }; + this.m_moveWaitHandle = new AutoResetEvent(false); + this.m_canFree = true; + this.m_timer = new Timer((o) => + { + if (DateTime.Now - this.m_lastOperationTime > TimeSpan.FromTicks(this.Timeout.Ticks * 3)) + { + this.SafeDispose(); + } + }, null, 1000, 1000); + } + + /// + /// 析构函数 + /// + ~InternalChannel() + { + this.Dispose(false); + } + + /// + /// 是否具有数据可读 + /// + public override int Available => this.m_dataQueue.Count; + + /// + /// 缓存容量 + /// + public override int CacheCapacity + { + get => this.m_cacheCapacity; + set + { + if (value < 0) + { + value = 1024; + } + this.m_cacheCapacity = value; + this.m_dataQueue.MaxSize = value; + } + } + + /// + /// 判断当前通道能否调用 + /// + public override bool CanMoveNext + { + get + { + if (this.Available > 0) + { + return true; + } + if ((byte)this.m_status >= 4) + { + return false; + } + return true; + } + } + + /// + /// 能否写入 + /// + public override bool CanWrite => (byte)this.m_status <= 3; + + /// + /// ID + /// + public override int ID => this.m_id; + + /// + /// 最后一次操作时显示消息 + /// + public override string LastOperationMes + { + get => this.m_lastOperationMes; + } + + /// + /// 状态 + /// + public override ChannelStatus Status => this.m_status; + + /// + /// 目的ID地址。 + /// + public override string TargetId => this.m_targetId; + + /// + /// 是否被使用 + /// + public override bool Using => this.m_using; + + #region 操作 + + /// + /// 取消 + /// + public override void Cancel(string operationMes = null) + { + if ((byte)this.m_status > 3) + { + return; + } + try + { + this.RequestCancel(true); + var channelPackage = new ChannelPackage() + { + ChannelId = this.m_id, + RunNow = true, + DataType = ChannelDataType.CancelOrder, + Message = operationMes, + SourceId = this.m_actor.ID, + TargetId = this.m_targetId, + Route = this.m_targetId.HasValue() + }; + this.m_actor.SendChannelPackage(channelPackage); + this.m_lastOperationTime = DateTime.Now; + } + catch + { + } + } + + /// + /// 完成操作 + /// + public override void Complete(string operationMes = null) + { + if ((byte)this.m_status > 3) + { + return; + } + + this.RequestComplete(true); + var channelPackage = new ChannelPackage() + { + ChannelId = this.m_id, + RunNow = true, + DataType = ChannelDataType.CompleteOrder, + Message = operationMes, + SourceId = this.m_actor.ID, + TargetId = this.m_targetId, + Route = this.m_targetId.HasValue() + }; + this.m_actor.SendChannelPackage(channelPackage); + this.m_lastOperationTime = DateTime.Now; + } + + /// + /// 继续。 + /// 调用该指令时,接收方会跳出接收,但是通道依然可用,所以接收方需要重新调用 + /// + /// + public override void HoldOn(string operationMes = null) + { + if ((byte)this.m_status > 3) + { + return; + } + var channelPackage = new ChannelPackage() + { + ChannelId = this.m_id, + RunNow = true, + DataType = ChannelDataType.HoldOnOrder, + Message = operationMes, + SourceId = this.m_actor.ID, + TargetId = this.m_targetId, + Route = this.m_targetId.HasValue() + }; + this.m_actor.SendChannelPackage(channelPackage); + this.m_lastOperationTime = DateTime.Now; + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + + + + try + { + this.m_timer.SafeDispose(); + this.RequestDispose(true); + + if ((byte)this.m_status > 3) + { + return; + } + + var channelPackage = new ChannelPackage() + { + ChannelId = this.m_id, + RunNow = true, + DataType = ChannelDataType.HoldOnOrder, + SourceId = this.m_actor.ID, + TargetId = this.m_targetId, + Route = this.m_targetId.HasValue() + }; + this.m_actor.SendChannelPackage(channelPackage); + this.m_lastOperationTime = DateTime.Now; + } + catch + { + } + base.Dispose(disposing); + } + + #endregion 操作 + + /// + /// 获取当前的数据 + /// + public override byte[] GetCurrent() + { + return this.m_currentData; + } + + /// + /// 转向下个元素 + /// + /// + public override bool MoveNext() + { + if (!this.CanMoveNext) + { + return false; + } + if (this.m_dataQueue.TryDequeue(out ChannelPackage channelPackage)) + { + switch (channelPackage.DataType) + { + case ChannelDataType.DataOrder: + { + this.m_currentData = channelPackage.Data.Array; + return true; + } + case ChannelDataType.CompleteOrder: + this.RequestComplete(true); + return false; + + case ChannelDataType.CancelOrder: + this.RequestCancel(true); + return false; + + case ChannelDataType.DisposeOrder: + this.RequestDispose(true); + return false; + + case ChannelDataType.HoldOnOrder: + this.m_status = ChannelStatus.HoldOn; + return false; + + case ChannelDataType.QueueRun: + this.m_canFree = true; + return false; + + case ChannelDataType.QueuePause: + this.m_canFree = false; + return false; + + default: + return false; + } + } + + this.m_moveWaitHandle.Reset(); + if (this.m_moveWaitHandle.WaitOne(this.Timeout)) + { + return this.MoveNext(); + } + else + { + this.m_status = ChannelStatus.Overtime; + return false; + } + } + + /// + /// 写入通道 + /// + /// + /// + /// + public override void Write(byte[] data, int offset, int length) + { + if ((byte)this.m_status > 3) + { + throw new Exception($"通道已{this.m_status}"); + } + + if (!SpinWait.SpinUntil(() => { return this.m_canFree; }, this.Timeout)) + { + throw new TimeoutException(); + } + var channelPackage = new ChannelPackage() + { + ChannelId = this.m_id, + DataType = ChannelDataType.DataOrder, + Data = new ArraySegment(data, offset, length), + SourceId = this.m_actor.ID, + TargetId = this.m_targetId, + Route = this.m_targetId.HasValue() + }; + this.m_actor.SendChannelPackage(channelPackage); + this.m_lastOperationTime = DateTime.Now; + } + + internal void ReceivedData(ChannelPackage channelPackage) + { + this.m_lastOperationTime = DateTime.Now; + if (channelPackage.RunNow) + { + switch (channelPackage.DataType) + { + case ChannelDataType.CompleteOrder: + this.m_lastOperationMes = channelPackage.Message; + this.RequestComplete(false); + break; + + case ChannelDataType.CancelOrder: + this.m_lastOperationMes = channelPackage.Message; + this.RequestCancel(false); + break; + + case ChannelDataType.DisposeOrder: + this.RequestDispose(false); + break; + + case ChannelDataType.HoldOnOrder: + this.m_lastOperationMes = channelPackage.Message; + this.m_status = ChannelStatus.HoldOn; + break; + + case ChannelDataType.QueueRun: + this.m_canFree = true; + return; + + case ChannelDataType.QueuePause: + this.m_canFree = false; + return; + + default: + return; + } + } + this.m_dataQueue.Enqueue(channelPackage); + this.m_moveWaitHandle.Set(); + } + + internal void SetID(int id) + { + this.m_id = id; + } + + internal void SetUsing() + { + this.m_using = true; + } + + private void Clear() + { + try + { + lock (this) + { + this.m_dataQueue.Clear(); + if (this.m_actor.RemoveChannel(this.m_id)) + { + this.m_moveWaitHandle.Set(); + this.m_moveWaitHandle.SafeDispose(); + } + } + } + catch + { + } + } + + private void OnQueueChanged(bool free) + { + if ((byte)this.m_status > 3) + { + return; + } + + try + { + var channelPackage = new ChannelPackage() + { + ChannelId = this.m_id, + RunNow = true, + DataType = free ? ChannelDataType.QueueRun : ChannelDataType.QueuePause, + SourceId = this.m_actor.ID, + TargetId = this.m_targetId, + Route = this.m_targetId.HasValue() + }; + this.m_actor.SendChannelPackage(channelPackage); + this.m_lastOperationTime = DateTime.Now; + } + catch + { + } + } + + private void RequestCancel(bool clear) + { + this.m_status = ChannelStatus.Cancel; + if (clear) + { + this.Clear(); + } + } + + private void RequestComplete(bool clear) + { + this.m_status = ChannelStatus.Completed; + if (clear) + { + this.Clear(); + } + } + + internal void RequestDispose(bool clear) + { + if (clear) + { + this.Clear(); + } + if ((byte)this.m_status > 3) + { + return; + } + this.m_status = ChannelStatus.Disposed; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs.meta new file mode 100644 index 0000000..63173b9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/Channel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9352139fb48e4df44b06dc176274c4eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs new file mode 100644 index 0000000..9e411bc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs @@ -0,0 +1,68 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal enum ChannelDataType : byte + { + DataOrder, + CompleteOrder, + CancelOrder, + DisposeOrder, + HoldOnOrder, + QueueRun, + QueuePause + } + + internal class ChannelPackage : MsgRouterPackage, IQueueData + { + public int ChannelId { get; set; } + public ArraySegment Data { get; set; } + public ChannelDataType DataType { get; set; } + public bool RunNow { get; set; } + int IQueueData.Size => this.Data == null ? 0 : this.Data.Count; + + public int GetLen() + { + if (Data == null) + { + return 1024; + } + return Data.Count + 1024; + } + + public override void PackageBody(ByteBlock byteBlock) + { + base.PackageBody(byteBlock); + byteBlock.Write(RunNow); + byteBlock.Write((byte)DataType); + byteBlock.Write(ChannelId); + byteBlock.WriteBytesPackage(Data.Array, Data.Offset, Data.Count); + } + + public override void UnpackageBody(ByteBlock byteBlock) + { + base.UnpackageBody(byteBlock); + this.RunNow = byteBlock.ReadBoolean(); + this.DataType = (ChannelDataType)byteBlock.ReadByte(); + this.ChannelId = byteBlock.ReadInt32(); + var data = byteBlock.ReadBytesPackage(); + if (data != null) + { + this.Data = new ArraySegment(data); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs.meta new file mode 100644 index 0000000..d2186ee --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad3e89c0502814a46869565265a3c4ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs new file mode 100644 index 0000000..b7db940 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs @@ -0,0 +1,55 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 通道状态 + /// + public enum ChannelStatus : byte + { + /// + /// 默认 + /// + Default = 0, + + /// + /// 继续下移 + /// + Moving = 1, + + /// + /// 超时 + /// + Overtime = 2, + + /// + /// 继续 + /// + HoldOn = 3, + + /// + /// 取消 + /// + Cancel = 4, + + /// + /// 完成 + /// + Completed = 5, + + /// + /// 已释放 + /// + Disposed = 6 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs.meta new file mode 100644 index 0000000..d192711 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/ChannelStatus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 231ac52ebfb7c5b49a6005a508cd6447 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs new file mode 100644 index 0000000..0ac6bc6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs @@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// WaitCreateChannel + /// + internal class WaitCreateChannelPackage : WaitRouterPackage + { + /// + /// 随机ID + /// + public bool Random { get; set; } + + /// + /// 通道ID + /// + public int ChannelID { get; set; } + + public override void PackageBody(ByteBlock byteBlock) + { + base.PackageBody(byteBlock); + byteBlock.Write(Random); + byteBlock.Write(ChannelID); + } + + public override void UnpackageBody(ByteBlock byteBlock) + { + base.UnpackageBody(byteBlock); + this.Random = byteBlock.ReadBoolean(); + this.ChannelID = byteBlock.ReadInt32(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs.meta new file mode 100644 index 0000000..2693e4f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Channel/WaitCreateChannelPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 97bf6c2367ed14d49b387828bc5a28cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common.meta new file mode 100644 index 0000000..cf0f5bb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 10bd53aeb63afc54e8adc43c0da28521 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs new file mode 100644 index 0000000..16d4a1a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs @@ -0,0 +1,120 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 关于具有流速的操作器。 + /// + public abstract class FlowOperator + { + /// + /// 已完成长度 + /// + protected long completedLength; + + /// + /// 进度 + /// + protected float m_progress; + + private long m_speed; + private long m_speedTemp; + + /// + /// 已完成长度 + /// + /// + public long CompletedLength { get => completedLength; } + + /// + /// 由的结果,判断是否已结束操作。 + /// + public virtual bool IsEnd { get => Result.ResultCode != ResultCode.Default; } + + /// + /// 数据源的全部长度。 + /// + public long Length { get; protected set; } + + /// + /// 最大传输速度。 + /// + public int MaxSpeed { get; protected set; } = int.MaxValue; + + /// + /// 元数据 + /// + public Metadata Metadata { get; set; } + + /// + /// 进度 + /// + public float Progress => m_progress; + + /// + /// 执行结果 + /// + public Result Result { get; protected set; } + + /// + /// 超时时间,默认10*1000ms。 + /// + public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(10); + + /// + /// 可取消令箭 + /// + public CancellationToken Token { get; set; } + + /// + /// 从上次获取到此次获得的速度 + /// + /// + public long Speed() + { + m_speed = m_speedTemp; + m_speedTemp = 0; + return m_speed; + } + + internal void SetLength(long len) + { + Length = len; + } + + /// + /// 设置结果状态 + /// + /// + /// + internal Result SetResult(Result result) + { + Result = result; + return result; + } + + /// + /// 添加流速(线程安全) + /// + /// + protected internal virtual void AddFlow(int flow) + { + Interlocked.Add(ref m_speedTemp, flow); + m_progress = (float)((double)Interlocked.Add(ref completedLength, flow) / Length); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs.meta new file mode 100644 index 0000000..a714731 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/FlowOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a90ed99d46d05044aab42f3da41e382b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface.meta new file mode 100644 index 0000000..8644b9e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f5372412a09907e40a4ddd6613c34952 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs new file mode 100644 index 0000000..f820795 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// IDependencyTouchRpc + /// + public interface IDependencyTouchRpc : ITouchRpc, IDependencyObject + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs.meta new file mode 100644 index 0000000..485c38c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/IDependencyTouchRpc.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6de3d2323d240d14e9da1de5acf586ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs new file mode 100644 index 0000000..5c6fcdb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITouchRpc + /// + public interface ITouchRpc : IRpcActor + { + /// + /// Rpc执行角色 + /// + RpcActor RpcActor { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs.meta new file mode 100644 index 0000000..dc70dd9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpc.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1be595c310f2c0f4fbb3f67b36aecd80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs new file mode 100644 index 0000000..24ee4b1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITouchRpcCallContext + /// + public interface ITouchRpcCallContext : ICallContext + { + /// + /// 当不为空时,调用 + /// + /// + public bool TryCancel(); + + /// + /// TouchRpcContext + /// + TouchRpcPackage TouchRpcPackage { get; } + + /// + /// 序列化类型 + /// + public SerializationType SerializationType { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs.meta new file mode 100644 index 0000000..4837f30 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 094d2ac2d1bae1b44a6864a4fefa7f4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs new file mode 100644 index 0000000..65b282d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITouchRpcService + /// + public interface ITouchRpcService : IRpcParser, ITargetRpcActor + { + /// + /// 向对应ID的客户端发送 + /// + /// 目标ID + /// 协议 + /// 数据 + /// 偏移 + /// 长度 + /// 未连接异常 + /// 未找到ID对应的客户端 + /// 其他异常 + void Send(string targetId, short protocol, byte[] buffer, int offset, int length); + + /// + /// 向对应ID的客户端发送 + /// + /// 目标ID + /// 协议 + /// 数据 + /// 偏移 + /// 长度 + /// 未连接异常 + /// 未找到ID对应的客户端 + /// 其他异常 + Task SendAsync(string targetId, short protocol, byte[] buffer, int offset, int length); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs.meta new file mode 100644 index 0000000..b4f723f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/Interface/ITouchRpcService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 73b964e814ec1e841bab6771c55779c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs new file mode 100644 index 0000000..f1a23c0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs @@ -0,0 +1,281 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpcUtility + /// + public partial class TouchRpcUtility + { + /// + /// TouchRpc字符串 + /// + public const string TouchRpc = "TOUCHRPC"; + + /// + /// TouchRpc + /// + public static Protocol TouchRpcProtocol { get; private set; } = new Protocol(TouchRpc); + + /// + /// 传输分包 + /// + public const int TransferPackage = 1024 * 512; + + #region 基本协议,0-99; + + /// + /// 握手 + /// + public const short P_0_Handshake_Request = 0; + + /// + /// 重置ID + /// + public const short P_1_ResetID_Request = -1; + + /// + /// 握手响应 + /// + public const short P_1000_Handshake_Response = -1000; + + /// + /// 重置ID响应 + /// + public const short P_1001_ResetID_Response = -1001; + + /// + /// Ping回应 + /// + public const short P_1002_Ping_Response = -1002; + + /// + /// Ping + /// + public const short P_2_Ping_Request = -2; + + #endregion 基本协议,0-99; + + #region 通道协议,100-199; + + /// + /// 创建一个面向对方的通道 + /// + public const short P_100_CreateChannel_Request = -100; + + /// + /// 创建通道回应 + /// + public const short P_1100_CreateChannel_Response = -1100; + + /// + /// 通道数据 + /// + public const short P_101_ChannelPackage = -101; + + #endregion 通道协议,100-199; + + #region Rpc协议,200-299; + + /// + /// 调用响应 + /// + public const short P_1200_Invoke_Response = -1200; + + ///// + ///// 调用ID客户端响应 + ///// + //public const short P_1201_Invoke2C_Response = -1201; + + /// + /// 调用 + /// + public const short P_200_Invoke_Request = -200; + + ///// + ///// 调用ID客户端 + ///// + //public const short P_201_Invoke2C_Request = -201; + + /// + /// 取消调用 + /// + public const short P_204_CancelInvoke = -204; + + ///// + ///// 取消调用 + ///// + //public const short P_205_CancelInvoke2C = -205; + + #endregion Rpc协议,200-299; + + #region Stream协议 400-499 + + /// + /// 向服务器发送流响应 + /// + public const short P_1400_SendStreamToSocketClient_Response = -1400; + + /// + /// 向服务器发送流 + /// + public const short P_400_SendStreamToSocketClient_Request = -400; + + /// + /// 向客户端发送流 + /// + public const short P_401_SendStreamToClient = -401; + + #endregion Stream协议 400-499 + + #region FileTransfer协议 500-599 + + /// + /// 拉取文件响应 + /// + public const short P_1500_PullFile_Response = -1500; + + /// + /// 开始拉取文件响应 + /// + public const short P_1501_BeginPullFile_Response = -1501; + + /// + /// 推送文件响应 + /// + public const short P_1502_PushFile_Response = -1502; + + ///// + ///// 从客户端拉取文件响应 + ///// + //public const short P_1503_PullFile2C_Response = -1503; + + ///// + ///// 客户端拉取文件转发响应 + ///// + //public const short P_1504_PullFileFC_Response = -1504; + + ///// + ///// 开始从客户端拉取文件响应 + ///// + //public const short P_1505_BeginPullFile2C_Response = -1505; + + ///// + ///// 开始从客户端拉取文件转发响应 + ///// + //public const short P_1506_BeginPullFileFC_Response = -1506; + + ///// + ///// 推送到客户端响应 + ///// + //public const short P_1507_PushFile2C_Response = -1507; + + ///// + ///// 推送到客户端转发响应 + ///// + //public const short P_1508_PushFileFC_Response = -1508; + + /// + /// 拉取文件 + /// + public const short P_500_PullFile_Request = -500; + + /// + /// 开始拉取文件 + /// + public const short P_501_BeginPullFile_Request = -501; + + /// + /// 推送文件 + /// + public const short P_502_PushFile_Request = -502; + + ///// + ///// 从客户端拉取文件 + ///// + //public const short P_503_PullFile2C_Request = -503; + + ///// + ///// 客户端拉取文件转发 + ///// + //public const short P_504_PullFileFC_Request = -504; + + ///// + ///// 开始从客户端拉取文件 + ///// + //public const short P_505_BeginPullFile2C_Request = -505; + + ///// + ///// 开始从客户端拉取文件转发 + ///// + //public const short P_506_BeginPullFileFC_Request = -506; + + ///// + ///// 推送到客户端 + ///// + //public const short P_507_PushFile2C_Request = -507; + + ///// + ///// 推送到客户端转发 + ///// + //public const short P_508_PushFileFC_Request = -508; + + /// + /// 推送文件状态确认 + /// + public const short P_509_PushFileAck_Request = -509; + + ///// + ///// 推送文件到客户端状态确认 + ///// + //public const short P_511_PushFileAck2C_Request = -511; + + /// + /// 拉取小文件请求 + /// + public const short P_517_PullSmallFile_Request = -517; + + /// + /// 拉取确认小文件响应 + /// + public const short P_1517_PullSmallFile_Response = -1517; + + /// + /// 推送小文件请求 + /// + public const short P_518_PushSmallFile_Request = -518; + + /// + /// 推送确认小文件响应 + /// + public const short P_1518_PushSmallFile_Response = -1518; + + #endregion FileTransfer协议 500-599 + + #region Redis 600-699 + + /// + /// Redis + /// + public const short P_600_Redis_Request = -600; + + /// + /// Redis回应 + /// + public const short P_1600_Redis_Response = -1600; + + #endregion Redis 600-699 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs.meta new file mode 100644 index 0000000..63d4e0f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/TouchRpcUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2fb3a3fc08f9b484db3179b5689c307a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs new file mode 100644 index 0000000..130e5bd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal class WaitPingPackage : WaitRouterPackage + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs.meta new file mode 100644 index 0000000..ff4121e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitPingPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c8719208f80a69408dd48fadab0a99f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs new file mode 100644 index 0000000..7e3ba1d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 设置ID + /// + public class WaitSetID : WaitResult + { + /// + /// 重置Id + /// + public WaitSetID() + { + } + + /// + /// 构造函数 + /// + /// + /// + public WaitSetID(string oldID, string newID) + { + OldID = oldID; + NewID = newID; + } + + /// + /// 旧ID + /// + public string OldID { get; set; } + + /// + /// 新ID + /// + public string NewID { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs.meta new file mode 100644 index 0000000..7f005a6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitSetID.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d0d8c36aac65cf64cbcbfe413f374931 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs new file mode 100644 index 0000000..ea4fbcd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 验证消息 + /// + public class WaitVerify : WaitResult + { + /// + /// 令箭 + /// + public string Token { get; set; } + + internal bool Handle { get; set; } + + /// + /// 元数据 + /// + public Metadata Metadata { get; set; } + + /// + /// ID + /// + public string ID { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs.meta new file mode 100644 index 0000000..97274d9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Common/WaitVerify.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b353421a37c67a9448b728eb2458146f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components.meta new file mode 100644 index 0000000..b3cd43a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff26cd729dd921a4ca5e7fa402959b22 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http.meta new file mode 100644 index 0000000..e13662f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80d8219579f42e74691e60bf2167d2a1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs new file mode 100644 index 0000000..286306e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs @@ -0,0 +1,627 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// HttpRpcClient + /// + public partial class HttpTouchRpcClient : HttpClientBase, IHttpTouchRpcClient + { + private readonly ActionMap m_actionMap; + private readonly RpcActor m_rpcActor; + private RpcStore m_rpcStore; + + /// + /// 创建一个HttpTouchRpcClient实例。 + /// + public HttpTouchRpcClient() + { + m_actionMap = new ActionMap(); + m_rpcActor = new RpcActor(false) + { + OutputSend = RpcActorSend, + OnHandshaked = OnRpcActorHandshaked, + OnRouting = OnRpcActorRouting, + OnReceived = OnRpcActorReceived, + OnClose = OnRpcServiceClose, + OnStreamTransfering = OnRpcActorStreamTransfering, + OnStreamTransfered = OnRpcActorStreamTransfered, + OnFileTransfering = OnRpcActorFileTransfering, + OnFileTransfered = OnRpcActorFileTransfered, + GetInvokeMethod = GetInvokeMethod, + Caller = this + }; + } + + /// + /// 服务器映射 + /// + public ActionMap ActionMap { get => m_actionMap; } + + /// + public string ID => m_rpcActor.ID; + + /// + public bool IsHandshaked => m_rpcActor != null && m_rpcActor.IsHandshaked; + + /// + public string RootPath { get => m_rpcActor.RootPath; set => m_rpcActor.RootPath = value; } + + /// + public RpcActor RpcActor => m_rpcActor; + + /// + public RpcStore RpcStore => m_rpcStore; + + /// + public SerializationSelector SerializationSelector => m_rpcActor.SerializationSelector; + + /// + public Func TryCanInvoke { get; set; } + + /// + public bool ChannelExisted(int id) + { + return m_rpcActor.ChannelExisted(id); + } + + /// + public override ITcpClient Connect(int timeout = 5000) + { + lock (SyncRoot) + { + if (IsHandshaked) + { + return this; + } + if (!Online) + { + base.Connect(timeout); + } + HttpRequest httpRequest = new HttpRequest(); + httpRequest.InitHeaders() + .AsMethod(TouchRpcUtility.TouchRpc); + var response = RequestContent(httpRequest); + if (response.StatusCode == "200") + { + this.SwitchProtocolToTouchRpc(); + m_rpcActor.Handshake(Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty), + Config.GetValue(TouchRpcConfigExtensions.DefaultIdProperty), default, + timeout, Config.GetValue(TouchRpcConfigExtensions.MetadataProperty)); + return this; + } + else + { + throw new Exception(response.StatusMessage); + } + } + } + + /// + public Channel CreateChannel() + { + return m_rpcActor.CreateChannel(); + } + + /// + public Channel CreateChannel(int id) + { + return m_rpcActor.CreateChannel(id); + } + + /// + public Channel CreateChannel(string targetId) + { + return m_rpcActor.CreateChannel(targetId); + } + + /// + public Channel CreateChannel(string targetId, int id) + { + return m_rpcActor.CreateChannel(targetId, id); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(targetId, method, invokeOption, parameters); + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(targetId, method, invokeOption, parameters); + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(targetId, method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(targetId, method, invokeOption, parameters); + } + + /// + public bool Ping(int timeout = 5000) + { + return m_rpcActor.Ping(timeout); + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + return m_rpcActor.Ping(targetId, timeout); + } + + /// + public Result PullFile(FileOperator fileOperator) + { + return m_rpcActor.PullFile(fileOperator); + } + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFile(targetId, fileOperator); + } + + /// + public Task PullFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(fileOperator); + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(targetId, fileOperator); + } + + /// + public Result PushFile(FileOperator fileOperator) + { + return m_rpcActor.PushFile(fileOperator); + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFile(targetId, fileOperator); + } + + /// + public Task PushFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(fileOperator); + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(targetId, fileOperator); + } + + /// + public void ResetID(string newId) + { + m_rpcActor.ResetID(newId); + } + + /// + public Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStream(stream, streamOperator, metadata); + } + + /// + public Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStreamAsync(stream, streamOperator, metadata); + } + + /// + public bool TrySubscribeChannel(int id, out Channel channel) + { + return m_rpcActor.TrySubscribeChannel(id, out channel); + } + + /// + protected override void Dispose(bool disposing) + { + m_rpcActor.SafeDispose(); + base.Dispose(disposing); + } + + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (Protocol == TouchRpcUtility.TouchRpcProtocol && byteBlock != null) + { + m_rpcActor.InputReceivedData(byteBlock); + return; + } + base.HandleReceivedData(byteBlock, requestInfo); + } + + /// + protected override void LoadConfig(TouchSocketConfig config) + { + base.LoadConfig(config); + m_rpcActor.Logger = Container.Resolve(); + m_rpcActor.FileController = Container.GetFileResourceController(); + RootPath = Config.GetValue(TouchRpcConfigExtensions.RootPathProperty); + m_rpcActor.SerializationSelector = Config.GetValue(TouchRpcConfigExtensions.SerializationSelectorProperty); + + if (config.GetValue(RpcConfigExtensions.RpcStoreProperty) is RpcStore rpcStore) + { + rpcStore.AddRpcParser(GetType().Name, this); + } + else + { + new RpcStore(config.Container).AddRpcParser(GetType().Name, this); + } + } + + #region 发送 + + /// + public void Send(short protocol, byte[] buffer, int offset, int length) + { + m_rpcActor.Send(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override void Send(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override void Send(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + public Task SendAsync(short protocol, byte[] buffer, int offset, int length) + { + return m_rpcActor.SendAsync(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override Task SendAsync(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override Task SendAsync(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + #endregion 发送 + + /// + protected override void OnDisconnected(DisconnectEventArgs e) + { + m_rpcActor?.Close(e.Message); + base.OnDisconnected(e); + } + + #region 小文件 + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); + } + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(targetId, path, metadata, timeout, token); + } + + /// + public PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(targetId, path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(path, metadata, timeout, token); + } + + #endregion 小文件 + + #region 内部委托绑定 + + private MethodInstance GetInvokeMethod(string arg) + { + return ActionMap.GetMethodInstance(arg); + } + + private void OnRpcActorFileTransfered(RpcActor actor, FileTransferStatusEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfered), this, e)) + { + return; + } + OnFileTransfered(e); + } + + private void OnRpcActorFileTransfering(RpcActor actor, FileOperationEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfering), this, e)) + { + return; + } + OnFileTransfering(e); + } + + private void OnRpcActorHandshaked(RpcActor actor, VerifyOptionEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnHandshaked), this, e)) + { + return; + } + OnHandshaked(e); + } + + private void OnRpcActorReceived(RpcActor actor, short protocol, ByteBlock byteBlock) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnReceivedProtocolData), this, new ProtocolDataEventArgs(protocol, byteBlock))) + { + return; + } + + OnReceived(protocol, byteBlock); + } + + private void OnRpcActorRouting(RpcActor actor, PackageRouterEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnRouting), this, e)) + { + return; + } + OnRouting(e); + } + + private void OnRpcActorStreamTransfered(RpcActor actor, StreamStatusEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfered), this, e)) + { + return; + } + OnStreamTransfered(e); + } + + private void OnRpcActorStreamTransfering(RpcActor actor, StreamOperationEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfering), this, e)) + { + return; + } + OnStreamTransfering(e); + } + + private void OnRpcServiceClose(RpcActor actor, string arg2) + { + Close(arg2); + } + + private void RpcActorSend(RpcActor actor, ArraySegment[] transferBytes) + { + base.Send(transferBytes); + } + + #endregion 内部委托绑定 + + #region 事件触发 + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + protected virtual void OnFileTransfered(FileTransferStatusEventArgs e) + { + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + protected virtual void OnFileTransfering(FileOperationEventArgs e) + { + } + + /// + /// 在完成握手连接时 + /// + /// + protected virtual void OnHandshaked(MsgEventArgs e) + { + } + + /// + /// 收到数据。 + /// + /// + /// + protected virtual void OnReceived(short protocol, ByteBlock byteBlock) + { + } + + /// + /// 当需要转发路由包时 + /// + /// + protected virtual void OnRouting(PackageRouterEventArgs e) + { + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + /// + protected virtual void OnStreamTransfered(StreamStatusEventArgs e) + { + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + protected virtual void OnStreamTransfering(StreamOperationEventArgs e) + { + } + + #endregion 事件触发 + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + ActionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcStore) + { + m_rpcActor.RpcStore = rpcStore; + m_rpcStore = rpcStore; + } + + #endregion RPC解析器 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs.meta new file mode 100644 index 0000000..9802233 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9eee60ab4908a3f479e614dd95c71e16 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs new file mode 100644 index 0000000..9d31cab --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs @@ -0,0 +1,602 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Resources; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Http Rpc解释器 + /// + public class HttpTouchRpcService : HttpTouchRpcService + { + } + + /// + /// HttpRpcParser泛型类型 + /// + /// + public partial class HttpTouchRpcService : HttpService, IHttpTouchRpcService where TClient : HttpTouchRpcSocketClient + { + /// + /// 创建一个HttpTouchRpcService实例。 + /// + public HttpTouchRpcService() + { + m_actionMap = new ActionMap(); + m_rpcActorGroup = new RpcActorGroup + { + OnClose = OnRpcServiceClose, + OnRouting = OnRpcServiceRouting, + GetInvokeMethod = GetInvokeMethod, + OnFileTransfered = OnRpcServiceFileTransfered, + OnFileTransfering = OnRpcServiceFileTransfering, + OnFindRpcActor = OnRpcServiceFindRpcActor, + OnHandshaked = OnRpcServiceHandshaked, + OnHandshaking = OnRpcServiceHandshaking, + OnReceived = OnRpcServiceReceived, + OnStreamTransfered = OnRpcServiceStreamTransfered, + OnStreamTransfering = OnRpcServiceStreamTransfering, + OutputSend = RpcServiceOutputSend + }; + } + + #region 字段 + + private readonly ActionMap m_actionMap; + private readonly RpcActorGroup m_rpcActorGroup; + private RpcStore m_rpcStore; + + #endregion 字段 + + /// + /// 方法映射表 + /// + public ActionMap ActionMap { get => m_actionMap; } + + /// + public RpcStore RpcStore => m_rpcStore; + + /// + /// 连接令箭 + /// + public string VerifyToken => Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty); + + /// + protected override void LoadConfig(TouchSocketConfig config) + { + base.LoadConfig(config); + m_rpcActorGroup.Config = config; + + if (config.GetValue(RpcConfigExtensions.RpcStoreProperty) is RpcStore rpcStore) + { + rpcStore.AddRpcParser(GetType().Name, this); + } + else + { + new RpcStore(config.Container).AddRpcParser(GetType().Name, this); + } + } + + /// + protected override void OnConnecting(TClient socketClient, OperationEventArgs e) + { + socketClient.m_internalOnRpcActorInit = PrivateOnRpcActorInit; + base.OnConnecting(socketClient, e); + } + + #region 事件 + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + protected virtual void OnFileTransfered(TClient client, FileTransferStatusEventArgs e) + { + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + protected virtual void OnFileTransfering(TClient client, FileOperationEventArgs e) + { + } + + /// + /// 在完成握手连接时 + /// + /// + /// + protected virtual void OnHandshaked(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 在验证Token时 + /// + /// 客户端 + /// 参数 + protected virtual void OnHandshaking(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 收到协议数据 + /// + /// + /// + /// + protected virtual void OnReceived(TClient client, short protocol, ByteBlock byteBlock) + { + } + + /// + /// 在需要转发路由包时。 + /// + /// + /// + protected virtual void OnRouting(TClient client, PackageRouterEventArgs e) + { + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。覆盖父类方法将不会触发事件和插件。 + /// + /// + /// + protected virtual void OnStreamTransfered(TClient client, StreamStatusEventArgs e) + { + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。覆盖父类方法将不会触发事件和插件。 + /// + /// + /// + protected virtual void OnStreamTransfering(TClient client, StreamOperationEventArgs e) + { + } + + private void PrivateOnRpcActorInit(HttpTouchRpcSocketClient client) + { + client.SetRpcActor(m_rpcActorGroup.CreateRpcActor(client)); + } + + #endregion 事件 + + #region 小文件 + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullSmallFile(path, metadata, timeout, token); + } + else + { + return new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullSmallFileAsync(path, metadata, timeout, token); + } + else + { + return Task.FromResult(new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId))); + } + } + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + else + { + return new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); + } + else + { + return Task.FromResult(new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId))); + } + } + + #endregion 小文件 + + #region Rpc + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + client.Invoke(targetId, method, invokeOption, ref parameters, types); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.Invoke(targetId, method, invokeOption, ref parameters, types); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + client.Invoke(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.Invoke(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.InvokeAsync(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.InvokeAsync(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.Ping(timeout); + } + return false; + } + + #endregion Rpc + + #region 通道 + + /// + public Channel CreateChannel(string targetId) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.CreateChannel(); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Channel CreateChannel(string targetId, int id) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.CreateChannel(id); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + #endregion 通道 + + #region File + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullFile(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullFileAsync(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushFile(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushFileAsync(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + #endregion File + + #region 内部委托绑定 + + private MethodInstance GetInvokeMethod(string arg) + { + return m_actionMap.GetMethodInstance(arg); + } + + private void OnRpcServiceClose(RpcActor actor, string arg2) + { + TClient client = (TClient)actor.Caller; + client.Close(arg2); + } + + private void OnRpcServiceFileTransfered(RpcActor actor, FileTransferStatusEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfered), client, e)) + { + return; + } + OnFileTransfered(client, e); + } + + private void OnRpcServiceFileTransfering(RpcActor actor, FileOperationEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfering), client, e)) + { + return; + } + OnFileTransfering(client, e); + } + + private RpcActor OnRpcServiceFindRpcActor(string arg) + { + if (TryGetSocketClient(arg, out TClient client)) + { + return client.RpcActor; + } + return null; + } + + private void OnRpcServiceHandshaked(RpcActor actor, VerifyOptionEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnHandshaked), client, e)) + { + return; + } + OnHandshaked(client, e); + } + + private void OnRpcServiceHandshaking(RpcActor actor, VerifyOptionEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (e.Token == VerifyToken) + { + e.IsPermitOperation = true; + } + else + { + e.Message = "Token不受理"; + } + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnHandshaking), client, e)) + { + return; + } + OnHandshaking(client, e); + } + + + private void OnRpcServiceReceived(RpcActor actor, short protocol, ByteBlock byteBlock) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnReceivedProtocolData), client, new ProtocolDataEventArgs(protocol, byteBlock))) + { + return; + } + + OnReceived(client, protocol, byteBlock); + } + + private void OnRpcServiceRouting(RpcActor actor, PackageRouterEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnRouting), client, e)) + { + return; + } + OnRouting(client, e); + } + + private void OnRpcServiceStreamTransfered(RpcActor actor, StreamStatusEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfered), client, e)) + { + return; + } + OnStreamTransfered(client, e); + } + + private void OnRpcServiceStreamTransfering(RpcActor actor, StreamOperationEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfering), client, e)) + { + return; + } + OnStreamTransfering(client, e); + } + + private void RpcServiceOutputSend(RpcActor actor, ArraySegment[] arg3) + { + TClient client = (TClient)actor.Caller; + client.RpcActorSend(arg3); + } + + #endregion 内部委托绑定 + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + ActionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcStore) + { + m_rpcActorGroup.RpcStore = rpcStore; + m_rpcStore = rpcStore; + } + + #endregion RPC解析器 + + #region 发送 + + /// + public void Send(string id, short protocol, byte[] buffer, int offset, int length) + { + if (SocketClients.TryGetSocketClient(id, out TClient client)) + { + client.Send(protocol, buffer, offset, length); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(id)); + } + } + + /// + public Task SendAsync(string id, short protocol, byte[] buffer, int offset, int length) + { + if (SocketClients.TryGetSocketClient(id, out TClient client)) + { + return client.SendAsync(protocol, buffer, offset, length); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(id)); + } + } + + #endregion 发送 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs.meta new file mode 100644 index 0000000..c20d87a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e71c5e66b43363843b7783e9160f8f08 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs new file mode 100644 index 0000000..ad5b8d9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs @@ -0,0 +1,429 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Http服务器辅助类 + /// + public partial class HttpTouchRpcSocketClient : HttpSocketClient, IHttpTouchRpcSocketClient + { + internal Action m_internalOnRpcActorInit; + private RpcActor m_rpcActor; + + /// + public bool IsHandshaked => m_rpcActor == null ? false : m_rpcActor.IsHandshaked; + + /// + public string RootPath { get => m_rpcActor.RootPath; set => m_rpcActor.RootPath = value; } + + /// + public RpcActor RpcActor => m_rpcActor; + + /// + public SerializationSelector SerializationSelector => m_rpcActor.SerializationSelector; + + /// + public Func TryCanInvoke { get; set; } + + /// + /// 连接令箭 + /// + public string VerifyToken => Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty); + + /// + public bool ChannelExisted(int id) + { + return m_rpcActor.ChannelExisted(id); + } + + /// + public Channel CreateChannel() + { + return m_rpcActor.CreateChannel(); + } + + /// + public Channel CreateChannel(int id) + { + return m_rpcActor.CreateChannel(id); + } + + /// + public Channel CreateChannel(string targetId) + { + return m_rpcActor.CreateChannel(targetId); + } + + /// + public Channel CreateChannel(string targetId, int id) + { + return m_rpcActor.CreateChannel(targetId, id); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(id, method, invokeOption, parameters); + } + + /// + public T Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(id, method, invokeOption, parameters); + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + return m_rpcActor.Ping(targetId, timeout); + } + + /// + public bool Ping(int timeout = 5000) + { + return m_rpcActor.Ping(timeout); + } + + /// + public Result PullFile(FileOperator fileOperator) + { + return m_rpcActor.PullFile(fileOperator); + } + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFile(targetId, fileOperator); + } + + /// + public Task PullFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(fileOperator); + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(targetId, fileOperator); + } + + /// + public Result PushFile(FileOperator fileOperator) + { + return m_rpcActor.PushFile(fileOperator); + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFile(targetId, fileOperator); + } + + /// + public Task PushFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(fileOperator); + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(targetId, fileOperator); + } + + /// + public override void ResetID(string newID) + { + m_rpcActor.ResetID(newID); + DirectResetID(newID); + } + + /// + public Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStream(stream, streamOperator, metadata); + } + + /// + public Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStreamAsync(stream, streamOperator, metadata); + } + + /// + public bool TrySubscribeChannel(int id, out Channel channel) + { + return m_rpcActor.TrySubscribeChannel(id, out channel); + } + + internal void RpcActorSend(ArraySegment[] transferBytes) + { + base.Send(transferBytes); + } + + internal void SetRpcActor(RpcActor rpcActor) + { + m_rpcActor = rpcActor; + m_rpcActor.OnResetID = ThisOnResetID; + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + m_rpcActor.SafeDispose(); + base.Dispose(disposing); + } + + /// + /// + /// + /// + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (Protocol == TouchRpcUtility.TouchRpcProtocol && byteBlock != null) + { + m_rpcActor.InputReceivedData(byteBlock); + } + else + { + base.HandleReceivedData(byteBlock, requestInfo); + } + } + + /// + /// + /// + /// + protected override void OnDisconnected(DisconnectEventArgs e) + { + m_rpcActor?.Close(e.Message); + base.OnDisconnected(e); + } + + /// + /// + /// + /// + protected override void OnReceivedHttpRequest(HttpRequest request) + { + if (request.Method == TouchRpcUtility.TouchRpc) + { + request.SafeDispose(); + InitRpcActor(); + this.DefaultSend(new HttpResponse().SetStatus().BuildAsBytes()); + return; + } + base.OnReceivedHttpRequest(request); + } + + private void InitRpcActor() + { + this.SwitchProtocolToTouchRpc(); + m_internalOnRpcActorInit?.Invoke(this); + m_rpcActor.ID = ID; + } + + private void ThisOnResetID(bool first, RpcActor rpcActor, WaitSetID waitSetID) + { + DirectResetID(waitSetID.NewID); + } + + #region 发送 + + /// + public void Send(short protocol, byte[] buffer, int offset, int length) + { + m_rpcActor.Send(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override void Send(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override void Send(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// + /// + /// + /// + /// + /// + public Task SendAsync(short protocol, byte[] buffer, int offset, int length) + { + return m_rpcActor.SendAsync(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override Task SendAsync(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override Task SendAsync(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + #endregion 发送 + + #region 小文件 + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(targetId, path, metadata, timeout, token); + } + + /// + public PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(targetId, path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(path, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); + } + + #endregion 小文件 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs.meta new file mode 100644 index 0000000..3d0d8ee --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/HttpTouchRpcSocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17287e67e6015a643b77797b4025262d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface.meta new file mode 100644 index 0000000..17f048b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6225a23f137153543a8ecdc78ff6d4a9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs new file mode 100644 index 0000000..3745d8d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Http; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// IHttpRpcClient + /// + public interface IHttpTouchRpcClient : IHttpClient, IHttpRpcClientBase, IRpcParser + { + } + + /// + /// IHttpTouchRpcSocketClient + /// + public interface IHttpTouchRpcSocketClient : IHttpRpcClientBase + { + } + + /// + /// IHttpRpcClientBase + /// + public interface IHttpRpcClientBase : IHttpClientBase, IDependencyTouchRpc + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs.meta new file mode 100644 index 0000000..e2865c3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 09597d83b73ee374c882812c66cf982c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs new file mode 100644 index 0000000..6232fb2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Http; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// IHttpTouchRpcService + /// + public interface IHttpTouchRpcService : IHttpService, ITouchRpcService + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs.meta new file mode 100644 index 0000000..73c538d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Http/Interface/IHttpTouchRpcService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9e6bca7c7dee7dd4fa1406b051cb61a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs new file mode 100644 index 0000000..739847d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs @@ -0,0 +1,128 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RpcActorGroup + /// + public partial class RpcActorGroup + { + #region 委托 + + /// + /// 获取调用函数 + /// + public Func GetInvokeMethod { get; set; } + + /// + /// 请求关闭 + /// + public Action OnClose { get; set; } + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + public Action OnFileTransfered { get; set; } + + /// + /// 在文件传输即将进行时触发。 + /// + public Action OnFileTransfering { get; set; } + + /// + /// 查找其他RpcActor + /// + public Func OnFindRpcActor { get; set; } + + /// + /// 在完成握手连接时 + /// + public Action OnHandshaked { get; set; } + + /// + /// 握手 + /// + public Action OnHandshaking { get; set; } + + /// + /// 接收到数据 + /// + public Action OnReceived { get; set; } + + /// + /// 需要路由 + /// + public Action OnRouting { get; set; } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + public Action OnStreamTransfered { get; set; } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + public Action OnStreamTransfering { get; set; } + + /// + /// 发送数据接口 + /// + public Action[]> OutputSend { get; set; } + + #endregion 委托 + + /// + /// 配置 + /// + public TouchSocketConfig Config { get; set; } + + /// + /// RpcStore + /// + public RpcStore RpcStore { get; set; } + + /// + /// 创建RpcActor + /// + /// + /// + public RpcActor CreateRpcActor(object caller) + { + RpcActor rpcActor = new RpcActor(true) + { + FileController = this.Config.Container.GetFileResourceController(), + Logger = Config.Container.Resolve(), + Caller = caller, + RpcStore = RpcStore, + OnHandshaking = OnHandshaking, + GetInvokeMethod = GetInvokeMethod, + OnHandshaked = OnHandshaked, + OutputSend = OutputSend, + OnReceived = OnReceived, + OnClose = OnClose, + OnFindRpcActor = OnFindRpcActor, + OnRouting = OnRouting, + OnStreamTransfering = OnStreamTransfering, + OnStreamTransfered = OnStreamTransfered, + OnFileTransfering = OnFileTransfering, + OnFileTransfered = OnFileTransfered, + RootPath = Config.GetValue(TouchRpcConfigExtensions.RootPathProperty), + SerializationSelector = Config.GetValue(TouchRpcConfigExtensions.SerializationSelectorProperty) + }; + return rpcActor; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs.meta new file mode 100644 index 0000000..26c6268 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/RpcActorGroup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bde0efe9427fdd449dbd01b32c2a519 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp.meta new file mode 100644 index 0000000..da018cb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e4d2e09d140b0db4ebe2af41614e57ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface.meta new file mode 100644 index 0000000..186f25e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 30d7851dd9fb5644aa4f57245ef492bc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs new file mode 100644 index 0000000..5c751b6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITcpRpcClient + /// + public interface ITcpTouchRpcClient : ITcpRpcClientBase, ITcpClient, IRpcParser + { + } + + /// + /// ITcpTouchRpcSocketClient + /// + public interface ITcpTouchRpcSocketClient : ITcpRpcClientBase + { + } + + /// + /// ITcpRpcClientBase + /// + public interface ITcpRpcClientBase : ITcpClientBase, IDependencyTouchRpc + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs.meta new file mode 100644 index 0000000..ef0cf61 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efb9df102f62e45479650c0965344792 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs new file mode 100644 index 0000000..ca15128 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITcpTouchRpcService + /// + public interface ITcpTouchRpcService : ITcpService, ITouchRpcService + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs.meta new file mode 100644 index 0000000..80c1fa8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/Interface/ITcpTouchRpcService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ddaf7a34925f9d047b267b7a6210f5da +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs new file mode 100644 index 0000000..e7589be --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs @@ -0,0 +1,625 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TcpTouchRpcClient + /// + public partial class TcpTouchRpcClient : TcpClientBase, ITcpTouchRpcClient + { + private readonly ActionMap m_actionMap; + + private readonly RpcActor m_rpcActor; + + private RpcStore m_rpcStore; + + /// + /// 创建一个TcpTouchRpcClient实例。 + /// + public TcpTouchRpcClient() + { + m_actionMap = new ActionMap(); + m_rpcActor = new RpcActor(false) + { + OutputSend = RpcActorSend, + OnRouting = OnRpcActorRouting, + OnHandshaked = OnRpcActorHandshaked, + OnReceived = OnRpcActorReceived, + OnClose = OnRpcServiceClose, + GetInvokeMethod = GetInvokeMethod, + OnStreamTransfering = OnRpcActorStreamTransfering, + OnStreamTransfered = OnRpcActorStreamTransfered, + OnFileTransfering = OnRpcActorFileTransfering, + OnFileTransfered = OnRpcActorFileTransfered, + Caller = this + }; + } + + /// + /// 方法映射表 + /// + public ActionMap ActionMap { get => m_actionMap; } + + /// + public string ID => m_rpcActor.ID; + + /// + public bool IsHandshaked => m_rpcActor == null ? false : m_rpcActor.IsHandshaked; + + /// + public string RootPath { get => m_rpcActor.RootPath; set => m_rpcActor.RootPath = value; } + + /// + public RpcActor RpcActor => m_rpcActor; + + /// + public RpcStore RpcStore => m_rpcStore; + + /// + public SerializationSelector SerializationSelector => m_rpcActor.SerializationSelector; + + /// + public Func TryCanInvoke { get; set; } + + /// + public bool ChannelExisted(int id) + { + return m_rpcActor.ChannelExisted(id); + } + + /// + /// 建立Tcp连接,并且执行握手。 + /// + /// + /// + public override ITcpClient Connect(int timeout = 5000) + { + lock (SyncRoot) + { + if (IsHandshaked) + { + return this; + } + if (!Online) + { + base.Connect(timeout); + } + + m_rpcActor.Handshake(Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty), + Config.GetValue(TouchRpcConfigExtensions.DefaultIdProperty), default, + timeout, Config.GetValue(TouchRpcConfigExtensions.MetadataProperty)); + return this; + } + } + + /// + public Channel CreateChannel() + { + return m_rpcActor.CreateChannel(); + } + + /// + public Channel CreateChannel(int id) + { + return m_rpcActor.CreateChannel(id); + } + + /// + public Channel CreateChannel(string targetId) + { + return m_rpcActor.CreateChannel(targetId); + } + + /// + public Channel CreateChannel(string targetId, int id) + { + return m_rpcActor.CreateChannel(targetId, id); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(id, method, invokeOption, parameters); + } + + /// + public T Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(id, method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); + } + + /// + public bool Ping(int timeout = 5000) + { + return m_rpcActor.Ping(timeout); + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + return m_rpcActor.Ping(targetId, timeout); + } + + /// + public Result PullFile(FileOperator fileOperator) + { + return m_rpcActor.PullFile(fileOperator); + } + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFile(targetId, fileOperator); + } + + /// + public Task PullFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(fileOperator); + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(targetId, fileOperator); + } + + /// + public Result PushFile(FileOperator fileOperator) + { + return m_rpcActor.PushFile(fileOperator); + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFile(targetId, fileOperator); + } + + /// + public Task PushFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(fileOperator); + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(targetId, fileOperator); + } + + /// + public void ResetID(string id) + { + m_rpcActor.ResetID(id); + } + + #region 发送 + + /// + public void Send(short protocol, byte[] buffer, int offset, int length) + { + m_rpcActor.Send(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override void Send(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override void Send(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + public Task SendAsync(short protocol, byte[] buffer, int offset, int length) + { + return m_rpcActor.SendAsync(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override Task SendAsync(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override Task SendAsync(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + #endregion 发送 + + /// + public Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStream(stream, streamOperator, metadata); + } + + /// + public Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStreamAsync(stream, streamOperator, metadata); + } + + /// + public bool TrySubscribeChannel(int id, out Channel channel) + { + return m_rpcActor.TrySubscribeChannel(id, out channel); + } + + #region 小文件 + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(targetId, path, metadata, timeout, token); + } + + /// + public PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(targetId, path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(path, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); + } + + #endregion 小文件 + + /// + protected override void Dispose(bool disposing) + { + m_rpcActor.SafeDispose(); + base.Dispose(disposing); + } + + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + m_rpcActor.InputReceivedData(byteBlock); + } + + /// + protected override void LoadConfig(TouchSocketConfig config) + { + base.LoadConfig(config); + RootPath = config.GetValue(TouchRpcConfigExtensions.RootPathProperty); + m_rpcActor.SerializationSelector = config.GetValue(TouchRpcConfigExtensions.SerializationSelectorProperty); + m_rpcActor.Logger = Container.Resolve(); + m_rpcActor.FileController = Container.GetFileResourceController(); + + if (config.GetValue(RpcConfigExtensions.RpcStoreProperty) is RpcStore rpcStore) + { + rpcStore.AddRpcParser(GetType().Name, this); + } + else + { + new RpcStore(config.Container).AddRpcParser(GetType().Name, this); + } + + this.SwitchProtocolToTouchRpc(); + } + + /// + protected override void OnConnecting(ConnectingEventArgs e) + { + SetDataHandlingAdapter(new FixedHeaderPackageAdapter()); + base.OnConnecting(e); + } + + /// + protected override void OnDisconnected(DisconnectEventArgs e) + { + m_rpcActor.Close(e.Message); + base.OnDisconnected(e); + } + + #region 内部委托绑定 + + private MethodInstance GetInvokeMethod(string arg) + { + return m_actionMap.GetMethodInstance(arg); + } + + private void OnRpcActorFileTransfered(RpcActor actor, FileTransferStatusEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfered), this, e)) + { + return; + } + OnFileTransfered(e); + } + + private void OnRpcActorFileTransfering(RpcActor actor, FileOperationEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfering), this, e)) + { + return; + } + OnFileTransfering(e); + } + + private void OnRpcActorHandshaked(RpcActor actor, VerifyOptionEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnHandshaked), this, e)) + { + return; + } + OnHandshaked(e); + } + + private void OnRpcActorReceived(RpcActor actor, short protocol, ByteBlock byteBlock) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnReceivedProtocolData), this, new ProtocolDataEventArgs(protocol, byteBlock))) + { + return; + } + + OnReceived(protocol, byteBlock); + } + + private void OnRpcActorRouting(RpcActor actor, PackageRouterEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnRouting), this, e)) + { + return; + } + OnRouting(e); + } + + private void OnRpcActorStreamTransfered(RpcActor actor, StreamStatusEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfered), this, e)) + { + return; + } + OnStreamTransfered(e); + } + + private void OnRpcActorStreamTransfering(RpcActor actor, StreamOperationEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfering), this, e)) + { + return; + } + OnStreamTransfering(e); + } + + private void OnRpcServiceClose(RpcActor actor, string arg2) + { + Close(arg2); + } + + private void RpcActorSend(RpcActor actor, ArraySegment[] transferBytes) + { + base.Send(transferBytes); + } + + #endregion 内部委托绑定 + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + ActionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcStore) + { + m_rpcActor.RpcStore = rpcStore; + m_rpcStore = rpcStore; + } + + #endregion RPC解析器 + + #region 事件触发 + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + protected virtual void OnFileTransfered(FileTransferStatusEventArgs e) + { + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + protected virtual void OnFileTransfering(FileOperationEventArgs e) + { + } + + /// + /// 在完成握手连接时 + /// + /// + protected virtual void OnHandshaked(VerifyOptionEventArgs e) + { + } + + /// + /// 收到数据。 + /// + /// + /// + protected virtual void OnReceived(short protocol, ByteBlock byteBlock) + { + } + + /// + /// 当需要转发路由包时 + /// + /// + protected virtual void OnRouting(PackageRouterEventArgs e) + { + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + /// + protected virtual void OnStreamTransfered(StreamStatusEventArgs e) + { + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + protected virtual void OnStreamTransfering(StreamOperationEventArgs e) + { + } + + #endregion 事件触发 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs.meta new file mode 100644 index 0000000..8a1a019 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33f251054d912d948b0c31a45caa9f91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs new file mode 100644 index 0000000..e563496 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs @@ -0,0 +1,598 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TcpTouchRpcService + /// + public class TcpTouchRpcService : TcpTouchRpcService + { + } + + /// + /// TcpTouchRpcService泛型类型 + /// + /// + public partial class TcpTouchRpcService : TcpService, ITcpTouchRpcService where TClient : TcpTouchRpcSocketClient + { + /// + /// 创建一个TcpTouchRpcService实例。 + /// + public TcpTouchRpcService() + { + m_actionMap = new ActionMap(); + m_rpcActorGroup = new RpcActorGroup + { + OnClose = OnRpcServiceClose, + OnRouting = OnRpcServiceRouting, + GetInvokeMethod = GetInvokeMethod, + OnFileTransfered = OnRpcServiceFileTransfered, + OnFileTransfering = OnRpcServiceFileTransfering, + OnFindRpcActor = OnRpcServiceFindRpcActor, + OnHandshaked = OnRpcServiceHandshaked, + OnHandshaking = OnRpcServiceHandshaking, + OnReceived = OnRpcServiceReceived, + OnStreamTransfered = OnRpcServiceStreamTransfered, + OnStreamTransfering = OnRpcServiceStreamTransfering, + OutputSend = RpcServiceOutputSend + }; + } + + #region 字段 + + private readonly ActionMap m_actionMap; + private readonly RpcActorGroup m_rpcActorGroup; + private RpcStore m_rpcStore; + + #endregion 字段 + + /// + /// 方法映射表 + /// + public ActionMap ActionMap { get => m_actionMap; } + + /// + public RpcStore RpcStore => m_rpcStore; + + /// + /// 连接令箭 + /// + public string VerifyToken => Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty); + + /// + protected override void LoadConfig(TouchSocketConfig config) + { + base.LoadConfig(config); + m_rpcActorGroup.Config = config; + if (config.GetValue(RpcConfigExtensions.RpcStoreProperty) is RpcStore rpcStore) + { + rpcStore.AddRpcParser(GetType().Name, this); + } + else + { + new RpcStore(config.Container).AddRpcParser(GetType().Name, this); + } + } + + /// + /// 客户端请求连接 + /// + /// + /// + protected override void OnConnecting(TClient socketClient, OperationEventArgs e) + { + socketClient.SetRpcActor(m_rpcActorGroup.CreateRpcActor(socketClient)); + base.OnConnecting(socketClient, e); + } + + #region 事件 + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + protected virtual void OnFileTransfered(TClient client, FileTransferStatusEventArgs e) + { + } + + /// + /// 在需要转发路由包时。 + /// + /// + /// + protected virtual void OnRouting(TClient client, PackageRouterEventArgs e) + { + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + protected virtual void OnFileTransfering(TClient client, FileOperationEventArgs e) + { + } + + /// + /// 在完成握手连接时 + /// + /// + /// + protected virtual void OnHandshaked(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 在验证Token时 + /// + /// 客户端 + /// 参数 + protected virtual void OnHandshaking(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 收到协议数据 + /// + /// + /// + /// + protected virtual void OnReceived(TClient client, short protocol, ByteBlock byteBlock) + { + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。覆盖父类方法将不会触发事件和插件。 + /// + /// + /// + protected virtual void OnStreamTransfered(TClient client, StreamStatusEventArgs e) + { + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。覆盖父类方法将不会触发事件和插件。 + /// + /// + /// + protected virtual void OnStreamTransfering(TClient client, StreamOperationEventArgs e) + { + } + + #endregion 事件 + + #region 小文件 + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullSmallFile(path, metadata, timeout, token); + } + else + { + return new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullSmallFileAsync(path, metadata, timeout, token); + } + else + { + return Task.FromResult(new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId))); + } + } + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + else + { + return new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); + } + else + { + return Task.FromResult(new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId))); + } + } + + #endregion 小文件 + + #region Rpc + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + client.Invoke(targetId, method, invokeOption, ref parameters, types); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.Invoke(targetId, method, invokeOption, ref parameters, types); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + client.Invoke(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.Invoke(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.InvokeAsync(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.InvokeAsync(method, invokeOption, parameters); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.Ping(timeout); + } + return false; + } + + #endregion Rpc + + #region 通道 + + /// + public Channel CreateChannel(string targetId) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.CreateChannel(); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Channel CreateChannel(string targetId, int id) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.CreateChannel(id); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + #endregion 通道 + + #region File + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullFile(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PullFileAsync(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushFile(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + if (TryGetSocketClient(targetId, out TClient client)) + { + return client.PushFileAsync(fileOperator); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + #endregion File + + #region 内部委托绑定 + + private MethodInstance GetInvokeMethod(string arg) + { + return m_actionMap.GetMethodInstance(arg); + } + + private void OnRpcServiceClose(RpcActor actor, string arg2) + { + TClient client = (TClient)actor.Caller; + client.Close(arg2); + } + + private void OnRpcServiceRouting(RpcActor actor, PackageRouterEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnRouting), client, e)) + { + return; + } + OnRouting(client, e); + } + + private void OnRpcServiceFileTransfered(RpcActor actor, FileTransferStatusEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfered), client, e)) + { + return; + } + OnFileTransfered(client, e); + } + + private void OnRpcServiceFileTransfering(RpcActor actor, FileOperationEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfering), client, e)) + { + return; + } + OnFileTransfering(client, e); + } + + private RpcActor OnRpcServiceFindRpcActor(string arg) + { + if (TryGetSocketClient(arg, out TClient client)) + { + return client.RpcActor; + } + return null; + } + + private void OnRpcServiceHandshaked(RpcActor actor, VerifyOptionEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnHandshaked), client, e)) + { + return; + } + OnHandshaked(client, e); + } + + private void OnRpcServiceHandshaking(RpcActor actor, VerifyOptionEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (e.Token == VerifyToken) + { + e.IsPermitOperation = true; + } + else + { + e.Message = "Token不受理"; + } + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnHandshaking), client, e)) + { + return; + } + OnHandshaking(client, e); + } + + private void OnRpcServiceReceived(RpcActor actor, short protocol, ByteBlock byteBlock) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnReceivedProtocolData), client, new ProtocolDataEventArgs(protocol, byteBlock))) + { + return; + } + + OnReceived(client, protocol, byteBlock); + } + + private void OnRpcServiceStreamTransfered(RpcActor actor, StreamStatusEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfered), client, e)) + { + return; + } + OnStreamTransfered(client, e); + } + + private void OnRpcServiceStreamTransfering(RpcActor actor, StreamOperationEventArgs e) + { + TClient client = (TClient)actor.Caller; + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfering), client, e)) + { + return; + } + OnStreamTransfering(client, e); + } + + private void RpcServiceOutputSend(RpcActor actor, ArraySegment[] arg3) + { + TClient client = (TClient)actor.Caller; + client.RpcActorSend(arg3); + } + + #endregion 内部委托绑定 + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + ActionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcStore) + { + m_rpcActorGroup.RpcStore = rpcStore; + m_rpcStore = rpcStore; + } + + #endregion RPC解析器 + + #region 发送 + + /// + public void Send(string targetId, short protocol, byte[] buffer, int offset, int length) + { + if (SocketClients.TryGetSocketClient(targetId, out TClient client)) + { + client.Send(protocol, buffer, offset, length); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + /// + public Task SendAsync(string targetId, short protocol, byte[] buffer, int offset, int length) + { + if (SocketClients.TryGetSocketClient(targetId, out TClient client)) + { + return client.SendAsync(protocol, buffer, offset, length); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + } + + #endregion 发送 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs.meta new file mode 100644 index 0000000..5428574 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 75de86a732ea1d14ea17197555d990e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs new file mode 100644 index 0000000..77820d7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs @@ -0,0 +1,407 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Rpc服务器辅助类 + /// + public partial class TcpTouchRpcSocketClient : SocketClient, ITcpTouchRpcSocketClient + { + private RpcActor m_rpcActor; + + /// + public bool IsHandshaked => m_rpcActor != null && m_rpcActor.IsHandshaked; + + /// + public string RootPath { get => m_rpcActor.RootPath; set => m_rpcActor.RootPath = value; } + + /// + public RpcActor RpcActor => m_rpcActor; + + /// + public SerializationSelector SerializationSelector => m_rpcActor.SerializationSelector; + + /// + public Func TryCanInvoke { get; set; } + + /// + /// 验证超时时间,默认为3000ms + /// + public int VerifyTimeout => Config.GetValue(TouchRpcConfigExtensions.VerifyTimeoutProperty); + + /// + /// 连接令箭 + /// + public string VerifyToken => Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty); + + /// + public bool ChannelExisted(int id) + { + return m_rpcActor.ChannelExisted(id); + } + + /// + public Channel CreateChannel() + { + return m_rpcActor.CreateChannel(); + } + + /// + public Channel CreateChannel(int id) + { + return m_rpcActor.CreateChannel(id); + } + + /// + public Channel CreateChannel(string targetId) + { + return m_rpcActor.CreateChannel(targetId); + } + + /// + public Channel CreateChannel(string targetId, int id) + { + return m_rpcActor.CreateChannel(targetId, id); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(id, method, invokeOption, parameters); + } + + /// + public T Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(id, method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + return m_rpcActor.Ping(targetId, timeout); + } + + /// + public bool Ping(int timeout = 5000) + { + return m_rpcActor.Ping(timeout); + } + + /// + public Result PullFile(FileOperator fileOperator) + { + return m_rpcActor.PullFile(fileOperator); + } + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFile(targetId, fileOperator); + } + + /// + public Task PullFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(fileOperator); + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(targetId, fileOperator); + } + + /// + public Result PushFile(FileOperator fileOperator) + { + return m_rpcActor.PushFile(fileOperator); + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFile(targetId, fileOperator); + } + + /// + public Task PushFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(fileOperator); + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(targetId, fileOperator); + } + + /// + public override void ResetID(string newID) + { + m_rpcActor.ResetID(newID); + DirectResetID(newID); + } + + /// + public Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStream(stream, streamOperator, metadata); + } + + /// + public Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStreamAsync(stream, streamOperator, metadata); + } + + /// + public bool TrySubscribeChannel(int id, out Channel channel) + { + return m_rpcActor.TrySubscribeChannel(id, out channel); + } + + internal void RpcActorSend(ArraySegment[] transferBytes) + { + base.Send(transferBytes); + } + + internal void SetRpcActor(RpcActor rpcActor) + { + m_rpcActor = rpcActor; + m_rpcActor.OnResetID = ThisOnResetID; + } + + /// + protected override void Dispose(bool disposing) + { + m_rpcActor.SafeDispose(); + base.Dispose(disposing); + } + + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + m_rpcActor.InputReceivedData(byteBlock); + } + + /// + protected override void OnConnected(TouchSocketEventArgs e) + { + EasyTask.DelayRun(VerifyTimeout, this, (client) => + { + if (!client.IsHandshaked) + { + client.Close("验证超时"); + } + }); + m_rpcActor.ID = ID; + base.OnConnected(e); + } + + /// + protected override void OnConnecting(OperationEventArgs e) + { + this.SwitchProtocolToTouchRpc(); + base.OnConnecting(e); + } + + /// + protected override void OnDisconnected(DisconnectEventArgs e) + { + m_rpcActor.Close(e.Message); + base.OnDisconnected(e); + } + + private void ThisOnResetID(bool first, RpcActor rpcActor, WaitSetID waitSetID) + { + DirectResetID(waitSetID.NewID); + } + + #region 发送 + + /// + public void Send(short protocol, byte[] buffer, int offset, int length) + { + m_rpcActor.Send(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override void Send(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override void Send(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + public Task SendAsync(short protocol, byte[] buffer, int offset, int length) + { + return m_rpcActor.SendAsync(protocol, buffer, offset, length); + } + + /// + /// 不允许直接发送 + /// + /// + /// + /// + public override Task SendAsync(byte[] buffer, int offset, int length) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + /// + /// 不允许直接发送 + /// + /// + public override Task SendAsync(IList> transferBytes) + { + throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); + } + + #endregion 发送 + + #region 小文件 + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(targetId, path, metadata, timeout, token); + } + + /// + public PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(targetId, path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(path, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); + } + + #endregion 小文件 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs.meta new file mode 100644 index 0000000..4832e2e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Tcp/TcpTouchRpcSocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab9f5c862398a5f4a98092b9e8bf1860 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp.meta new file mode 100644 index 0000000..647022d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7ced82eb0a498d44f9139017a364bb5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface.meta new file mode 100644 index 0000000..7acfd1f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 421ac76d42479aa409e02c29b289b975 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs new file mode 100644 index 0000000..60fd923 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// IUdpTouchRpc + /// + public interface IUdpTouchRpc : IUdpSession, IRpcParser, IRpcClient, IDependencyTouchRpc + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs.meta new file mode 100644 index 0000000..d6c2a8d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/Interface/IUdpTouchRpc.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 50ec90c486b2c7e489aa53623a0d7ed8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs new file mode 100644 index 0000000..15f39a7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs @@ -0,0 +1,385 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// UDP Rpc解释器 + /// + public partial class UdpTouchRpc : UdpSessionBase, IUdpTouchRpc + { + private readonly ActionMap m_actionMap; + private readonly Timer m_timer; + private readonly ConcurrentDictionary m_udpRpcActors; + private RpcStore m_rpcStore; + private SerializationSelector m_serializationSelector; + + /// + /// 构造函数 + /// + public UdpTouchRpc() + { + m_timer = new Timer((obj) => + { + m_udpRpcActors.Remove((kv) => + { + if (--kv.Value.Tick < 0) + { + return true; + } + return false; + }); + }, null, 1000 * 30, 1000 * 30); + m_actionMap = new ActionMap(); + m_udpRpcActors = new ConcurrentDictionary(); + } + + /// + /// 方法映射表 + /// + public ActionMap ActionMap { get => m_actionMap; } + + /// + /// 不需要握手,所以此值一直为True。 + /// + public bool IsHandshaked => true; + + string IRpcActor.RootPath { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + /// + public RpcActor RpcActor => GetUdpRpcActor(); + + /// + public RpcStore RpcStore => m_rpcStore; + + /// + public SerializationSelector SerializationSelector => m_serializationSelector; + + /// + public Func TryCanInvoke { get; set; } + + bool IRpcActor.ChannelExisted(int id) + { + throw new NotImplementedException(); + } + + Channel IRpcActor.CreateChannel() + { + throw new NotImplementedException(); + } + + Channel IRpcActor.CreateChannel(int id) + { + throw new NotImplementedException(); + } + + Channel ITargetRpcActor.CreateChannel(string targetId) + { + throw new NotImplementedException(); + } + + Channel ITargetRpcActor.CreateChannel(string targetId, int id) + { + throw new NotImplementedException(); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + GetUdpRpcActor().Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return GetUdpRpcActor().Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return GetUdpRpcActor().Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + GetUdpRpcActor().Invoke(method, invokeOption, ref parameters, types); + } + + void ITargetRpcClient.Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + throw new NotImplementedException(); + } + + T ITargetRpcClient.Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + throw new NotImplementedException(); + } + + void ITargetRpcClient.Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + throw new NotImplementedException(); + } + + T ITargetRpcClient.Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + throw new NotImplementedException(); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return GetUdpRpcActor().InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return GetUdpRpcActor().InvokeAsync(method, invokeOption, parameters); + } + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcService) + { + m_rpcStore = rpcService; + } + + #endregion RPC解析器 + + Task ITargetRpcClient.InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + throw new NotImplementedException(); + } + + Task ITargetRpcClient.InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + throw new NotImplementedException(); + } + + /// + public bool Ping(int timeout = 5000) + { + return GetUdpRpcActor().Ping(timeout); + } + + bool ITargetRpcActor.Ping(string targetId, int timeout) + { + throw new NotImplementedException(); + } + + Result IRpcActor.PullFile(FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + Result ITargetRpcActor.PullFile(string targetId, FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + Task IRpcActor.PullFileAsync(FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + Task ITargetRpcActor.PullFileAsync(string targetId, FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + PullSmallFileResult IRpcActor.PullSmallFile(string path, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + PullSmallFileResult ITargetRpcActor.PullSmallFile(string targetId, string path, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + Task IRpcActor.PullSmallFileAsync(string path, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + Task ITargetRpcActor.PullSmallFileAsync(string targetId, string path, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + Result IRpcActor.PushFile(FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + Result ITargetRpcActor.PushFile(string targetId, FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + Task IRpcActor.PushFileAsync(FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + Task ITargetRpcActor.PushFileAsync(string targetId, FileOperator fileOperator) + { + throw new NotImplementedException(); + } + + Result IRpcActor.PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + Result ITargetRpcActor.PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + Task IRpcActor.PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + Task ITargetRpcActor.PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata, int timeout, CancellationToken token) + { + throw new NotImplementedException(); + } + + void IRpcActor.ResetID(string newID) + { + throw new NotImplementedException(); + } + + /// + public void Send(short protocol, byte[] buffer, int offset, int length) + { + GetUdpRpcActor().Send(protocol, buffer, offset, length); + } + + /// + public Task SendAsync(short protocol, byte[] buffer, int offset, int length) + { + return GetUdpRpcActor().SendAsync(protocol, buffer, offset, length); + } + + Result IRpcActor.SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata) + { + throw new NotImplementedException(); + } + + Task IRpcActor.SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata) + { + throw new NotImplementedException(); + } + + bool IRpcActor.TrySubscribeChannel(int id, out Channel channel) + { + throw new NotImplementedException(); + } + + /// + protected override void Dispose(bool disposing) + { + m_timer.SafeDispose(); + m_udpRpcActors.Clear(); + base.Dispose(disposing); + } + + /// + protected override void HandleReceivedData(EndPoint remoteEndPoint, ByteBlock byteBlock, IRequestInfo requestInfo) + { + GetUdpRpcActor(remoteEndPoint).InputReceivedData(byteBlock); + } + + /// + protected override void LoadConfig(TouchSocketConfig config) + { + m_serializationSelector = config.GetValue(TouchRpcConfigExtensions.SerializationSelectorProperty); + + if (config.GetValue(RpcConfigExtensions.RpcStoreProperty) is RpcStore rpcStore) + { + rpcStore.AddRpcParser(GetType().Name, this); + } + else + { + new RpcStore(config.Container).AddRpcParser(GetType().Name, this); + } + base.LoadConfig(config); + } + + private MethodInstance GetInvokeMethod(string arg) + { + return m_actionMap.GetMethodInstance(arg); + } + + private UdpRpcActor GetUdpRpcActor(EndPoint endPoint) + { + if (!m_udpRpcActors.TryGetValue(endPoint, out UdpRpcActor udpRpcActor)) + { + udpRpcActor = new UdpRpcActor(this, endPoint, Container.Resolve()) + { + Caller = new UdpCaller(this, endPoint), + RpcStore = m_rpcStore, + GetInvokeMethod = GetInvokeMethod, + SerializationSelector = m_serializationSelector + }; + m_udpRpcActors.TryAdd(endPoint, udpRpcActor); + } + udpRpcActor.Tick++; + return udpRpcActor; + } + + private UdpRpcActor GetUdpRpcActor() + { + if (RemoteIPHost == null) + { + throw new ArgumentNullException(nameof(RemoteIPHost)); + } + return GetUdpRpcActor(RemoteIPHost.EndPoint); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs.meta new file mode 100644 index 0000000..5e3c9bf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Udp/UdpTouchRpc.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4faf4f98a03992c488026429383afd2e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket.meta new file mode 100644 index 0000000..33f5200 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 048f338e5b7009a4aba62b2af493dc7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface.meta new file mode 100644 index 0000000..eecaa64 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 84b2aff84cf65a543b626dbe7a37b3a8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs new file mode 100644 index 0000000..315e982 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// IWSTouchRpcClient + /// + public interface IWSTouchRpcClient : IWSTouchRpcClientBase, IRpcParser + { + /// + /// 异步连接 + /// + /// 验证超时时间 + /// + Task ConnectAsync(int timeout = 5000); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs.meta new file mode 100644 index 0000000..db723c6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d7f66691e7f4c6f4e822f266a0dde4c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs new file mode 100644 index 0000000..aa46a13 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpc辅助类基类 + /// + public interface IWSTouchRpcClientBase: ITouchRpc, IPluginObject, ISenderBase + { + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs.meta new file mode 100644 index 0000000..876fdd4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/Interface/IWSTouchRpcClientBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38f49b6e0850bc34ebb172ff90edae62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs new file mode 100644 index 0000000..99f3c7d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs @@ -0,0 +1,731 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Net.WebSockets; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// WSTouchRpcClient + /// + public partial class WSTouchRpcClient : DisposableObject, IWSTouchRpcClient + { + private readonly ActionMap m_actionMap; + private readonly ArraySegment m_buffer; + private readonly RpcActor m_rpcActor; + private ClientWebSocket m_client; + private TouchSocketConfig m_config; + private IPHost m_remoteIPHost; + private RpcStore m_rpcStore; + + /// + /// 创建一个WSTouchRpcClient实例。 + /// + public WSTouchRpcClient() + { + m_buffer = new ArraySegment(new byte[1024 * 64]); + m_actionMap = new ActionMap(); + m_rpcActor = new RpcActor(false) + { + OutputSend = RpcActorSend, + OnRouting = OnRpcActorRouting, + OnHandshaked = OnRpcActorHandshaked, + OnReceived = OnRpcActorReceived, + GetInvokeMethod = GetInvokeMethod, + OnClose = OnRpcServiceClose, + OnStreamTransfering = OnRpcActorStreamTransfering, + OnStreamTransfered = OnRpcActorStreamTransfered, + OnFileTransfering = OnRpcActorFileTransfering, + OnFileTransfered = OnRpcActorFileTransfered, + Caller = this + }; + } + + /// + /// 方法映射表 + /// + public ActionMap ActionMap { get => m_actionMap; } + + /// + public bool CanSend => m_client.State == WebSocketState.Open; + + /// + /// 客户端配置 + /// + public TouchSocketConfig Config => m_config; + + /// + public IContainer Container { get; private set; } + + /// + /// 断开连接 + /// + public DisconnectEventHandler Disconnected { get; set; } + + /// + public string ID => m_rpcActor.ID; + + /// + public bool IsHandshaked => m_rpcActor.IsHandshaked; + + /// + /// 最后活动时间 + /// + public DateTime LastActiveTime { get; private set; } + + /// + public ILog Logger => m_rpcActor.Logger; + + /// + public IPluginsManager PluginsManager { get; private set; } + + /// + public IPHost RemoteIPHost => m_remoteIPHost; + + /// + public string RootPath { get => m_rpcActor.RootPath; set => m_rpcActor.RootPath = value; } + + /// + public RpcActor RpcActor => m_rpcActor; + + /// + public RpcStore RpcStore { get => m_rpcStore; } + + /// + public SerializationSelector SerializationSelector => m_rpcActor.SerializationSelector; + + /// + public Func TryCanInvoke { get => m_rpcActor.TryCanInvoke; set => m_rpcActor.TryCanInvoke = value; } + + /// + public bool UsePlugin { get; private set; } + + /// + public bool ChannelExisted(int id) + { + return m_rpcActor.ChannelExisted(id); + } + + /// + /// 关闭 + /// + /// + public void Close(string msg) + { + if (m_client?.State != WebSocketState.Open) + { + return; + } + m_client.SafeDispose(); + m_rpcActor.SafeDispose(); + BreakOut($"调用{nameof(Close)}", true); + } + + /// + public async Task ConnectAsync(int timeout = 5000) + { + if (!RemoteIPHost.IsUri) + { + throw new Exception("RemoteIPHost必须为Uri格式。"); + } + if (m_client == null || m_client.State != WebSocketState.Open) + { + m_client.SafeDispose(); + m_client = new ClientWebSocket(); + await m_client.ConnectAsync(RemoteIPHost.Uri, default).ConfigureAwait(false); + + BeginReceive(); + } + + if (IsHandshaked) + { + return; + } + + m_rpcActor.Handshake(Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty), + Config.GetValue(TouchRpcConfigExtensions.DefaultIdProperty), default, + timeout, Config.GetValue(TouchRpcConfigExtensions.MetadataProperty)); + } + + /// + public Channel CreateChannel() + { + return m_rpcActor.CreateChannel(); + } + + /// + public Channel CreateChannel(int id) + { + return m_rpcActor.CreateChannel(id); + } + + /// + public Channel CreateChannel(string targetId) + { + return m_rpcActor.CreateChannel(targetId); + } + + /// + public Channel CreateChannel(string targetId, int id) + { + return m_rpcActor.CreateChannel(targetId, id); + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + return m_rpcActor.Ping(targetId, timeout); + } + + /// + public bool Ping(int timeout = 5000) + { + return m_rpcActor.Ping(timeout); + } + + /// + public void ResetID(string newID) + { + m_rpcActor.ResetID(newID); + } + + /// + public void Send(short protocol, byte[] buffer, int offset, int length) + { + m_rpcActor.Send(protocol, buffer, offset, length); + } + + /// + public Task SendAsync(short protocol, byte[] buffer, int offset, int length) + { + return m_rpcActor.SendAsync(protocol, buffer, offset, length); + } + + /// + public Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStream(stream, streamOperator, metadata); + } + + /// + public Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = null) + { + return m_rpcActor.SendStreamAsync(stream, streamOperator, metadata); + } + + /// + /// 配置 + /// + /// + /// + public IWSTouchRpcClient Setup(string ipHost) + { + TouchSocketConfig config = new TouchSocketConfig(); + config.SetRemoteIPHost(new IPHost(ipHost)); + return Setup(config); + } + + /// + /// 配置 + /// + /// + /// + public IWSTouchRpcClient Setup(TouchSocketConfig clientConfig) + { + m_config = clientConfig; + LoadConfig(m_config); + return this; + } + + /// + public bool TrySubscribeChannel(int id, out Channel channel) + { + return m_rpcActor.TrySubscribeChannel(id, out channel); + } + + /// + protected override void Dispose(bool disposing) + { + m_client.SafeDispose(); + m_rpcActor.SafeDispose(); + base.Dispose(disposing); + } + + /// + /// 加载配置 + /// + /// + protected virtual void LoadConfig(TouchSocketConfig config) + { + if (config == null) + { + throw new Exception("配置文件为空"); + } + m_remoteIPHost = config.GetValue(Sockets.TouchSocketConfigExtension.RemoteIPHostProperty); + Container = config.Container; + UsePlugin = config.IsUsePlugin; + PluginsManager = config.PluginsManager; + + m_rpcActor.Logger = Container.Resolve(); + m_rpcActor.FileController = Container.GetFileResourceController(); + RootPath = Config.GetValue(TouchRpcConfigExtensions.RootPathProperty); + m_rpcActor.SerializationSelector = Config.GetValue(TouchRpcConfigExtensions.SerializationSelectorProperty); + + if (config.GetValue(RpcConfigExtensions.RpcStoreProperty) is RpcStore rpcStore) + { + rpcStore.AddRpcParser(GetType().Name, this); + } + else + { + new RpcStore(config.Container).AddRpcParser(GetType().Name, this); + } + + } + + /// + /// 已断开连接。 + /// + /// + protected virtual void OnDisconnected(DisconnectEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(IDisconnectedPlguin.OnDisconnected), this, e)) + { + return; + } + Disconnected?.Invoke(this, e); + } + + private void BeginReceive() + { + Task.Factory.StartNew(async() => + { + try + { + ByteBlock byteBlock = null; + int bufferLength = this.Config.GetValue(TouchSocketConfigExtension.BufferLengthProperty); + while (true) + { + byteBlock ??= new ByteBlock(bufferLength); + var result = await m_client.ReceiveAsync(m_buffer, default); + if (result.Count == 0) + { + BreakOut("远程终端主动关闭", false); + return; + } + LastActiveTime = DateTime.Now; + byteBlock.Write(m_buffer.Array, 0, result.Count); + if (result.EndOfMessage) + { + try + { + m_rpcActor.InputReceivedData(byteBlock); + } + catch + { + } + finally + { + byteBlock.SafeDispose(); + byteBlock = default; + } + } + } + + } + catch (Exception ex) + { + BreakOut(ex.Message, false); + } + },TaskCreationOptions.LongRunning); + } + + private void BreakOut(string msg, bool manual) + { + m_client.SafeDispose(); + m_rpcActor.SafeDispose(); + OnDisconnected(new DisconnectEventArgs(manual, msg)); + } + + #region 小文件 + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(targetId, path, metadata, timeout, token); + } + + /// + public PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFile(path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(targetId, path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PullSmallFileAsync(path, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return m_rpcActor.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); + } + + #endregion 小文件 + + #region FileTransfer + + /// + public Result PullFile(FileOperator fileOperator) + { + return m_rpcActor.PullFile(fileOperator); + } + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFile(targetId, fileOperator); + } + + /// + public Task PullFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(fileOperator); + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PullFileAsync(targetId, fileOperator); + } + + /// + public Result PushFile(FileOperator fileOperator) + { + return m_rpcActor.PushFile(fileOperator); + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFile(targetId, fileOperator); + } + + /// + public Task PushFileAsync(FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(fileOperator); + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + return m_rpcActor.PushFileAsync(targetId, fileOperator); + } + + #endregion FileTransfer + + #region RPC + + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(method, invokeOption, parameters); + } + + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(method, invokeOption, ref parameters, types); + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(targetId, method, invokeOption, parameters); + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(targetId, method, invokeOption, parameters); + } + + /// + public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(targetId, method, invokeOption, parameters); + } + + /// + public Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(targetId, method, invokeOption, parameters); + } + + #endregion RPC + + #region 内部委托绑定 + + private MethodInstance GetInvokeMethod(string arg) + { + return m_actionMap.GetMethodInstance(arg); + } + + private void OnRpcActorFileTransfered(RpcActor actor, FileTransferStatusEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfered), this, e)) + { + return; + } + OnFileTransfered(e); + } + + private void OnRpcActorFileTransfering(RpcActor actor, FileOperationEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnFileTransfering), this, e)) + { + return; + } + OnFileTransfering(e); + } + + private void OnRpcActorHandshaked(RpcActor actor, VerifyOptionEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnHandshaked), this, e)) + { + return; + } + OnHandshaked(e); + } + + private void OnRpcActorReceived(RpcActor actor, short protocol, ByteBlock byteBlock) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnReceivedProtocolData), this, new ProtocolDataEventArgs(protocol, byteBlock))) + { + return; + } + + OnReceived(protocol, byteBlock); + } + + private void OnRpcActorRouting(RpcActor actor, PackageRouterEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnRouting), this, e)) + { + return; + } + OnRouting(e); + } + + private void OnRpcActorStreamTransfered(RpcActor actor, StreamStatusEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfered), this, e)) + { + return; + } + OnStreamTransfered(e); + } + + private void OnRpcActorStreamTransfering(RpcActor actor, StreamOperationEventArgs e) + { + if (UsePlugin && PluginsManager.Raise(nameof(ITouchRpcPlugin.OnStreamTransfering), this, e)) + { + return; + } + OnStreamTransfering(e); + } + + private void OnRpcServiceClose(RpcActor actor, string arg2) + { + Close(arg2); + } + + private async void RpcActorSend(RpcActor actor, ArraySegment[] transferBytes) + { + LastActiveTime = DateTime.Now; + for (int i = 0; i < transferBytes.Length; i++) + { + if (i == transferBytes.Length - 1) + { + await m_client.SendAsync(transferBytes[i], WebSocketMessageType.Binary, true, CancellationToken.None); + } + else + { + await m_client.SendAsync(transferBytes[i], WebSocketMessageType.Binary, false, CancellationToken.None); + } + } + } + + #endregion 内部委托绑定 + + #region 事件触发 + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + protected virtual void OnFileTransfered(FileTransferStatusEventArgs e) + { + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + protected virtual void OnFileTransfering(FileOperationEventArgs e) + { + } + + /// + /// 在完成握手连接时 + /// + /// + protected virtual void OnHandshaked(VerifyOptionEventArgs e) + { + } + + /// + /// 收到数据。 + /// + /// + /// + protected virtual void OnReceived(short protocol, ByteBlock byteBlock) + { + } + + /// + /// 当需要转发路由包时 + /// + /// + protected virtual void OnRouting(PackageRouterEventArgs e) + { + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + /// + protected virtual void OnStreamTransfered(StreamStatusEventArgs e) + { + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + protected virtual void OnStreamTransfering(StreamOperationEventArgs e) + { + } + + #endregion 事件触发 + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is TouchRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcStore) + { + m_rpcActor.RpcStore = rpcStore; + m_rpcStore = rpcStore; + } + + #endregion RPC解析器 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs.meta new file mode 100644 index 0000000..b30e74b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Components/Websocket/WSTouchRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10089fb3db5a26a49953e84a7ff1257c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config.meta new file mode 100644 index 0000000..3fc3f8c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 596e3ff7ccbf1c74f893cae6e5ae2ea8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs new file mode 100644 index 0000000..3a4f023 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs @@ -0,0 +1,284 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Rpc配置扩展 + /// + public static class TouchRpcConfigExtensions + { + /// + /// 默认使用Id。 + /// + public static readonly DependencyProperty DefaultIdProperty = + DependencyProperty.Register("DefaultId", typeof(TouchRpcConfigExtensions), null); + + /// + /// TouchClient连接时的元数据, 所需类型 + /// + public static readonly DependencyProperty MetadataProperty = DependencyProperty.Register("Metadata", typeof(TouchRpcConfigExtensions), null); + + /// + /// 序列化转换器, 所需类型 + /// + public static readonly DependencyProperty SerializationSelectorProperty = + DependencyProperty.Register("SerializationSelector", typeof(TouchRpcConfigExtensions), new DefaultSerializationSelector()); + + /// + /// 验证超时时间,默认为3000ms, 所需类型 + /// + public static readonly DependencyProperty VerifyTimeoutProperty = + DependencyProperty.Register("VerifyTimeout", typeof(TouchRpcConfigExtensions), 3000); + + /// + /// 连接令箭,当为null或空时,重置为默认值“rrqm”, 所需类型 + /// + public static readonly DependencyProperty VerifyTokenProperty = + DependencyProperty.Register("VerifyToken", typeof(TouchRpcConfigExtensions), "rrqm"); + + /// + /// 设置默认的使用Id。仅在TouchRpc组件适用。 + /// + /// 使用该功能时,仅在服务器的Handshaking之后生效。且如果id重复,则会连接失败。 + /// + /// + /// + /// + /// + public static TouchSocketConfig SetDefaultId(this TouchSocketConfig config, string value) + { + config.SetValue(DefaultIdProperty, value); + return config; + } + + /// + /// 心跳频率,默认为间隔2000ms,3次。(设置为null时禁止心跳) + /// 仅适用于TouchRpcClient系类 + /// + /// + /// + /// + [Obsolete("该方法已被弃用。请使用插件UseTouchRpcHeartbeat替代。", true)] + public static TouchSocketConfig SetHeartbeatFrequency(this TouchSocketConfig config, object value) + { + throw new NotImplementedException(); + } + + /// + /// 设置TouchClient连接时的元数据 + /// 仅适用于TouchRpcClient系类 + /// + /// + /// + /// + public static TouchSocketConfig SetMetadata(this TouchSocketConfig config, Metadata value) + { + config.SetValue(MetadataProperty, value); + return config; + } + + /// + /// 设置序列化转换器 + /// + /// + /// + /// + public static TouchSocketConfig SetSerializationSelector(this TouchSocketConfig config, SerializationSelector value) + { + config.SetValue(SerializationSelectorProperty, value); + return config; + } + + /// + /// 验证超时时间,默认为3000ms. + /// 该配置仅有效 + /// + /// + /// + /// + public static TouchSocketConfig SetVerifyTimeout(this TouchSocketConfig config, int value) + { + config.SetValue(VerifyTimeoutProperty, value); + return config; + } + + /// + /// 连接令箭,当为null或空时,重置为默认值“rrqm” + /// + /// + /// + /// + public static TouchSocketConfig SetVerifyToken(this TouchSocketConfig config, string value) + { + config.SetValue(VerifyTokenProperty, value); + return config; + } + + #region FileTransfer + + /// + /// 根目录 + /// 所需类型 + /// + public static readonly DependencyProperty RootPathProperty = DependencyProperty.Register("RootPath", typeof(TouchRpcConfigExtensions), string.Empty); + + /// + /// 设置根路径 + /// + /// + /// + /// + public static TouchSocketConfig SetRootPath(this TouchSocketConfig config, string value) + { + config.SetValue(RootPathProperty, value); + return config; + } + + #endregion FileTransfer + + #region 创建TcpTouchRpc + + /// + /// 构建TcpTouchRpc类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithTcpTouchRpcClient(this TouchSocketConfig config) where TClient : ITcpTouchRpcClient + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Connect(); + return client; + } + + /// + /// 构建TcpTouchRpc类客户端,并连接 + /// + /// + /// + public static TcpTouchRpcClient BuildWithTcpTouchRpcClient(this TouchSocketConfig config) + { + return BuildWithTcpTouchRpcClient(config); + } + + /// + /// 构建TcpTouchRpc类服务器,并启动。 + /// + /// + /// + /// + public static TService BuildWithTcpTouchRpcService(this TouchSocketConfig config) where TService : ITcpTouchRpcService + { + TService service = config.Container.Resolve(); + service.Setup(config); + service.Start(); + return service; + } + + /// + /// 构建TcpTouchRpc类服务器,并启动。 + /// + /// + /// + public static TcpTouchRpcService BuildWithTcpTouchRpcService(this TouchSocketConfig config) + { + return BuildWithTcpTouchRpcService(config); + } + + #endregion 创建TcpTouchRpc + + #region 创建HttpTouchRpc + + /// + /// 构建HttpTouchRpc类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithHttpTouchRpcClient(this TouchSocketConfig config) where TClient : IHttpTouchRpcClient + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Connect(); + return client; + } + + /// + /// 构建HttpTouchRpc类客户端,并连接 + /// + /// + /// + public static HttpTouchRpcClient BuildWithHttpTouchRpcClient(this TouchSocketConfig config) + { + return BuildWithHttpTouchRpcClient(config); + } + + /// + /// 构建HttpTouchRpc类服务器,并启动。 + /// + /// + /// + /// + public static TService BuildWithHttpTouchRpcService(this TouchSocketConfig config) where TService : IHttpTouchRpcService + { + TService service = config.Container.Resolve(); + service.Setup(config); + service.Start(); + return service; + } + + /// + /// 构建HttpTouchRpc类服务器,并启动。 + /// + /// + /// + public static HttpTouchRpcService BuildWithHttpTouchRpcService(this TouchSocketConfig config) + { + return BuildWithHttpTouchRpcService(config); + } + + #endregion 创建HttpTouchRpc + + #region 创建UdpTouchRpc + + /// + /// 构建UdpTouchRpc类 + /// + /// + /// + /// + public static TClient BuildWithUdpTouchRpc(this TouchSocketConfig config) where TClient : IUdpTouchRpc + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Start(); + return client; + } + + /// + /// 构建UdpTouchRpc类客户端 + /// + /// + /// + public static UdpTouchRpc BuildWithUdpTouchRpc(this TouchSocketConfig config) + { + return BuildWithUdpTouchRpc(config); + } + + #endregion 创建UdpTouchRpc + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs.meta new file mode 100644 index 0000000..e78dd16 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Config/TouchRpcConfigExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40d4500537853d349ab09bc96fc03276 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum.meta new file mode 100644 index 0000000..fa0e048 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ddf505cd9f1ef41449c88f45355e2757 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs new file mode 100644 index 0000000..6ac1de9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs @@ -0,0 +1,119 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 路由类型 + /// + public readonly struct RouteType + { + private readonly string value; + + /// + /// 路由类型 + /// + /// + public RouteType(string value) + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException($"“{nameof(value)}”不能为 null 或空。", nameof(value)); + } + + this.value = value.ToLower().Trim(); + } + + /// + /// 判断RouteType是相等。 + /// + /// + /// + /// + public static bool operator ==(RouteType a, RouteType b) + { + return a.value == b.value; + } + + /// + /// 判断RouteType不相等。 + /// + /// + /// + /// + public static bool operator !=(RouteType a, RouteType b) + { + return a.value != b.value; + } + + /// + /// + /// + /// + /// + public override bool Equals(object obj) + { + if (obj is RouteType type) + { + return this == type; + } + return false; + } + + /// + /// + /// + /// + public override int GetHashCode() + { + return this.value.GetHashCode(); + } + + /// + /// + /// + /// + public override string ToString() => value; + + /// + /// 一个Ping探测路由包 + /// + public static readonly RouteType Ping = new RouteType("Ping"); + + /// + /// 创建通道路由包。 + /// + public static readonly RouteType CreateChannel = new RouteType("CreateChannel"); + + /// + /// Rpc调用的路由包 + /// + public static readonly RouteType Rpc = new RouteType("Rpc"); + + /// + /// 拉取文件的路由包 + /// + public static readonly RouteType PullFile = new RouteType("PullFile"); + + /// + /// 加载远程流数据 + /// + public static readonly RouteType LoadRemoteStream = new RouteType("LoadRemoteStream"); + + /// + /// 推送文件的路由包 + /// + public static readonly RouteType PushFile = new RouteType("PushFile"); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs.meta new file mode 100644 index 0000000..f560480 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/RouteType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45b20b39b8e3dcf48a65fc5c46ce9419 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs new file mode 100644 index 0000000..68b7cd5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 传输标识 + /// + [Flags] + public enum TransferFlags : byte + { + /// + /// 无任何标识 + /// + None = 0, + + /// + /// 断点续传。 + /// 使用该标识时,会使用文件长度验证续传的有效性。如果需要,也可以附加验证。 + /// + BreakpointResume = 1, + + /// + /// MD5验证。该标识在文件传输完成时,也会再次验证文件长度。 + /// + MD5Verify = 2, + + /// + /// 当传输失败时,删除所有缓存文件。 + /// 注意:当启用断点续传时,该标识无效 + /// + DeleteWhenFail = 4 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs.meta new file mode 100644 index 0000000..4f05a46 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferFlags.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c93f126d23804d846a6e4b326838713c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs new file mode 100644 index 0000000..e78e900 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 传输类型 + /// + [Flags] + public enum TransferType + { + /// + /// 推送 + /// + Push = 0, + + /// + /// 拉取 + /// + Pull = 1, + + /// + /// 分块推送 + /// + SectionPush = 2, + + /// + /// 分块拉取 + /// + SectionPull = 4, + + /// + /// 小文件推送 + /// + SmallPush = 8, + + /// + /// 小文件拉取 + /// + SmallPull = 16 + } + + /// + /// TransferTypeExtension + /// + public static class TransferTypeExtension + { + /// + /// 表示当前传输类型是否属于其中的一种。 + /// + /// + /// + public static bool IsPull(this TransferType transferType) + { + return transferType == TransferType.Pull || transferType == TransferType.SmallPull || transferType == TransferType.SectionPull; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs.meta new file mode 100644 index 0000000..45e1fe1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Enum/TransferType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ead9e442c07161a4ca2e1224d6e66f6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs.meta new file mode 100644 index 0000000..3f7382f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 362c7bc2f202e38479e3bdf61d7d1f23 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs new file mode 100644 index 0000000..e014982 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs @@ -0,0 +1,120 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 操作文件事件类 + /// + public class FileOperationEventArgs : MsgEventArgs + { + private string m_savePath; + private string m_resourcePath; + private readonly Metadata m_metadata; + + /// + /// FileOperationEventArgs + /// + /// + /// + /// + public FileOperationEventArgs(TransferType transferType, FileOperator fileOperator, RemoteFileInfo fileInfo) + { + FileOperator = fileOperator; + TransferType = transferType; + FileInfo = fileInfo; + } + + /// + /// FileOperationEventArgs + /// + /// + /// + /// + public FileOperationEventArgs(TransferType transferType, Metadata metadata, RemoteFileInfo fileInfo) + { + FileOperator = default; + TransferType = transferType; + FileInfo = fileInfo; + m_metadata = metadata; + } + + /// + /// 存放路径, + /// 可输入绝对路径,也可以输入相对路径。 + /// 但是必须包含文件名及扩展名。 + /// + public string SavePath + { + get => FileOperator == null ? m_savePath : FileOperator.SavePath; + set + { + if (FileOperator == null) + { + m_savePath = value; + } + else + { + FileOperator.SavePath = value; + } + } + } + + /// + /// 请求文件路径, + /// 可输入绝对路径,也可以输入相对路径。 + /// + public string ResourcePath + { + get => FileOperator == null ? m_resourcePath : FileOperator.ResourcePath; + set + { + if (FileOperator == null) + { + m_resourcePath = value; + } + else + { + FileOperator.ResourcePath = value; + } + } + } + + /// + /// 元数据 + /// + public Metadata Metadata => FileOperator == null ? m_metadata : FileOperator.Metadata; + + /// + /// 文件操作器 + /// + public FileOperator FileOperator { get; private set; } + + /// + /// 文件信息 + /// + public RemoteFileInfo FileInfo { get; private set; } + + /// + /// 传输标识 + /// + public TransferFlags Flags { get => FileOperator == null ? TransferFlags.None : FileOperator.Flags; } + + /// + /// 传输类型 + /// + public TransferType TransferType { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs.meta new file mode 100644 index 0000000..7d675e5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileOperationEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b18525eb0bc82754ebde06d44a9e8509 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs new file mode 100644 index 0000000..25d6960 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs @@ -0,0 +1,64 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 文件传输状态 + /// + public class FileTransferStatusEventArgs : FileOperationEventArgs + { + /// + /// FileTransferStatusEventArgs + /// + /// + /// + /// + /// + public FileTransferStatusEventArgs(TransferType transferType, Metadata metadata, RemoteFileInfo fileInfo, Result result) + : base(transferType, metadata, fileInfo) + { + Result = result; + } + + /// + /// FileTransferStatusEventArgs + /// + /// + /// + /// + /// + public FileTransferStatusEventArgs(TransferType transferType, Result result, RemoteFileInfo fileInfo, FileOperator fileOperator) + : base(transferType, fileOperator, fileInfo) + { + Result = result; + } + + /// + /// FileTransferStatusEventArgs + /// + /// + /// + public FileTransferStatusEventArgs(Result result, FileOperationEventArgs args) + : base(args.TransferType, args.FileOperator, args.FileInfo) + { + Result = result; + } + + /// + /// 结果 + /// + public Result Result { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs.meta new file mode 100644 index 0000000..0083db7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/FileTransferStatusEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4cacff568d1d2d247910e4d2f3a73421 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs new file mode 100644 index 0000000..a43f12d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Http; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Http验证 + /// + public class HttpVerifyOptionEventArgs : HttpContextEventArgs + { + /// + /// 构造函数 + /// + /// + /// + public HttpVerifyOptionEventArgs(HttpContext context, string token) : base(context) + { + Token = token; + } + + /// + /// 验证令箭 + /// + public string Token { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs.meta new file mode 100644 index 0000000..3f3f2ce --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/HttpVerifyOptionEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b3dab3ce1796cc4896444b564feacd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs new file mode 100644 index 0000000..1ac24a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// PackageRouterEventArgs + /// + public class PackageRouterEventArgs : MsgEventArgs + { + /// + /// PackageRouterEventArgs + /// + /// + /// + public PackageRouterEventArgs(RouteType routerType, RouterPackage package) + { + RouterType = routerType; + Package = package; + } + + /// + /// 路由类型 + /// + public RouteType RouterType { get; private set; } + + /// + /// 路由数据包。一般为不完全数据,仅包含基本的路由信息。 + /// + public RouterPackage Package { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs.meta new file mode 100644 index 0000000..6dcbd9c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/PackageRouterEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c81a8c189920ef04ca5142c63e400a1b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs new file mode 100644 index 0000000..ab93b93 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs @@ -0,0 +1,43 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 协议数据事件 + /// + public class ProtocolDataEventArgs : TouchSocketEventArgs + { + /// + /// 构造函数 + /// + /// + /// + public ProtocolDataEventArgs(short protocol, ByteBlock byteBlock) + { + Protocol = protocol; + ByteBlock = byteBlock; + } + + /// + /// 数据流,实际解析时应当偏移两个字节 + /// + public ByteBlock ByteBlock { get; } + + /// + /// 协议 + /// + public short Protocol { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs.meta new file mode 100644 index 0000000..85c1978 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/ProtocolDataEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 704892e258e6672438e6bfc7d5bf75ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs new file mode 100644 index 0000000..22c9e93 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.IO; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 流事件参数 + /// + public class StreamEventArgs : MsgEventArgs + { + /// + /// 构造函数 + /// + /// + /// + public StreamEventArgs(Metadata metadata, StreamInfo streamInfo) + { + Metadata = metadata; + StreamInfo = streamInfo; + } + + /// + /// 用于接收流的容器 + /// + public Stream Bucket { get; set; } + + /// + /// 用于可传输的元数据 + /// + public Metadata Metadata { get; private set; } + + /// + /// 流信息 + /// + public StreamInfo StreamInfo { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs.meta new file mode 100644 index 0000000..ad6a0ac --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7e7312c692da5944fbd062288ce7bff9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs new file mode 100644 index 0000000..0e395f0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 接收流数据 + /// + public class StreamOperationEventArgs : StreamEventArgs + { + /// + /// 构造函数 + /// + /// + /// + /// + public StreamOperationEventArgs(StreamOperator streamOperator, Metadata metadata, StreamInfo streamInfo) : base(metadata, streamInfo) + { + StreamOperator = streamOperator ?? throw new ArgumentNullException(nameof(streamOperator)); + IsPermitOperation = true; + } + + /// + /// 流操作 + /// + public StreamOperator StreamOperator { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs.meta new file mode 100644 index 0000000..3940e62 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamOperationEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1e0246cc3de0a914daf7868c6d06a1f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs new file mode 100644 index 0000000..1894073 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 具有返回状态的流 + /// + public class StreamStatusEventArgs : StreamEventArgs + { + private Result result; + + /// + /// 结果 + /// + public Result Result => result; + + /// + /// 构造函数 + /// + /// + /// + /// + public StreamStatusEventArgs(Result result, Metadata metadata, StreamInfo streamInfo) : base(metadata, streamInfo) + { + this.result = result; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs.meta new file mode 100644 index 0000000..54f5521 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/StreamStatusEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23c3fb845c0f25b409d299d300646978 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs new file mode 100644 index 0000000..9e7b1e5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 连接验证 + /// + public class VerifyOptionEventArgs : MsgEventArgs + { + /// + /// 令箭 + /// + public string Token { get; private set; } + + /// + /// 元数据 + /// + public Metadata Metadata { get; private set; } + + /// + /// 构造函数 + /// + /// + /// + public VerifyOptionEventArgs(string token, Metadata metadata) + { + Token = token; + Metadata = metadata; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs.meta new file mode 100644 index 0000000..722ed77 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/EventArgs/VerifyOptionEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54128107547d43f4b9e38e28c6679ecb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions.meta new file mode 100644 index 0000000..d8d0b06 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d80286eb25cac7841be793cc48370c98 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs new file mode 100644 index 0000000..06be32b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 协议异常 + /// + [Serializable] + public class ProtocolException : Exception + { + /// + /// 构造函数 + /// + public ProtocolException() + { } + + /// + /// 构造函数 + /// + /// + public ProtocolException(string message) : base(message) { } + + /// + /// 构造函数 + /// + /// + /// + public ProtocolException(string message, System.Exception inner) : base(message, inner) { } + + /// + /// 构造函数 + /// + /// + /// + protected ProtocolException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs.meta new file mode 100644 index 0000000..80e7cad --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/ProtocolException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54d715e938ac11a48952e89116128a71 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs new file mode 100644 index 0000000..4893439 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Token验证异常 + /// + [Serializable] + public class TokenVerifyException : Exception + { + /// + /// 构造函数 + /// + public TokenVerifyException() + { } + + /// + /// 构造函数 + /// + /// + public TokenVerifyException(string message) : base(message) { } + + /// + /// 构造函数 + /// + /// + /// + public TokenVerifyException(string message, System.Exception inner) : base(message, inner) { } + + /// + /// 构造函数 + /// + /// + /// + protected TokenVerifyException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs.meta new file mode 100644 index 0000000..a7f248a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TokenVerifyException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f391389cd2de87b4da8c6a46cc49cb06 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs new file mode 100644 index 0000000..7eb8584 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Rpc添加方法键异常 + /// + public class RpcKeyException : Exception + { + /// + ///构造函数 + /// + public RpcKeyException() : base() { } + + /// + ///构造函数 + /// + /// + public RpcKeyException(string message) : base(message) { } + + /// + ///构造函数 + /// + /// + /// + public RpcKeyException(string message, System.Exception inner) : base(message, inner) { } + + /// + ///构造函数 + /// + /// + /// + protected RpcKeyException(System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } + + /// + /// Rpc无注册异常 + /// + public class RpcNoRegisterException : Exception + { + /// + ///构造函数 + /// + public RpcNoRegisterException() : base() { } + + /// + ///构造函数 + /// + /// + public RpcNoRegisterException(string message) : base(message) { } + + /// + ///构造函数 + /// + /// + /// + public RpcNoRegisterException(string message, System.Exception inner) : base(message, inner) { } + + /// + ///构造函数 + /// + /// + /// + protected RpcNoRegisterException(System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } + + /// + /// 序列化异常类 + /// + public class RpcSerializationException : Exception + { + /// + ///构造函数 + /// + public RpcSerializationException() : base() { } + + /// + ///构造函数 + /// + /// + public RpcSerializationException(string message) : base(message) { } + + /// + ///构造函数 + /// + /// + /// + public RpcSerializationException(string message, System.Exception inner) : base(message, inner) { } + + /// + ///构造函数 + /// + /// + /// + protected RpcSerializationException(System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs.meta new file mode 100644 index 0000000..1eec3d6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Exceptions/TouchRpcExceptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 30b3debca52851846a5fefa6dae3347d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions.meta new file mode 100644 index 0000000..87c8ef0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 610096b79184abd4599cdc49da0e9008 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs new file mode 100644 index 0000000..98ec509 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs @@ -0,0 +1,244 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RpcActorExtensions + /// + public static partial class RpcActorExtensions + { + #region 尝试发送 + + /// + /// 尝试发送 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool TrySend(this TRpcActor rpcActor, short protocol, byte[] buffer, int offset, int length) where TRpcActor : IRpcActorSender + { + try + { + rpcActor.Send(protocol, buffer, offset, length); + return true; + } + catch + { + return false; + } + } + + /// + /// 尝试发送 + /// + /// + /// + /// + /// + /// + public static bool TrySend(this TRpcActor rpcActor, short protocol, byte[] buffer) where TRpcActor : IRpcActorSender + { + try + { + rpcActor.Send(protocol, buffer, 0, buffer.Length); + return true; + } + catch + { + return false; + } + } + + /// + /// 尝试发送 + /// + /// + /// + /// + /// + public static bool TrySend(this TRpcActor rpcActor, short protocol) where TRpcActor : IRpcActorSender + { + try + { + rpcActor.Send(protocol); + return true; + } + catch + { + return false; + } + } + + /// + /// 尝试发送 + /// + /// + /// + /// + /// + /// + public static bool TrySend(this TRpcActor rpcActor, short protocol, ByteBlock byteBlock) where TRpcActor : IRpcActorSender + { + try + { + rpcActor.Send(protocol, byteBlock); + return true; + } + catch + { + return false; + } + } + + #endregion 尝试发送 + + #region 尝试异步发送 + + /// + /// 尝试发送 + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task TrySendAsync(this TRpcActor rpcActor, short protocol, byte[] buffer, int offset, int length) where TRpcActor : IRpcActorSender + { + try + { + await rpcActor.SendAsync(protocol, buffer, offset, length); + return true; + } + catch + { + return false; + } + } + + /// + /// 尝试发送 + /// + /// + /// + /// + /// + /// + public static async Task TrySendAsync(this TRpcActor rpcActor, short protocol, byte[] buffer) where TRpcActor : IRpcActorSender + { + try + { + await rpcActor.SendAsync(protocol, buffer, 0, buffer.Length); + return true; + } + catch + { + return false; + } + } + + /// + /// 尝试发送 + /// + /// + /// + /// + /// + public static async Task TrySendAsync(this TRpcActor rpcActor, short protocol) where TRpcActor : IRpcActorSender + { + try + { + await rpcActor.SendAsync(protocol); + return true; + } + catch + { + return false; + } + } + + #endregion 尝试异步发送 + + #region 发送 + + /// + /// + /// + /// + /// + /// + /// + public static void Send(this TRpcActor rpcActor, short protocol, byte[] buffer) where TRpcActor : IRpcActorSender + { + rpcActor.Send(protocol, buffer, 0, buffer.Length); + } + + /// + /// + /// + /// + /// + /// + public static void Send(this TRpcActor rpcActor, short protocol) where TRpcActor : IRpcActorSender + { + rpcActor.Send(protocol, TouchSocketCoreUtility.ZeroBytes, 0, 0); + } + + /// + /// + /// + /// + /// + /// + /// + public static void Send(this TRpcActor rpcActor, short protocol, ByteBlock byteBlock) where TRpcActor : IRpcActorSender + { + rpcActor.Send(protocol, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public static Task SendAsync(this TRpcActor rpcActor, short protocol, byte[] buffer) where TRpcActor : IRpcActorSender + { + return rpcActor.SendAsync(protocol, buffer, 0, buffer.Length); + } + + /// + /// + /// + /// + /// + /// + /// + public static Task SendAsync(this TRpcActor rpcActor, short protocol) where TRpcActor : IRpcActorSender + { + return rpcActor.SendAsync(protocol, TouchSocketCoreUtility.ZeroBytes, 0, 0); + } + + #endregion 发送 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs.meta new file mode 100644 index 0000000..6db8266 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/RpcActorExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f96799af31e3b5f4aafd602fb95f26c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs new file mode 100644 index 0000000..f86c3aa --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpcContainerExtension + /// + public static class TouchRpcContainerExtension + { + /// + /// 设置文件资源控制器。 + /// + /// + /// + public static IContainer SetFileResourceController(this IContainer container, IFileResourceController value) + { + return container.RegisterSingleton(value); + } + + /// + /// 设置文件资源控制器。 + /// + /// + /// + public static IContainer SetFileResourceController(this IContainer container) where T : class, IFileResourceController + { + return container.RegisterSingleton(); + } + + /// + /// 默认的全局资源控制器。 + /// + public static readonly FileResourceController FileController = new FileResourceController(); + + /// + /// 获取文件资源控制器。如果没有注册的话,会新建一个 + /// + /// + public static IFileResourceController GetFileResourceController(this IContainer container) + { + if (container.IsRegistered(typeof(IFileResourceController))) + { + return container.Resolve(); + } + return FileController; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs.meta new file mode 100644 index 0000000..e0579c7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcContainerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ed2a4c853165544d8011a74547e6a3a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs new file mode 100644 index 0000000..22bfb80 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs @@ -0,0 +1,334 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RPC辅助扩展 + /// + public static partial class TouchRpcExtensions + { + /// + /// 创建一个直接向目标地址请求的Rpc客户端。 + /// + /// + /// + public static IRpcClient CreateIDRpcClient(this TRpcActor client, string targetId) where TRpcActor : IRpcActor + { + return new IDRpcActor(targetId, client); + } + + #region 批量传输(弃用) + + /// + /// 批量拉取文件 + /// + /// 终端 + /// 并行数量 + /// 批量操作器 + [Obsolete("此方法因为特殊原因已被弃用。")] + public static void PullFiles(this IRpcActor client, int multipleCount, FileOperator[] fileOperators) + { + if (multipleCount < 1) + { + throw new Exception("并行数量不能小于1。"); + } + + if (fileOperators is null) + { + throw new ArgumentNullException(nameof(fileOperators)); + } + + int index = 0; + int t = 0; + int complatedLen = 0; + List> results = new List>(); + + LoopAction loopAction = LoopAction.CreateLoopAction(-1, 100, (loop) => + { + int st = multipleCount - t; + for (int i = 0; i < st; i++) + { + if (index == fileOperators.Length) + { + break; + } + Task result = client.PullFileAsync(fileOperators[index]); + results.Add(result); + index++; + t++; + } + + List> cr = new List>(); + + foreach (var item in results) + { + if (item.IsCompleted) + { + cr.Add(item); + t--; + complatedLen++; + if (complatedLen == fileOperators.Length) + { + loop.Dispose(); + } + } + } + + foreach (var item in cr) + { + results.Remove(item); + } + }); + + loopAction.Run(); + } + + /// + /// 异步批量拉取文件 + /// + /// 终端 + /// 并行数量 + /// 批量操作器 + [Obsolete("此方法因为特殊原因已被弃用。")] + public static void PullFilesAsync(this IRpcActor client, int multipleCount, FileOperator[] fileOperators) + { + if (multipleCount < 1) + { + throw new Exception("并行数量不能小于1。"); + } + + if (fileOperators is null) + { + throw new ArgumentNullException(nameof(fileOperators)); + } + + int index = 0; + int t = 0; + int complatedLen = 0; + List> results = new List>(); + + LoopAction loopAction = LoopAction.CreateLoopAction(-1, 100, (loop) => + { + int st = multipleCount - t; + for (int i = 0; i < st; i++) + { + if (index == fileOperators.Length) + { + break; + } + Task result = client.PullFileAsync(fileOperators[index]); + results.Add(result); + index++; + t++; + } + + List> cr = new List>(); + + foreach (var item in results) + { + if (item.IsCompleted) + { + cr.Add(item); + t--; + complatedLen++; + if (complatedLen == fileOperators.Length) + { + loop.Dispose(); + } + } + } + + foreach (var item in cr) + { + results.Remove(item); + } + }); + + loopAction.RunAsync(); + } + + /// + /// 批量推送文件 + /// + /// 终端 + /// 并行数量 + /// 批量操作器 + [Obsolete("此方法因为特殊原因已被弃用。")] + public static void PushFiles(this IRpcActor client, int multipleCount, FileOperator[] fileOperators) + { + if (multipleCount < 1) + { + throw new Exception("并行数量不能小于1。"); + } + + if (fileOperators is null) + { + throw new ArgumentNullException(nameof(fileOperators)); + } + + int index = 0; + int t = 0; + int complatedLen = 0; + List> results = new List>(); + + LoopAction loopAction = LoopAction.CreateLoopAction(-1, 100, (loop) => + { + int st = multipleCount - t; + for (int i = 0; i < st; i++) + { + if (index == fileOperators.Length) + { + break; + } + Task result = client.PushFileAsync(fileOperators[index]); + results.Add(result); + index++; + t++; + } + + List> cr = new List>(); + + foreach (var item in results) + { + if (item.IsCompleted) + { + cr.Add(item); + t--; + complatedLen++; + if (complatedLen == fileOperators.Length) + { + loop.Dispose(); + } + } + } + + foreach (var item in cr) + { + results.Remove(item); + } + }); + + loopAction.Run(); + } + + /// + /// 异步批量推送文件 + /// + /// 终端 + /// 并行数量 + /// 批量操作器 + [Obsolete("此方法因为特殊原因已被弃用。")] + public static void PushFilesAsync(this IRpcActor client, int multipleCount, FileOperator[] fileOperators) + { + if (multipleCount < 1) + { + throw new Exception("并行数量不能小于1。"); + } + + if (fileOperators is null) + { + throw new ArgumentNullException(nameof(fileOperators)); + } + + int index = 0; + int t = 0; + int complatedLen = 0; + List> results = new List>(); + + LoopAction loopAction = LoopAction.CreateLoopAction(-1, 100, (loop) => + { + int st = multipleCount - t; + for (int i = 0; i < st; i++) + { + if (index == fileOperators.Length) + { + break; + } + Task result = client.PushFileAsync(fileOperators[index]); + results.Add(result); + index++; + t++; + } + + List> cr = new List>(); + + foreach (var item in results) + { + if (item.IsCompleted) + { + cr.Add(item); + t--; + complatedLen++; + if (complatedLen == fileOperators.Length) + { + loop.Dispose(); + } + } + } + + foreach (var item in cr) + { + results.Remove(item); + } + }); + + loopAction.RunAsync(); + } + + #endregion 批量传输(弃用) + + /// + /// 转化Protocol协议标识为TouchRpc + /// + /// + public static void SwitchProtocolToTouchRpc(this ITcpClientBase client) + { + client.SetDataHandlingAdapter(new FixedHeaderPackageAdapter()); + client.Protocol = TouchRpcUtility.TouchRpcProtocol; + } + + /// + /// 转为ResultCode + /// + /// + /// + public static ResultCode ToResultCode(this ChannelStatus channelStatus) + { + switch (channelStatus) + { + case ChannelStatus.Default: + return ResultCode.Default; + + case ChannelStatus.Overtime: + return ResultCode.Overtime; + + case ChannelStatus.Cancel: + return ResultCode.Canceled; + + case ChannelStatus.Completed: + return ResultCode.Success; + + case ChannelStatus.Moving: + case ChannelStatus.Disposed: + default: + return ResultCode.Error; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs.meta new file mode 100644 index 0000000..87d8514 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: adc7a6ad999832349a206e5eaf21eb09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs new file mode 100644 index 0000000..c2f4631 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Rpc.TouchRpc; +using TouchSocket.Sockets; + +namespace TouchSocket.Core +{ + /// + /// TouchRpcPluginsManagerExtension + /// + public static partial class TouchRpcPluginsManagerExtension + { + /// + /// 使用Redis插件。仅:TouchRpc组成员会生效。 + /// + /// + /// + public static RedisPlugin UseRedis(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + + /// + /// TouchRpc心跳。仅客户端适用。 + /// + /// 默认心跳每3秒进行一次。最大失败3次即判定为断开连接。 + /// + /// + /// + /// + /// + public static TouchRpcHeartbeatPlugin UseTouchRpcHeartbeat(this IPluginsManager pluginsManager) where TClient : class, ITcpClientBase, IDependencyTouchRpc + { + return pluginsManager.Add>(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs.meta new file mode 100644 index 0000000..50337b2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcPluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85bd795d1c9d1cb47a2127847a5d3af0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs new file mode 100644 index 0000000..09d0972 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs @@ -0,0 +1,53 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpcServiceExtension + /// + public static class TouchRpcServiceExtension + { + /// + public static void Send(this ITouchRpcService service, string targetId, short protocol, byte[] buffer) + { + service.Send(targetId, protocol, buffer, 0, buffer.Length); + } + + /// + public static void Send(this ITouchRpcService service, string targetId, short protocol) + { + service.Send(targetId, protocol, TouchSocketCoreUtility.ZeroBytes, 0, 0); + } + + /// + public static void Send(this ITouchRpcService service, string targetId, short protocol, ByteBlock byteBlock) + { + service.Send(targetId, protocol, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + public static Task SendAsync(this ITouchRpcService service, string targetId, short protocol, byte[] buffer) + { + return service.SendAsync(targetId, protocol, buffer, 0, buffer.Length); + } + + /// + public static Task SendAsync(this ITouchRpcService service, string targetId, short protocol) + { + return service.SendAsync(targetId, protocol, TouchSocketCoreUtility.ZeroBytes, 0, 0); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs.meta new file mode 100644 index 0000000..20414c6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Extensions/TouchRpcServiceExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 844a14ef7960651469a65d24b236f0fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File.meta new file mode 100644 index 0000000..1701f1a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 483dff3c4de7eb24e9ca796110654898 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs new file mode 100644 index 0000000..0ae0eee --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 文件传输操作器 + /// + public class FileOperator : RemoteFileOperator + { + /// + /// 传输标识 + /// + public TransferFlags Flags { get; set; } + + /// + /// 存放路径, + /// 可输入绝对路径,也可以输入相对路径。 + /// 但是必须包含文件名及扩展名。 + /// + public string SavePath { get; set; } + + /// + /// 资源文件路径, + /// 可输入绝对路径,也可以输入相对路径。 + /// + public string ResourcePath { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs.meta new file mode 100644 index 0000000..487f863 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b8c3e35b03665e044a4d107782e25d26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs new file mode 100644 index 0000000..e9ff040 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs @@ -0,0 +1,131 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 文件资源控制器。 + /// + public class FileResourceController : IFileResourceController + { + /// + public virtual void GetFileInfo(string path, bool md5, ref T fileInfo) where T : RemoteFileInfo + { + FileInfo info = new FileInfo(path); + fileInfo.FullName = info.FullName; + fileInfo.Name = info.Name; + fileInfo.Attributes = info.Attributes; + fileInfo.CreationTime = info.CreationTime; + fileInfo.Length = info.Length; + fileInfo.LastAccessTime = info.LastAccessTime; + fileInfo.LastWriteTime = info.LastWriteTime; + + if (md5) + { + using FileStream fileStream = File.OpenRead(path); + fileInfo.MD5 = FileUtility.GetStreamMD5(fileStream); + } + } + + /// + public virtual string GetFullPath(string root, string path) + { + if (path.IsNullOrEmpty()) + { + return string.Empty; + } + if (Path.IsPathRooted(path)) + { + return path; + } + else + { + return Path.GetFullPath(Path.Combine(root, path)); + } + } + + /// + public virtual bool TryReadTempInfo(string path, TransferFlags flags, ref TouchRpcFileInfo info) + { + if (flags == TransferFlags.None) + { + return false; + } + string filePath = path + ".rrqm"; + string tempPath = path + ".temp"; + if (File.Exists(filePath) && File.Exists(tempPath)) + { + try + { + FileInfo fileInfo = new FileInfo(filePath); + TouchRpcFileInfo tempInfo = SerializeConvert.JsonDeserializeFromString(File.ReadAllText(tempPath)); + if (flags.HasFlag(TransferFlags.BreakpointResume)) + { + if (tempInfo.Length != info.Length) + { + return false; + } + if (flags.HasFlag(TransferFlags.MD5Verify)) + { + if ((tempInfo.MD5 == info.MD5 && info.MD5.HasValue())) + { + info.Position = tempInfo.Position; + return true; + } + } + else + { + info.Position = tempInfo.Position; + return true; + } + } + else + { + return false; + } + } + catch + { + return false; + } + } + return false; + } + + /// + public virtual int ReadAllBytes(FileInfo fileInfo, byte[] buffer) + { + using (FileStorageReader reader = FilePool.GetReader(fileInfo)) + { + return reader.Read(buffer, 0, buffer.Length); + } + } + + /// + public virtual void WriteAllBytes(FileInfo fileInfo, byte[] buffer, int offset, int length) + { + FileUtility.Delete(fileInfo.FullName); + using (var writer = FilePool.GetWriter(fileInfo)) + { + writer.Write(buffer, offset, length); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs.meta new file mode 100644 index 0000000..3418a19 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/FileResourceController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0a40622d8ef31a449fc50492fcbad60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs new file mode 100644 index 0000000..7daf4b9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Concurrent; +using System.IO; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 文件资源控制器。 + /// + public interface IFileResourceController + { + /// + /// 获取文件信息 + /// + /// + /// + /// + /// + void GetFileInfo(string path, bool md5, ref T fileInfo) where T : RemoteFileInfo; + + /// + /// 获取全路径 + /// + /// + /// + /// + string GetFullPath(string root, string path); + + /// + /// 读取缓存文件信息 + /// + /// + /// + /// + /// + bool TryReadTempInfo(string path, TransferFlags flags, ref TouchRpcFileInfo info); + + /// + /// 读取文件的所有数据 + /// + /// + /// + /// + int ReadAllBytes(FileInfo fileInfo, byte[] buffer); + + /// + /// 写入数据到文件 + /// + /// + /// + /// + /// + void WriteAllBytes(FileInfo fileInfo, byte[] buffer, int offset, int length); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs.meta new file mode 100644 index 0000000..e932d0d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/IFileResourceController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 170265b60a643794dba6af96cb362cb4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs new file mode 100644 index 0000000..8dd017f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs @@ -0,0 +1,80 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// PullSmallFileResult + /// + public class PullSmallFileResult : ResultBase + { + /// + /// 初始化PullSmallFileResult + /// + /// + /// + public PullSmallFileResult(ResultCode resultCode, string message) : base(resultCode, message) + { + } + + /// + /// 初始化PullSmallFileResult + /// + /// + public PullSmallFileResult(byte[] bytes) : base(ResultCode.Success) + { + Value = bytes; + } + + /// + /// 初始化PullSmallFileResult + /// + /// + public PullSmallFileResult(ResultCode resultCode) : base(resultCode) + { + } + + /// + /// 实际的文件数据 + /// + public byte[] Value { get; private set; } + + /// + /// 将拉取的数据保存为文件。 + /// + /// + /// + /// + public Result Save(string path, bool overwrite = true) + { + try + { + if (overwrite) + { + FileUtility.Delete(path); + } + using (FileStorageWriter writer = FilePool.GetWriter(path)) + { + writer.Write(Value); + return Result.Success; + } + } + catch (Exception ex) + { + return new Result(ex); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs.meta new file mode 100644 index 0000000..3a3ecc0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/PullSmallFileResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab100cf9efcc0344eb43fa6fcc1fb61f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs new file mode 100644 index 0000000..89b9c5e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.IO; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RemoteFileInfo + /// + public class RemoteFileInfo : RemoteFileSystemInfo + { + /// + /// 初始化一个RemoteFileInfo + /// + public RemoteFileInfo() + { + } + + /// + /// 从FileInfo初始化一个RemoteFileInfo + /// + /// + public RemoteFileInfo(FileInfo fileInfo) + { + FullName = fileInfo.FullName; + Name = fileInfo.Name; + Length = fileInfo.Length; + Attributes = fileInfo.Attributes; + CreationTime = fileInfo.CreationTime; + LastWriteTime = fileInfo.LastWriteTime; + LastAccessTime = fileInfo.LastAccessTime; + } + + /// + /// 文件MD5 + /// + public string MD5 { get; set; } + + /// + /// 文件大小 + /// + public long Length { get; set; } + + /// + public override void Package(ByteBlock byteBlock) + { + base.Package(byteBlock); + byteBlock.Write(MD5); + byteBlock.Write(Length); + } + + /// + public override void Unpackage(ByteBlock byteBlock) + { + base.Unpackage(byteBlock); + MD5 = byteBlock.ReadString(); + Length = byteBlock.ReadInt64(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs.meta new file mode 100644 index 0000000..c15413d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6bf089bae632aec489643334881bba22 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs new file mode 100644 index 0000000..778823e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 远程文件控制器。 + /// + public class RemoteFileOperator : StreamOperator + { + internal void SetFileCompletedLength(long completedLength) + { + this.completedLength = completedLength; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs.meta new file mode 100644 index 0000000..25b7658 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6aec5df6b231ff347ae6acc8c75da7db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs new file mode 100644 index 0000000..ea913be --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs @@ -0,0 +1,76 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 远程文件系统信息 + /// + public abstract class RemoteFileSystemInfo : PackageBase + { + /// + /// 目录或文件的名称。 + /// + public string Name { get; set; } + + /// + /// 目录或文件的完整目录。 + /// + public string FullName { get; set; } + + /// + /// 上次写入当前文件或目录的时间 + /// + public DateTime LastWriteTime { get; set; } + + /// + /// 上次访问当前文件或目录的时间 + /// + public DateTime LastAccessTime { get; set; } + + /// + /// 当前文件或目录的创建时间 + /// + public DateTime CreationTime { get; set; } + + /// + /// 当前文件或目录的特性 + /// + public FileAttributes Attributes { get; set; } + + /// + public override void Package(ByteBlock byteBlock) + { + byteBlock.Write(LastWriteTime); + byteBlock.Write(LastAccessTime); + byteBlock.Write(CreationTime); + byteBlock.Write((int)Attributes); + byteBlock.Write(FullName); + byteBlock.Write(Name); + } + + /// + public override void Unpackage(ByteBlock byteBlock) + { + LastWriteTime = byteBlock.ReadDateTime(); + LastAccessTime = byteBlock.ReadDateTime(); + CreationTime = byteBlock.ReadDateTime(); + Attributes = (FileAttributes)byteBlock.ReadInt32(); + FullName = byteBlock.ReadString(); + Name = byteBlock.ReadString(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs.meta new file mode 100644 index 0000000..e90e053 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/RemoteFileSystemInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f0282d1a387d8de4c85528d75146ceed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs new file mode 100644 index 0000000..2610349 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpcFileInfo + /// + public class TouchRpcFileInfo : RemoteFileInfo + { + /// + /// 流位置 + /// + public long Position { get; set; } + + /// + public override void Package(ByteBlock byteBlock) + { + base.Package(byteBlock); + byteBlock.Write(Position); + } + + /// + public override void Unpackage(ByteBlock byteBlock) + { + base.Unpackage(byteBlock); + Position = byteBlock.ReadInt64(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs.meta new file mode 100644 index 0000000..378e80f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 36b946ab74b521846a3bbd88d0b91e14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs new file mode 100644 index 0000000..9e9c739 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs @@ -0,0 +1,131 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 文件流 + /// + internal class TouchRpcFileStream : DisposableObject + { + private static int m_saveInterval = 1000; + + private TouchRpcFileInfo m_fileInfo; + + private FileStorageWriter m_fileWriter; + private TimeSpan m_lastTime; + + private string m_path; + + private bool m_resume; + + /// + /// 进度保存时间,默认1000毫秒。 + /// + public static int SaveInterval + { + get => m_saveInterval; + set + { + if (value < 0) + { + value = 0; + } + m_saveInterval = value; + } + } + + public FileStorageWriter FileWriter => m_fileWriter; + + public static TouchRpcFileStream Create(string path, ref TouchRpcFileInfo fileInfo, bool resume) + { + TouchRpcFileStream stream = new TouchRpcFileStream(); + stream.m_fileWriter = FilePool.GetWriter(path + ".rrqm"); + stream.m_fileWriter.Position = fileInfo.Position; + stream.m_fileInfo = fileInfo; + stream.m_path = path; + stream.m_resume = resume; + return stream; + } + + public void FinishStream() + { + if (m_fileWriter.Position != m_fileInfo.Length) + { + throw new Exception("已完成传输,但是文件长度不对。"); + } + if (File.Exists(m_path)) + { + File.Delete(m_path); + } + m_fileWriter.SafeDispose(); + + string rrqmPath = m_path + ".rrqm"; + string tempPath = m_path + ".temp"; + + if (!SpinWait.SpinUntil(() => + { + File.Move(rrqmPath, m_path); + if (File.Exists(tempPath)) + { + File.Delete(tempPath); + } + if (File.Exists(m_path)) + { + return true; + } + return false; + }, 5000)) + { + throw new IOException("已完成传输,但是在保存路径并未检测到文件存在。"); + } + } + + public void Write(byte[] buffer, int offset, int length) + { + m_fileWriter.Write(buffer, offset, length); + SaveProgress(); + } + + protected override void Dispose(bool disposing) + { + m_fileWriter.SafeDispose(); + base.Dispose(disposing); + } + + /// + /// 保存进度 + /// + private void SaveProgress() + { + if (m_resume) + { + if (DateTime.Now.TimeOfDay - m_lastTime > TimeSpan.FromMilliseconds(m_saveInterval)) + { + try + { + File.WriteAllText(m_path + ".temp", m_fileInfo.ToJson()); + m_lastTime = DateTime.Now.TimeOfDay; + } + catch + { + } + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs.meta new file mode 100644 index 0000000..15c163b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/TouchRpcFileStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1391f366182f78a419f7ed4ec627d6bf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs new file mode 100644 index 0000000..3cf6c34 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs @@ -0,0 +1,77 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 文件信息 + /// + internal class WaitFileInfoPackage : WaitRouterPackage + { + /// + /// 元数据 + /// + public Metadata Metadata { get; set; } + + /// + /// 文件信息 + /// + public TouchRpcFileInfo FileInfo { get; set; } + + /// + /// 传输标识 + /// + public TransferFlags Flags { get; set; } + + /// + /// 存放路径, + /// 可输入绝对路径,也可以输入相对路径。 + /// 但是必须包含文件名及扩展名。 + /// + public string SavePath { get; set; } + + /// + /// 请求文件路径, + /// 可输入绝对路径,也可以输入相对路径。 + /// + public string ResourcePath { get; set; } + + /// + /// 事件Code + /// + public int EventHashCode { get; set; } + + public override void PackageBody(ByteBlock byteBlock) + { + base.PackageBody(byteBlock); + byteBlock.WritePackage(Metadata); + byteBlock.WritePackage(FileInfo); + byteBlock.Write((byte)Flags); + byteBlock.Write(SavePath); + byteBlock.Write(ResourcePath); + byteBlock.Write(EventHashCode); + } + + public override void UnpackageBody(ByteBlock byteBlock) + { + base.UnpackageBody(byteBlock); + this.Metadata = byteBlock.ReadPackage(); + this.FileInfo = byteBlock.ReadPackage(); + this.Flags = (TransferFlags)byteBlock.ReadByte(); + this.SavePath = byteBlock.ReadString(); + this.ResourcePath = byteBlock.ReadString(); + this.EventHashCode = byteBlock.ReadInt32(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs.meta new file mode 100644 index 0000000..ea518b2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitFileInfoPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b5707c59856904140add7daa087e777c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs new file mode 100644 index 0000000..3095e59 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal class WaitPushFileAckPackage : WaitRouterPackage + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs.meta new file mode 100644 index 0000000..00aa4e0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitPushFileAckPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2fe4b52205d406d49a446166c27168bc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs new file mode 100644 index 0000000..bef738a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs @@ -0,0 +1,43 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal class WaitSmallFilePackage : WaitRouterPackage + { + public byte[] Data { get; set; } + public RemoteFileInfo FileInfo { get; set; } + public int Len { get; set; } + public Metadata Metadata { get; set; } + public string Path { get; set; } + + public override void PackageBody(ByteBlock byteBlock) + { + base.PackageBody(byteBlock); + byteBlock.Write(Path); + byteBlock.WritePackage(Metadata); + byteBlock.WritePackage(FileInfo); + byteBlock.WriteBytesPackage(Data, 0, Len); + } + + public override void UnpackageBody(ByteBlock byteBlock) + { + base.UnpackageBody(byteBlock); + Path = byteBlock.ReadString(); + Metadata = byteBlock.ReadPackage(); + FileInfo = byteBlock.ReadPackage(); + Data = byteBlock.ReadBytesPackage(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs.meta new file mode 100644 index 0000000..78bda53 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitSmallFilePackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: af012743cb32e8c48b1745a6eccb3e0a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs new file mode 100644 index 0000000..8cd7fcb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 等待传输 + /// + internal class WaitTransferPackage : WaitRouterPackage + { + /// + /// 通道标识 + /// + public int ChannelID { get; set; } + + /// + /// 路径 + /// + public string Path { get; set; } + + /// + /// 流位置 + /// + public long Position { get; set; } + + /// + /// 事件Code + /// + public int EventHashCode { get; set; } + + public override void PackageBody(ByteBlock byteBlock) + { + base.PackageBody(byteBlock); + byteBlock.Write(ChannelID); + byteBlock.Write(Path); + byteBlock.Write(Position); + byteBlock.Write(EventHashCode); + } + + public override void UnpackageBody(ByteBlock byteBlock) + { + base.UnpackageBody(byteBlock); + this.ChannelID = byteBlock.ReadInt32(); + this.Path = byteBlock.ReadString(); + this.Position = byteBlock.ReadInt64(); + this.EventHashCode = byteBlock.ReadInt32(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs.meta new file mode 100644 index 0000000..8a27f96 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/File/WaitTransferPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2eff0a64501d8654787b592241e25fc8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue.meta new file mode 100644 index 0000000..b091f3c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b69ecde1550a0d746b1c89c444536c34 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs new file mode 100644 index 0000000..dcb3775 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 投递事件 + /// + public class DeliverEventArgs : EventArgs + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs.meta new file mode 100644 index 0000000..13fe15d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/DeliverEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17c37849c8d181945950bb4790d49cf6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs new file mode 100644 index 0000000..6f98c33 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs @@ -0,0 +1,49 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// MessageQueueClient + /// + public abstract class MessageQueueClient + { + /// + /// 序列化转换器。 + /// + public BytesConverter Converter { get; set; } + + ///// + ///// 队列 + ///// + ///// + ///// + ///// + ///// + //public abstract void Publish(string queue, byte[] buffer,int offset,int length); + + //public abstract void Subscribe(string queue,Action<> data); + } + + internal class InternalMessageQueueClient : MessageQueueClient + { + private RpcActor m_rpcActor; + + public InternalMessageQueueClient(RpcActor rpcActor, BytesConverter converter) + { + m_rpcActor = rpcActor; + Converter = converter; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs.meta new file mode 100644 index 0000000..375755c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9fcde1cfab7ef7341b9639ead53b43a9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs new file mode 100644 index 0000000..66f9297 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// MessageQueueClientExtensions + /// + public static class MessageQueueClientExtensions + { + /// + /// 获取或设置MessageQueueClient的注入键。 + /// + public static readonly DependencyProperty MessageQueueClientProperty = + DependencyProperty.Register("MessageQueueClient", typeof(MessageQueueClientExtensions), null); + + /// + /// 获取MessageQueueClient + /// + /// + /// + /// + /// + public static MessageQueueClient GetMessageQueueClient(this TClient client) where TClient : IDependencyTouchRpc, IDependencyObject + { + return client.GetValue(MessageQueueClientProperty); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs.meta new file mode 100644 index 0000000..62543ef --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueueClientExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9e0a896a8d32a5447b329051bdcd7186 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs new file mode 100644 index 0000000..5ea3ecc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs @@ -0,0 +1,58 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// MessageQueuePlugin + /// + public class MessageQueuePlugin : TouchRpcPluginBase + { + /// + /// 定义元素的序列化和反序列化。 + /// 注意:Byte[]类型不用考虑。内部单独会做处理。 + /// + public BytesConverter Converter { get; private set; } = new BytesConverter(); + + /// + /// 定义元素的序列化和反序列化。 + /// 注意:Byte[]类型不用考虑。内部单独会做处理。 + /// + /// + public void SetConverter(BytesConverter converter) + { + Converter = converter; + } + + /// + /// + /// + /// + /// + protected override void OnHandshaked(IDependencyTouchRpc client, VerifyOptionEventArgs e) + { + client.SetValue(MessageQueueClientExtensions.MessageQueueClientProperty, new InternalMessageQueueClient(client.RpcActor, Converter)); + base.OnHandshaked(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnReceivedProtocolData(IDependencyTouchRpc client, ProtocolDataEventArgs e) + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs.meta new file mode 100644 index 0000000..3c7c195 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/MessageQueue/MessageQueuePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: af94d50e867ba284d9a965a91319cf7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins.meta new file mode 100644 index 0000000..9ab0801 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eb24d14ae3e6c1644969f77d4c3aefb4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs new file mode 100644 index 0000000..97c8549 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs @@ -0,0 +1,152 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITouchRpcPlugin + /// + public partial interface ITouchRpcPlugin : IPlugin + { + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + [AsyncRaiser] + void OnFileTransfered(ITouchRpc client, FileTransferStatusEventArgs e); + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + /// + Task OnFileTransferedAsync(ITouchRpc client, FileTransferStatusEventArgs e); + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + [AsyncRaiser] + void OnFileTransfering(ITouchRpc client, FileOperationEventArgs e); + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + /// + Task OnFileTransferingAsync(ITouchRpc client, FileOperationEventArgs e); + + /// + /// 在完成握手连接时。 + /// + /// + /// + [AsyncRaiser] + void OnHandshaked(ITouchRpc client, VerifyOptionEventArgs e); + + /// + /// 当需要转发路由包时 + /// + /// + /// + [AsyncRaiser] + void OnRouting(ITouchRpc client, PackageRouterEventArgs e); + + /// + /// 当需要转发路由包时 + /// + /// + /// + Task OnRoutingAsync(ITouchRpc client, PackageRouterEventArgs e); + + /// + /// 在完成握手连接时。 + /// + /// + /// + /// + Task OnHandshakedAsync(ITouchRpc client, VerifyOptionEventArgs e); + + /// + /// 在验证Token时 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnHandshaking(ITouchRpc client, VerifyOptionEventArgs e); + + /// + /// 在验证Token时 + /// + /// + /// + /// + Task OnHandshakingAsync(ITouchRpc client, VerifyOptionEventArgs e); + + /// + /// 收到协议数据 + /// + /// + /// + [AsyncRaiser] + void OnReceivedProtocolData(ITouchRpc client, ProtocolDataEventArgs e); + + /// + /// 收到协议数据 + /// + /// + /// + /// + Task OnReceivedProtocolDataAsync(ITouchRpc client, ProtocolDataEventArgs e); + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// 当流数据传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + [AsyncRaiser] + void OnStreamTransfered(ITouchRpc client, StreamStatusEventArgs e); + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// 当流数据传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + /// + Task OnStreamTransferedAsync(ITouchRpc client, StreamStatusEventArgs e); + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + /// + [AsyncRaiser] + void OnStreamTransfering(ITouchRpc client, StreamOperationEventArgs e); + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + /// + /// + Task OnStreamTransferingAsync(ITouchRpc client, StreamOperationEventArgs e); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs.meta new file mode 100644 index 0000000..ae12a36 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/ITouchRpcPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2793cebe82335e440b0cd28fb7b8de8c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs new file mode 100644 index 0000000..d1e1caf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs @@ -0,0 +1,182 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 具有委托能力的插件 + /// + public sealed partial class TouchRpcActionPlugin : TouchRpcPluginBase where TClient : ITouchRpc + { + private Action m_fileTransfered; + private Action m_fileTransfering; + private Action m_handshaked; + private Action m_handshaking; + private Action m_receivedProtocolData; + private Action m_streamTransfered; + private Action m_streamTransfering; + + /// + /// SetFileTransfered + /// + /// + /// + public TouchRpcActionPlugin SetFileTransfered(Action action) + { + m_fileTransfered = action; + return this; + } + + /// + /// SetFileTransfering + /// + /// + /// + public TouchRpcActionPlugin SetFileTransfering(Action action) + { + m_fileTransfering = action; + return this; + } + + /// + /// SetHandshaked + /// + /// + /// + public TouchRpcActionPlugin SetHandshaked(Action action) + { + m_handshaked = action; + return this; + } + + /// + /// SetHandshaking + /// + /// + /// + public TouchRpcActionPlugin SetHandshaking(Action action) + { + m_handshaking = action; + return this; + } + + /// + /// SetReceivedProtocolData + /// + /// + /// + public TouchRpcActionPlugin SetReceivedProtocolData(Action action) + { + m_receivedProtocolData = action; + return this; + } + + /// + /// SetStreamTransfered + /// + /// + /// + public TouchRpcActionPlugin SetStreamTransfered(Action action) + { + m_streamTransfered = action; + return this; + } + + /// + /// SetStreamTransfering + /// + /// + /// + public TouchRpcActionPlugin SetStreamTransfering(Action action) + { + m_streamTransfering = action; + return this; + } + + #region 重写 + + /// + /// + /// + /// + /// + protected override void OnFileTransfered(ITouchRpc client, FileTransferStatusEventArgs e) + { + m_fileTransfered?.Invoke((TClient)client, e); + } + + /// + /// + /// + /// + /// + protected override void OnFileTransfering(ITouchRpc client, FileOperationEventArgs e) + { + m_fileTransfering?.Invoke((TClient)client, e); + } + + /// + /// + /// + /// + /// + protected override void OnHandshaked(ITouchRpc client, VerifyOptionEventArgs e) + { + m_handshaked?.Invoke((TClient)client, e); + } + + /// + /// + /// + /// + /// + protected override void OnHandshaking(ITouchRpc client, VerifyOptionEventArgs e) + { + m_handshaking?.Invoke((TClient)client, e); + } + + /// + /// + /// + /// + /// + protected override void OnReceivedProtocolData(ITouchRpc client, ProtocolDataEventArgs e) + { + m_receivedProtocolData?.Invoke((TClient)client, e); + } + + /// + /// + /// + /// + /// + protected override void OnStreamTransfered(ITouchRpc client, StreamStatusEventArgs e) + { + m_streamTransfered?.Invoke((TClient)client, e); + } + + /// + /// + /// + /// + /// + protected override void OnStreamTransfering(ITouchRpc client, StreamOperationEventArgs e) + { + m_streamTransfering?.Invoke((TClient)client, e); + } + + #endregion 重写 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs.meta new file mode 100644 index 0000000..b551263 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcActionPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 615bb7d0a28b8d149aad5abea3d64544 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs new file mode 100644 index 0000000..83e849f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs @@ -0,0 +1,119 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpcHeartbeatPlugin + /// + [SingletonPlugin] + public class TouchRpcHeartbeatPlugin : TouchRpcPluginBase where TClient : IDependencyObject, ITcpClientBase, IDependencyTouchRpc + { + private TClient m_client; + + private Thread m_thread; + + /// + /// 连接失败次数。当成功连接时,会重置为0。 + /// + public int FailedCount { get; private set; } + + /// + /// 心跳间隔。默认3秒。 + /// + public TimeSpan Interval { get; set; } = TimeSpan.FromSeconds(3); + + /// + /// 最大失败次数,默认3。 + /// + public int MaxFailCount { get; set; } = 3; + + /// + /// 心跳间隔。默认3秒。 + /// + /// + /// + public TouchRpcHeartbeatPlugin SetInterval(TimeSpan value) + { + if (value == TimeSpan.Zero || value == TimeSpan.MaxValue || value == TimeSpan.MinValue) + { + throw new InvalidTimeZoneException("设置的时间必须为有效值。"); + } + Interval = value; + return this; + } + + /// + /// 最大失败次数,默认3。 + /// + /// + /// + public TouchRpcHeartbeatPlugin SetMaxFailCount(int value) + { + MaxFailCount = value; + return this; + } + + /// + /// + /// + /// + /// + protected override void OnHandshaked(TClient client, VerifyOptionEventArgs e) + { + m_client = client; + if (m_thread == null) + { + m_thread = new Thread(ThreadHeartbeat) + { + IsBackground = true, + Name = $"{client}HeartbeatThread" + }; + m_thread.Start(); + } + base.OnHandshaked(client, e); + } + + private void ThreadHeartbeat(object obj) + { + while (true) + { + if (DisposedValue) + { + return; + } + if (m_client.IsHandshaked && (DateTime.Now.TimeOfDay - m_client.GetLastActiveTime().TimeOfDay > Interval)) + { + if (m_client.Ping()) + { + FailedCount = 0; + } + else + { + FailedCount++; + if (FailedCount > MaxFailCount) + { + m_client.SafeClose("自动心跳失败次数达到最大,已断开连接。"); + } + } + } + + Thread.Sleep(Interval); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs.meta new file mode 100644 index 0000000..c43ed4d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcHeartbeatPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 192bedbacd1d92e4882739e446e16d0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs new file mode 100644 index 0000000..367ac7a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs @@ -0,0 +1,275 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpc插件基类 + /// + public class TouchRpcPluginBase : TouchRpcPluginBase + { + } + + /// + /// TouchRpc插件基类 + /// + public partial class TouchRpcPluginBase : TcpPluginBase, ITouchRpcPlugin + { + #region 虚函数 + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + protected virtual void OnFileTransfered(TClient client, FileTransferStatusEventArgs e) + { + } + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + /// + protected virtual Task OnFileTransferedAsync(TClient client, FileTransferStatusEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + protected virtual void OnFileTransfering(TClient client, FileOperationEventArgs e) + { + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + /// + protected virtual Task OnFileTransferingAsync(TClient client, FileOperationEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在完成握手连接时。 + /// + /// + /// + protected virtual void OnHandshaked(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 在完成握手连接时。 + /// + /// + /// + /// + protected virtual Task OnHandshakedAsync(TClient client, VerifyOptionEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在验证Token时 + /// + /// + /// + protected virtual void OnHandshaking(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 在验证Token时 + /// + /// + /// + /// + protected virtual Task OnHandshakingAsync(TClient client, VerifyOptionEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 收到协议数据 + /// + /// + /// + protected virtual void OnReceivedProtocolData(TClient client, ProtocolDataEventArgs e) + { + } + + /// + /// 收到协议数据 + /// + /// + /// + /// + protected virtual Task OnReceivedProtocolDataAsync(TClient client, ProtocolDataEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 当需要转发路由包时 + /// + /// + /// + protected virtual void OnRouting(TClient client, PackageRouterEventArgs e) + { + } + + /// + /// 当需要转发路由包时 + /// + /// + /// + /// + protected virtual Task OnRoutingAsync(TClient client, PackageRouterEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + /// + /// + protected virtual void OnStreamTransfered(TClient client, StreamStatusEventArgs e) + { + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + /// + /// + /// + protected virtual Task OnStreamTransferedAsync(TClient client, StreamStatusEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + /// + protected virtual void OnStreamTransfering(TClient client, StreamOperationEventArgs e) + { + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + /// + /// + protected virtual Task OnStreamTransferingAsync(TClient client, StreamOperationEventArgs e) + { + return EasyTask.CompletedTask; + } + + #endregion 虚函数 + + void ITouchRpcPlugin.OnFileTransfered(ITouchRpc client, FileTransferStatusEventArgs e) + { + OnFileTransfered((TClient)client, e); + } + + Task ITouchRpcPlugin.OnFileTransferedAsync(ITouchRpc client, FileTransferStatusEventArgs e) + { + return OnFileTransferedAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnFileTransfering(ITouchRpc client, FileOperationEventArgs e) + { + OnFileTransfering((TClient)client, e); + } + + Task ITouchRpcPlugin.OnFileTransferingAsync(ITouchRpc client, FileOperationEventArgs e) + { + return OnFileTransferingAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnHandshaked(ITouchRpc client, VerifyOptionEventArgs e) + { + OnHandshaked((TClient)client, e); + } + + Task ITouchRpcPlugin.OnHandshakedAsync(ITouchRpc client, VerifyOptionEventArgs e) + { + return OnHandshakedAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnHandshaking(ITouchRpc client, VerifyOptionEventArgs e) + { + OnHandshaking((TClient)client, e); + } + + Task ITouchRpcPlugin.OnHandshakingAsync(ITouchRpc client, VerifyOptionEventArgs e) + { + return OnHandshakingAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnReceivedProtocolData(ITouchRpc client, ProtocolDataEventArgs e) + { + OnReceivedProtocolData((TClient)client, e); + } + + Task ITouchRpcPlugin.OnReceivedProtocolDataAsync(ITouchRpc client, ProtocolDataEventArgs e) + { + return OnReceivedProtocolDataAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnRouting(ITouchRpc client, PackageRouterEventArgs e) + { + OnRouting((TClient)client, e); + } + + Task ITouchRpcPlugin.OnRoutingAsync(ITouchRpc client, PackageRouterEventArgs e) + { + return OnRoutingAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnStreamTransfered(ITouchRpc client, StreamStatusEventArgs e) + { + OnStreamTransfered((TClient)client, e); + } + + Task ITouchRpcPlugin.OnStreamTransferedAsync(ITouchRpc client, StreamStatusEventArgs e) + { + return OnStreamTransferedAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnStreamTransfering(ITouchRpc client, StreamOperationEventArgs e) + { + OnStreamTransfering((TClient)client, e); + } + + Task ITouchRpcPlugin.OnStreamTransferingAsync(ITouchRpc client, StreamOperationEventArgs e) + { + return OnStreamTransferingAsync((TClient)client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs.meta new file mode 100644 index 0000000..eb5d0ee --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/TouchRpcPluginBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef49e076f20224d469ed10e03db0373a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs new file mode 100644 index 0000000..f98b187 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs @@ -0,0 +1,298 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// WSTouchRpc插件基类 + /// + public partial class WSTouchRpcPluginBase :PluginBase, ITouchRpcPlugin, IDisconnectedPlguin where TClient: IWSTouchRpcClientBase + { + #region 虚函数 + + /// + /// 在断开连接时 + /// + /// + /// + protected virtual void OnDisconnected(TClient client, DisconnectEventArgs e) + { + } + + /// + /// 会话断开后触发 + /// + /// + /// + /// + protected virtual Task OnDisconnectedAsync(TClient client, DisconnectEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + protected virtual void OnFileTransfered(TClient client, FileTransferStatusEventArgs e) + { + } + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + /// + /// + /// + protected virtual Task OnFileTransferedAsync(TClient client, FileTransferStatusEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + protected virtual void OnFileTransfering(TClient client, FileOperationEventArgs e) + { + } + + /// + /// 在文件传输即将进行时触发。 + /// + /// + /// + /// + protected virtual Task OnFileTransferingAsync(TClient client, FileOperationEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在完成握手连接时。 + /// + /// + /// + protected virtual void OnHandshaked(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 在完成握手连接时。 + /// + /// + /// + /// + protected virtual Task OnHandshakedAsync(TClient client, VerifyOptionEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在验证Token时 + /// + /// + /// + protected virtual void OnHandshaking(TClient client, VerifyOptionEventArgs e) + { + } + + /// + /// 在验证Token时 + /// + /// + /// + /// + protected virtual Task OnHandshakingAsync(TClient client, VerifyOptionEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 收到协议数据 + /// + /// + /// + protected virtual void OnReceivedProtocolData(TClient client, ProtocolDataEventArgs e) + { + } + + /// + /// 收到协议数据 + /// + /// + /// + /// + protected virtual Task OnReceivedProtocolDataAsync(TClient client, ProtocolDataEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 当需要转发路由包时 + /// + /// + /// + protected virtual void OnRouting(TClient client, PackageRouterEventArgs e) + { + } + + /// + /// 当需要转发路由包时 + /// + /// + /// + /// + protected virtual Task OnRoutingAsync(TClient client, PackageRouterEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + /// + /// + protected virtual void OnStreamTransfered(TClient client, StreamStatusEventArgs e) + { + } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + /// + /// + /// + protected virtual Task OnStreamTransferedAsync(TClient client, StreamStatusEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + /// + protected virtual void OnStreamTransfering(TClient client, StreamOperationEventArgs e) + { + } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + /// + /// + /// + protected virtual Task OnStreamTransferingAsync(TClient client, StreamOperationEventArgs e) + { + return EasyTask.CompletedTask; + } + + #endregion 虚函数 + + void IDisconnectedPlguin.OnDisconnected(object client, DisconnectEventArgs e) + { + OnDisconnected((TClient)client, e); + } + + Task IDisconnectedPlguin.OnDisconnectedAsync(object client, DisconnectEventArgs e) + { + return OnDisconnectedAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnFileTransfered(ITouchRpc client, FileTransferStatusEventArgs e) + { + OnFileTransfered((TClient)client, e); + } + + Task ITouchRpcPlugin.OnFileTransferedAsync(ITouchRpc client, FileTransferStatusEventArgs e) + { + return OnFileTransferedAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnFileTransfering(ITouchRpc client, FileOperationEventArgs e) + { + OnFileTransfering((TClient)client, e); + } + + Task ITouchRpcPlugin.OnFileTransferingAsync(ITouchRpc client, FileOperationEventArgs e) + { + return OnFileTransferingAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnHandshaked(ITouchRpc client, VerifyOptionEventArgs e) + { + OnHandshaked((TClient)client, e); + } + + Task ITouchRpcPlugin.OnHandshakedAsync(ITouchRpc client, VerifyOptionEventArgs e) + { + return OnHandshakedAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnHandshaking(ITouchRpc client, VerifyOptionEventArgs e) + { + OnHandshaking((TClient)client, e); + } + + Task ITouchRpcPlugin.OnHandshakingAsync(ITouchRpc client, VerifyOptionEventArgs e) + { + return OnHandshakingAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnReceivedProtocolData(ITouchRpc client, ProtocolDataEventArgs e) + { + OnReceivedProtocolData((TClient)client, e); + } + + Task ITouchRpcPlugin.OnReceivedProtocolDataAsync(ITouchRpc client, ProtocolDataEventArgs e) + { + return OnReceivedProtocolDataAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnRouting(ITouchRpc client, PackageRouterEventArgs e) + { + OnRouting((TClient)client, e); + } + + Task ITouchRpcPlugin.OnRoutingAsync(ITouchRpc client, PackageRouterEventArgs e) + { + return OnRoutingAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnStreamTransfered(ITouchRpc client, StreamStatusEventArgs e) + { + OnStreamTransfered((TClient)client, e); + } + + Task ITouchRpcPlugin.OnStreamTransferedAsync(ITouchRpc client, StreamStatusEventArgs e) + { + return OnStreamTransferedAsync((TClient)client, e); + } + + void ITouchRpcPlugin.OnStreamTransfering(ITouchRpc client, StreamOperationEventArgs e) + { + OnStreamTransfering((TClient)client, e); + } + + Task ITouchRpcPlugin.OnStreamTransferingAsync(ITouchRpc client, StreamOperationEventArgs e) + { + return OnStreamTransferingAsync((TClient)client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs.meta new file mode 100644 index 0000000..f703b44 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Plugins/WSTouchRpcPluginBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7d7f2ab22c45df54aad76f5d59d67eef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis.meta new file mode 100644 index 0000000..e91063e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7bbe9bc790bbdb54280b62c21179fc86 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs new file mode 100644 index 0000000..9a03dc0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs @@ -0,0 +1,576 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 具有远程键值存贮的操作端。 + /// + public abstract class RedisClient : ICache + { + /// + /// 序列化转换器。 + /// + public BytesConverter Converter { get; set; } + + /// + /// 超时设定。默认30000ms + /// + public int Timeout { get; set; } = 30 * 1000; + + /// + /// + /// + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public bool Add(string key, TValue value, int duration = 60000) + { + var cache = new CacheEntry(key) + { + Duration = TimeSpan.FromSeconds(duration) + }; + if (!(value is byte[])) + { + cache.Value = Converter.ConvertTo(value); + } + return AddCache(cache); + } + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public bool AddCache(ICacheEntry entity) + { + if (ContainsCache(entity.Key)) + { + return false; + } + else + { + return SetCache(entity); + } + } + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public Task AddCacheAsync(ICacheEntry entity) + { + return EasyTask.Run(() => + { + return AddCache(entity); + }); + } + + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public abstract void ClearCache(); + + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public Task ClearCacheAsync() + { + return EasyTask.Run(() => + { + ClearCache(); + }); + } + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public abstract bool ContainsCache(string key); + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public Task ContainsCacheAsync(string key) + { + return EasyTask.Run(() => + { + return ContainsCache(key); + }); + } + + /// + /// 获取缓存的键值对。 + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public TValue Get(string key) + { + if (TryGet(key, out var cache)) + { + return cache; + } + return default; + } + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public abstract ICacheEntry GetCache(string key); + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public Task> GetCacheAsync(string key) + { + return EasyTask.Run(() => + { + return GetCache(key); + }); + } + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public abstract bool RemoveCache(string key); + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public Task RemoveCacheAsync(string key) + { + return EasyTask.Run(() => + { + return RemoveCache(key); + }); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public bool Set(string key, TValue value, int duration = 60000) + { + var cache = new CacheEntry(key) + { + Duration = TimeSpan.FromSeconds(duration) + }; + if (value is byte[] bytes) + { + cache.Value = bytes; + } + else + { + cache.Value = Converter.ConvertTo(value); + } + return SetCache(cache); + } + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public abstract bool SetCache(ICacheEntry entity); + + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public Task SetCacheAsync(ICacheEntry entity) + { + return EasyTask.Run(() => + { + return SetCache(entity); + }); + } + + /// + /// 获取指定键的值。 + /// + /// + /// + /// + /// + /// 参数为空 + /// 操作超时 + /// 其他异常 + public bool TryGet(string key, out TValue value) + { + var cache = GetCache(key); + + if (cache != null) + { + if (cache.Value is null) + { + value = default; + return true; + } + if (cache.Value is TValue value1) + { + value = value1; + return true; + } + value = (TValue)Converter.ConvertFrom(cache.Value, typeof(TValue)); + return true; + } + value = default; + return false; + } + } + + /// + /// RedisClient + /// + internal class InternalRedisClient : RedisClient + { + private readonly RpcActor m_rpcActor; + + public InternalRedisClient(RpcActor rpcActor, BytesConverter converter) + { + m_rpcActor = rpcActor; + Converter = converter; + } + + public override void ClearCache() + { + var package = new RedisRequestWaitPackage + { + packageType = RedisPackageType.Clear + }; + + var waitData = m_rpcActor.WaitHandlePool.GetWaitData(package); + try + { + using (ByteBlock byteBlock = new ByteBlock()) + { + package.Package(byteBlock); + m_rpcActor.Send(TouchRpcUtility.P_600_Redis_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + switch (waitData.Wait(Timeout)) + { + case WaitDataStatus.SetRunning: + { + if (waitData.WaitResult.Status == 1) + { + return; + } + else + { + throw new Exception(waitData.WaitResult.Message); + } + } + case WaitDataStatus.Overtime: throw new TimeoutException(TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + } + finally + { + m_rpcActor.WaitHandlePool.Destroy(waitData); + } + } + + public override bool ContainsCache(string key) + { + if (string.IsNullOrEmpty(key)) + { + throw new ArgumentException($"“{nameof(key)}”不能为 null 或空。", nameof(key)); + } + + var package = new RedisRequestWaitPackage + { + key = key, + packageType = RedisPackageType.Contains + }; + + var waitData = m_rpcActor.WaitHandlePool.GetWaitData(package); + try + { + using (ByteBlock byteBlock = new ByteBlock()) + { + package.Package(byteBlock); + m_rpcActor.Send(TouchRpcUtility.P_600_Redis_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + switch (waitData.Wait(Timeout)) + { + case WaitDataStatus.SetRunning: + { + if (waitData.WaitResult.Status == 1) + { + return true; + } + else if (waitData.WaitResult.Status == byte.MaxValue) + { + return false; + } + else + { + throw new Exception(waitData.WaitResult.Message); + } + } + case WaitDataStatus.Overtime: throw new TimeoutException(TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + } + finally + { + m_rpcActor.WaitHandlePool.Destroy(waitData); + } + } + + public override ICacheEntry GetCache(string key) + { + if (string.IsNullOrEmpty(key)) + { + throw new ArgumentException($"“{nameof(key)}”不能为 null 或空。", nameof(key)); + } + + RedisRequestWaitPackage package = new RedisRequestWaitPackage() + { + key = key, + packageType = RedisPackageType.Get + }; + + var waitData = m_rpcActor.WaitHandlePool.GetWaitData(package); + try + { + using (ByteBlock byteBlock = new ByteBlock((package.value == null ? 0 : package.value.Length) + 1024)) + { + package.Package(byteBlock); + m_rpcActor.Send(TouchRpcUtility.P_600_Redis_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + switch (waitData.Wait(Timeout)) + { + case WaitDataStatus.SetRunning: + { + RedisResponseWaitPackage responsePackage = (RedisResponseWaitPackage)waitData.WaitResult; + if (responsePackage.Status == 1) + { + return new CacheEntry(key) + { + Value = responsePackage.value + }; + } + else if (responsePackage.Status == byte.MaxValue) + { + return new CacheEntry(key); + } + else + { + return default; + } + } + case WaitDataStatus.Overtime: throw new TimeoutException(TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new TimeoutException(TouchSocketStatus.UnknownError.GetDescription()); + } + } + finally + { + m_rpcActor.WaitHandlePool.Destroy(waitData); + } + } + + public override bool RemoveCache(string key) + { + if (string.IsNullOrEmpty(key)) + { + throw new ArgumentException($"“{nameof(key)}”不能为 null 或空。", nameof(key)); + } + + var package = new RedisRequestWaitPackage + { + key = key, + packageType = RedisPackageType.Remove + }; + + var waitData = m_rpcActor.WaitHandlePool.GetWaitData(package); + try + { + using (ByteBlock byteBlock = new ByteBlock((package.value == null ? 0 : package.value.Length) + 1024)) + { + package.Package(byteBlock); + m_rpcActor.Send(TouchRpcUtility.P_600_Redis_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + switch (waitData.Wait(Timeout)) + { + case WaitDataStatus.SetRunning: + { + if (waitData.WaitResult.Status == 1) + { + return true; + } + else if (waitData.WaitResult.Status == byte.MaxValue) + { + return false; + } + else + { + throw new Exception(waitData.WaitResult.Message); + } + } + case WaitDataStatus.Overtime: throw new TimeoutException(Resources.TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: return false; + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new TimeoutException(Resources.TouchSocketStatus.UnknownError.GetDescription()); + } + } + finally + { + m_rpcActor.WaitHandlePool.Destroy(waitData); + } + } + + public override bool SetCache(ICacheEntry cache) + { + if (string.IsNullOrEmpty(cache.Key)) + { + throw new ArgumentException($"“{nameof(cache.Key)}”不能为 null 或空。", nameof(cache.Key)); + } + + if (cache is null) + { + throw new ArgumentNullException(nameof(cache)); + } + + var package = new RedisRequestWaitPackage + { + key = cache.Key, + timeSpan = cache.Duration, + value = cache.Value, + packageType = RedisPackageType.Set + }; + + var waitData = m_rpcActor.WaitHandlePool.GetWaitData(package); + try + { + using (ByteBlock byteBlock = new ByteBlock((package.value == null ? 0 : package.value.Length) + 1024)) + { + package.Package(byteBlock); + m_rpcActor.Send(TouchRpcUtility.P_600_Redis_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + switch (waitData.Wait(Timeout)) + { + case WaitDataStatus.SetRunning: + { + if (waitData.WaitResult.Status == 1) + { + return true; + } + else if (waitData.WaitResult.Status == byte.MaxValue) + { + return false; + } + else + { + throw new Exception(waitData.WaitResult.Message); + } + } + case WaitDataStatus.Overtime: throw new TimeoutException(Resources.TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: return false; + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new TimeoutException(Resources.TouchSocketStatus.UnknownError.GetDescription()); + } + } + finally + { + m_rpcActor.WaitHandlePool.Destroy(waitData); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs.meta new file mode 100644 index 0000000..90b61a0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 608d8d758854d5a4e95b2190f92bfc63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs new file mode 100644 index 0000000..14b1c25 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RedisClientExtensions + /// + public static class RedisClientExtensions + { + /// + /// 获取或设置RedisClient的注入键。 + /// + public static readonly DependencyProperty RedisClientProperty = + DependencyProperty.Register("RedisClient", typeof(RedisClientExtensions), null); + + /// + /// 获取RedisClient + /// + /// + /// + /// + /// + public static RedisClient GetRedisClient(this TClient client) where TClient : IDependencyTouchRpc, IDependencyObject + { + return client.GetValue(RedisClientProperty); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs.meta new file mode 100644 index 0000000..e952654 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisClientExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c8734a48bb14c048b8f3ad0576b1eb7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs new file mode 100644 index 0000000..422d89e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.TouchRpc +{ + internal enum RedisPackageType : byte + { + Set, + Get, + Contains, + Remove, + Clear + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs.meta new file mode 100644 index 0000000..d797026 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPackageType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2697eef65a3e904d93b822545ef6279 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs new file mode 100644 index 0000000..74e849a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs @@ -0,0 +1,181 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RedisPlugin + /// + public class RedisPlugin : TouchRpcPluginBase + { + /// + /// 定义元素的序列化和反序列化。 + /// 注意:Byte[]类型不用考虑。内部单独会做处理。 + /// + public BytesConverter Converter { get; private set; } = new BytesConverter(); + + /// + /// 实际储存缓存。 + /// + public ICache ICache { get; set; } = new MemoryCache(); + + /// + /// 设置实际储存缓存。 + /// + /// + public void SetCache(ICache cache) + { + ICache = cache; + } + + /// + /// 定义元素的序列化和反序列化。 + /// 注意:Byte[]类型不用考虑。内部单独会做处理。 + /// + /// + public void SetConverter(BytesConverter converter) + { + Converter = converter; + } + + /// + /// + /// + /// + /// + protected override void OnHandshaked(IDependencyTouchRpc client, VerifyOptionEventArgs e) + { + client.SetValue(RedisClientExtensions.RedisClientProperty, new InternalRedisClient(client.RpcActor, Converter)); + base.OnHandshaked(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnReceivedProtocolData(IDependencyTouchRpc client, ProtocolDataEventArgs e) + { + switch (e.Protocol) + { + case TouchRpcUtility.P_600_Redis_Request: + { + var waitResult = new RedisResponseWaitPackage(); + try + { + e.Handled = true; + RedisRequestWaitPackage package = new RedisRequestWaitPackage(); + package.Unpackage(e.ByteBlock.Seek(2)); + waitResult.Sign = package.Sign; + + switch (package.packageType) + { + case RedisPackageType.Set: + { + bool success = ICache.SetCache(new CacheEntry(package.key) + { + Duration = package.timeSpan.Value, + Value = package.value + }); + if (success) + { + waitResult.Status = 1; + } + else + { + waitResult.Status = byte.MaxValue; + } + break; + } + case RedisPackageType.Get: + { + var cache = ICache.GetCache(package.key); + if (cache != null) + { + waitResult.Status = 1; + waitResult.value = cache.Value; + } + else + { + waitResult.Status = byte.MaxValue; + } + } + break; + + case RedisPackageType.Contains: + { + if (ICache.ContainsCache(package.key)) + { + waitResult.Status = 1; + } + else + { + waitResult.Status = byte.MaxValue; + } + } + break; + + case RedisPackageType.Remove: + { + if (ICache.RemoveCache(package.key)) + { + waitResult.Status = 1; + } + else + { + waitResult.Status = byte.MaxValue; + } + } + break; + + case RedisPackageType.Clear: + { + ICache.ClearCache(); + waitResult.Status = 1; + } + break; + + default: + return; + } + } + catch (Exception ex) + { + waitResult.Status = 2; + waitResult.Message = ex.Message; + } + + using (ByteBlock byteBlock = new ByteBlock()) + { + waitResult.Package(byteBlock); + client.Send(TouchRpcUtility.P_1600_Redis_Response, byteBlock.Buffer, 0, byteBlock.Len); + } + break; + } + + case TouchRpcUtility.P_1600_Redis_Response: + { + e.Handled = true; + var waitResult = new RedisResponseWaitPackage(); + waitResult.Unpackage(e.ByteBlock.Seek(2)); + client.RpcActor.WaitHandlePool.SetRun(waitResult); + break; + } + default: + break; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs.meta new file mode 100644 index 0000000..a356263 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4d6166c9c3cd4b84185594f907624eb8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs new file mode 100644 index 0000000..1d6ff95 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal class RedisRequestWaitPackage : RedisResponseWaitPackage + { + public string key; + public TimeSpan? timeSpan; + public RedisPackageType packageType; + + public override void Package(ByteBlock byteBlock) + { + base.Package(byteBlock); + byteBlock.Write(key); + byteBlock.Write((byte)packageType); + if (timeSpan.HasValue) + { + byteBlock.Write((byte)1); + byteBlock.Write(timeSpan.Value); + } + else + { + byteBlock.Write((byte)0); + } + } + + public override void Unpackage(ByteBlock byteBlock) + { + base.Unpackage(byteBlock); + key = byteBlock.ReadString(); + packageType = (RedisPackageType)byteBlock.ReadByte(); + if (byteBlock.ReadByte() == 1) + { + timeSpan = byteBlock.ReadTimeSpan(); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs.meta new file mode 100644 index 0000000..bccaad5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisRequestWaitPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8bb39f37b641ef4287fed57cdd2cba7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs new file mode 100644 index 0000000..83eaccf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal class RedisResponseWaitPackage : WaitPackage + { + public byte[] value; + + public override void Package(ByteBlock byteBlock) + { + base.Package(byteBlock); + byteBlock.WriteBytesPackage(value); + } + + public override void Unpackage(ByteBlock byteBlock) + { + base.Unpackage(byteBlock); + value = byteBlock.ReadBytesPackage(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs.meta new file mode 100644 index 0000000..3c6b7ca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Redis/RedisResponseWaitPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3110e29ddf6420542ae874a65e5b21c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc.meta new file mode 100644 index 0000000..03a581d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 201d7a06636f2ed478b7068664f45630 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs new file mode 100644 index 0000000..7ca4b5c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal class CanceledPackage : RouterPackage + { + public long Sign { get; set; } + + public override void PackageBody(ByteBlock byteBlock) + { + byteBlock.Write(Sign); + } + + public override void UnpackageBody(ByteBlock byteBlock) + { + Sign = byteBlock.ReadInt64(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs.meta new file mode 100644 index 0000000..e4a6592 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/CanceledPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a5d512f5d80ec734fbc1cfc90ae81aa4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs new file mode 100644 index 0000000..e1e7d73 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs @@ -0,0 +1,104 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Rpc调用设置 + /// + public struct InvokeOption : IInvokeOption + { + /// + /// 默认设置。 + /// Timeout=5000ms + /// + public static InvokeOption OnlySend; + + /// + /// 默认设置。 + /// Timeout=5000ms + /// + public static InvokeOption WaitInvoke; + + /// + /// 默认设置。 + /// Timeout=5000 ms + /// + public static InvokeOption WaitSend; + + private int m_timeout; + + static InvokeOption() + { + OnlySend = new InvokeOption(timeout: 5000); + OnlySend.FeedbackType = FeedbackType.OnlySend; + + WaitSend = new InvokeOption(timeout: 5000); + WaitSend.FeedbackType = FeedbackType.WaitSend; + + WaitInvoke = new InvokeOption(timeout: 5000); + WaitInvoke.FeedbackType = FeedbackType.WaitInvoke; + } + + /// + /// 构造函数 + /// + /// + /// + /// + /// + public InvokeOption(int timeout = 5000, FeedbackType feedbackType = FeedbackType.WaitInvoke, SerializationType serializationType = SerializationType.FastBinary, + CancellationToken cancellationToken = default) : this() + { + Timeout = timeout; + FeedbackType = feedbackType; + SerializationType = serializationType; + Token = cancellationToken; + } + + /// + /// 调用反馈 + /// + public FeedbackType FeedbackType { get; set; } + + /// + /// TouchRpc序列化类型 + /// + public SerializationType SerializationType { get; set; } + + /// + /// 调用超时, + /// min=1000,默认5000 ms + /// + public int Timeout + { + get + { + if (m_timeout < 1000) + { + return 5000; + } + return m_timeout; + } + set => m_timeout = value; + } + + /// + /// 可以取消的调用令箭 + /// + public CancellationToken Token { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs.meta new file mode 100644 index 0000000..0b9d4a9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/InvokeOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bfe47086f9a75e468ecc2c4d2be1852 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization.meta new file mode 100644 index 0000000..039dd0b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 594b395f960a94d4c9faa4cbf4358887 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs new file mode 100644 index 0000000..d171c19 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs @@ -0,0 +1,96 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Text; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 默认序列化选择器 + /// + public class DefaultSerializationSelector : SerializationSelector + { + /// + /// 反序列化 + /// + /// + /// + /// + /// + public override object DeserializeParameter(SerializationType serializationType, byte[] parameterBytes, Type parameterType) + { + if (parameterBytes == null) + { + return parameterType.GetDefault(); + } + switch (serializationType) + { + case SerializationType.FastBinary: + { + return SerializeConvert.FastBinaryDeserialize(parameterBytes, 0, parameterType); + } + case SerializationType.SystemBinary: + { + return SerializeConvert.BinaryDeserialize(parameterBytes, 0, parameterBytes.Length); + } + case SerializationType.Json: + { + return Encoding.UTF8.GetString(parameterBytes).FromJson(parameterType); + } + case SerializationType.Xml: + { + return SerializeConvert.XmlDeserializeFromBytes(parameterBytes, parameterType); + } + default: + throw new RpcException("未指定的反序列化方式"); + } + } + + /// + /// 序列化参数 + /// + /// + /// + /// + public override byte[] SerializeParameter(SerializationType serializationType, object parameter) + { + if (parameter == null) + { + return null; + } + switch (serializationType) + { + case SerializationType.FastBinary: + { + return SerializeConvert.FastBinarySerialize(parameter); + } + case SerializationType.SystemBinary: + { + return SerializeConvert.BinarySerialize(parameter); + } + case SerializationType.Json: + { + return SerializeConvert.JsonSerializeToBytes(parameter); + } + case SerializationType.Xml: + { + return SerializeConvert.XmlSerializeToBytes(parameter); + } + default: + throw new RpcException("未指定的序列化方式"); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs.meta new file mode 100644 index 0000000..74021fd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/DefaultSerializationSelector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8b638c3059172244c96733e4ccb96401 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs new file mode 100644 index 0000000..89c6d21 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 序列化选择器 + /// + public abstract class SerializationSelector + { + /// + /// 序列化Rpc方法返回值参数 + /// + /// + /// + /// + public abstract byte[] SerializeParameter(SerializationType serializationType, object parameter); + + /// + /// 反序列化传输对象 + /// + /// + /// + /// + /// + public abstract object DeserializeParameter(SerializationType serializationType, byte[] parameterBytes, Type parameterType); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs.meta new file mode 100644 index 0000000..a4ec049 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/Serialization/SerializationSelector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e6e760a8d2644e54d89a1ba083d95d55 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs new file mode 100644 index 0000000..cb1b946 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// TouchRpc上下文 + /// + internal class TouchRpcCallContext : ITouchRpcCallContext + { + private CancellationTokenSource m_tokenSource; + + /// + /// 当不为空时,调用 + /// + /// + public bool TryCancel() + { + if (m_tokenSource != null) + { + m_tokenSource.Cancel(); + return true; + } + return false; + } + + /// + /// + /// + public object Caller { get; internal set; } + + /// + /// 能取消的调用令箭,在客户端主动取消或网络故障时生效 + /// + public CancellationTokenSource TokenSource + { + get + { + if (m_tokenSource == null) + { + m_tokenSource = new CancellationTokenSource(); + } + return m_tokenSource; + } + } + + /// + /// TouchRpcContext + /// + public TouchRpcPackage TouchRpcPackage { get; internal set; } + + /// + /// + /// + public MethodInstance MethodInstance { get; internal set; } + + /// + /// 序列化类型 + /// + public SerializationType SerializationType => TouchRpcPackage == null ? (SerializationType)byte.MaxValue : TouchRpcPackage.SerializationType; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs.meta new file mode 100644 index 0000000..fb8a6d9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33f4489acf9bfe5499d63e74a40369c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs new file mode 100644 index 0000000..82485d9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs @@ -0,0 +1,130 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Generic; +using TouchSocket.Core; +using TouchSocket.Resources; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Rpc传输类 + /// + public sealed class TouchRpcPackage : WaitRouterPackage + { + /// + /// 反馈类型 + /// + public FeedbackType Feedback { get; private set; } + + /// + /// 参数是否包含引用类型 + /// + public bool IsByRef { get; internal set; } + + /// + /// 函数名 + /// + public string MethodName { get; internal set; } + + /// + /// 参数数据 + /// + public List ParametersBytes { get; internal set; } + + /// + /// 返回参数数据 + /// + public byte[] ReturnParameterBytes { get; internal set; } + + /// + /// 序列化类型 + /// + public SerializationType SerializationType { get; private set; } + + /// + public override void PackageBody(ByteBlock byteBlock) + { + base.PackageBody(byteBlock); + byteBlock.Write((byte)SerializationType); + byteBlock.Write((byte)Feedback); + byteBlock.Write(IsByRef); + byteBlock.Write(MethodName); + byteBlock.WriteBytesPackage(ReturnParameterBytes); + + if (ParametersBytes != null && ParametersBytes.Count > 0) + { + byteBlock.Write((byte)ParametersBytes.Count); + foreach (byte[] item in ParametersBytes) + { + byteBlock.WriteBytesPackage(item); + } + } + else + { + byteBlock.Write((byte)0); + } + } + + /// + public override void UnpackageBody(ByteBlock byteBlock) + { + base.UnpackageBody(byteBlock); + SerializationType = (SerializationType)byteBlock.ReadByte(); + Feedback = (FeedbackType)byteBlock.ReadByte(); + IsByRef = byteBlock.ReadBoolean(); + MethodName = byteBlock.ReadString(); + ReturnParameterBytes = byteBlock.ReadBytesPackage(); + + byte countPar = (byte)byteBlock.ReadByte(); + ParametersBytes = new List(); + for (int i = 0; i < countPar; i++) + { + ParametersBytes.Add(byteBlock.ReadBytesPackage()); + } + } + + internal void LoadInvokeOption(IInvokeOption option) + { + InvokeOption invokeOption = (InvokeOption)option; + Feedback = invokeOption.FeedbackType; + SerializationType = invokeOption.SerializationType; + } + + internal void ThrowStatus() + { + if (Status == 1) + { + return; + } + switch (Status.ToStatus()) + { + case TouchSocketStatus.ClientNotFind: + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(TargetId)); + } + case TouchSocketStatus.UnknownError: + case TouchSocketStatus.RpcMethodNotFind: + case TouchSocketStatus.RpcMethodDisable: + case TouchSocketStatus.RemoteRefuse: + case TouchSocketStatus.RpcInvokeException: + case TouchSocketStatus.RoutingNotAllowed: + case TouchSocketStatus.Exception: + default: + { + throw new RpcException(Status.ToStatus().GetDescription(Message)); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs.meta new file mode 100644 index 0000000..0f191c1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/TouchRpcPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2499673edd875cf44a6befd477b12a49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs new file mode 100644 index 0000000..6a815c8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Net; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// Udp调用者 + /// + public class UdpCaller + { + private readonly EndPoint callerEndPoint; + + private readonly UdpSessionBase m_service; + + /// + /// 构造函数 + /// + /// + /// + public UdpCaller(UdpSessionBase service, EndPoint callerEndPoint) + { + m_service = service; + this.callerEndPoint = callerEndPoint; + } + + /// + /// 调用者终结点 + /// + public EndPoint CallerEndPoint => callerEndPoint; + + /// + /// Udp服务器 + /// + public UdpSessionBase Service => m_service; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs.meta new file mode 100644 index 0000000..6bb8061 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Rpc/UdpCaller.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8c167187735beeb48b86901bc2944dbe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor.meta new file mode 100644 index 0000000..2f69c33 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d01d2ea949945314da7c0a13503839d8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface.meta new file mode 100644 index 0000000..2db3b1c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 272b7accca6a6ab4da13071d557c2abc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs new file mode 100644 index 0000000..3ab79b2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs @@ -0,0 +1,125 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// IDRpcActor + /// + public class IDRpcActor : IRpcClient + { + private readonly string m_targetId; + private readonly IRpcActor m_rpcActor; + + /// + /// 构造函数 + /// + /// + /// + public IDRpcActor(string targetId, IRpcActor rpcActor) + { + m_targetId = targetId; + m_rpcActor = rpcActor; + } + + /// + /// + /// + public Func TryCanInvoke { get => m_rpcActor.TryCanInvoke; set => m_rpcActor.TryCanInvoke = value; } + + /// + /// + /// + public void Dispose() + { + m_rpcActor.Dispose(); + } + + /// + /// + /// + /// + /// + /// + public void Invoke(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + m_rpcActor.Invoke(m_targetId, invokeKey, invokeOption, parameters); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public T Invoke(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.Invoke(m_targetId, invokeKey, invokeOption, parameters); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public T Invoke(string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + return m_rpcActor.Invoke(m_targetId, invokeKey, invokeOption, ref parameters, types); + } + + /// + /// + /// + /// + /// + /// + /// + public void Invoke(string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + m_rpcActor.Invoke(m_targetId, invokeKey, invokeOption, ref parameters, types); + } + + /// + /// + /// + /// + /// + /// + /// + public Task InvokeAsync(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(m_targetId, invokeKey, invokeOption, parameters); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public Task InvokeAsync(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + return m_rpcActor.InvokeAsync(m_targetId, invokeKey, invokeOption, parameters); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs.meta new file mode 100644 index 0000000..8c65c57 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IDRpcActor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4cad39127a33124aa34ab8530fe1dd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs new file mode 100644 index 0000000..83919c0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs @@ -0,0 +1,160 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RpcActor接口 + /// + public partial interface IRpcActor : IRpcActorBase, IRpcClient, ITargetRpcActor + { + /// + /// 表示是否已经完成握手连接。 + /// + bool IsHandshaked { get; } + + /// + /// 根路径 + /// + string RootPath { get; set; } + + /// + /// 判断使用该ID的Channel是否存在。 + /// + /// + /// + bool ChannelExisted(int id); + + /// + /// 创建通道 + /// + /// + /// + Channel CreateChannel(); + + /// + /// 创建通道 + /// + /// 指定ID + /// + /// + Channel CreateChannel(int id); + + /// + /// 从对点拉取文件 + /// + /// + /// + Result PullFile(FileOperator fileOperator); + + /// + /// 异步从对点拉取文件 + /// + /// + /// + Task PullFileAsync(FileOperator fileOperator); + + /// + /// 拉取小文件。默认设置1024*1024字节大小。 + /// + /// 请求路径 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + /// + /// 拉取小文件。默认设置1024*1024字节大小。 + /// + /// 请求路径 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + /// + /// 向对点推送文件 + /// + /// + /// + Result PushFile(FileOperator fileOperator); + + /// + /// 异步向对点推送文件 + /// + /// + /// + Task PushFileAsync(FileOperator fileOperator); + + /// + /// 推送小文件。默认设置1024*1024字节大小。 + /// + /// 保存路径 + /// 推送的文件信息 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + /// + /// 推送小文件。默认设置1024*1024字节大小。 + /// + /// 保存路径 + /// 推送的文件信息 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + /// + /// 重新设置ID + /// + /// + void ResetID(string newId); + + /// + /// 发送流数据 + /// + /// + /// + /// + /// + Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = default); + + /// + /// 异步发送流数据 + /// + /// + /// + /// + /// + Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = default); + + /// + /// 订阅通道 + /// + /// + /// + /// + bool TrySubscribeChannel(int id, out Channel channel); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs.meta new file mode 100644 index 0000000..f1401ff --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e437a58f0756c62438261ce98cfd83cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs new file mode 100644 index 0000000..830eadc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RpcActorBase + /// + public interface IRpcActorBase:IRpcActorSender + { + /// + /// 日志记录器 + /// + ILog Logger { get; } + + /// + /// 序列化选择器 + /// + SerializationSelector SerializationSelector { get; } + + /// + /// 向通信的对方执行ping。 + /// + /// + /// 如果返回True,则表示一定在线。如果返回false,则不一定代表不在线。 + bool Ping(int timeout = 5000); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs.meta new file mode 100644 index 0000000..5720196 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a22d08984d05024c9e7783483775f3e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs new file mode 100644 index 0000000..e4b2c65 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 带有协议的发送 + /// + public interface IRpcActorSender + { + /// + /// 发送字节 + /// + /// + /// + /// + /// + void Send(short protocol, byte[] buffer, int offset, int length); + + /// + /// 发送字节 + /// + /// + /// + /// + /// + Task SendAsync(short protocol, byte[] buffer, int offset, int length); + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs.meta new file mode 100644 index 0000000..4cf8c98 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/IRpcActorSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 805a2a4ee4b2a77438cfdbd3052ec9e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs new file mode 100644 index 0000000..9e239b4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs @@ -0,0 +1,137 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITargetRpcActor + /// + public partial interface ITargetRpcActor : ITargetRpcClient + { + /// + /// 创建一个和其他客户端的通道 + /// + /// 目标客户端ID + /// + /// + public Channel CreateChannel(string targetId); + + /// + /// 创建一个和其他客户端的通道 + /// + /// 目标客户端ID + /// 通道Id + /// + /// + public Channel CreateChannel(string targetId, int id); + + /// + /// 向指定的Id执行ping。 + /// + /// 目标客户端ID + /// 超时配置 + /// 如果返回True,则表示一定在线。如果返回false,则不一定代表不在线。 + bool Ping(string targetId, int timeout = 5000); + + #region 文件传输 + + /// + /// 从对点拉取文件 + /// + /// 目标客户端ID + /// 文件传输操作器 + /// + Result PullFile(string targetId, FileOperator fileOperator); + + /// + /// 异步从对点拉取文件 + /// + /// 目标客户端ID + /// 文件传输操作器 + /// + Task PullFileAsync(string targetId, FileOperator fileOperator); + + /// + /// 向对点推送文件 + /// + /// 目标客户端ID + /// 文件传输操作器 + /// + Result PushFile(string targetId, FileOperator fileOperator); + + /// + /// 异步向对点推送文件 + /// + /// 目标客户端ID + /// 文件传输操作器 + /// + Task PushFileAsync(string targetId, FileOperator fileOperator); + + #endregion 文件传输 + + #region 小文件 + + /// + /// 拉取小文件。默认设置1024*1024字节大小。 + /// + /// 目标客户端ID + /// 请求路径 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + /// + /// 拉取小文件。默认设置1024*1024字节大小。 + /// + /// 目标客户端Id + /// 请求路径 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + /// + /// 推送小文件到特定的Id。默认设置1024*1024字节大小。 + /// + /// 目标客户端Id + /// 保存路径 + /// 推送的文件信息 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + /// + /// 推送小文件。默认设置1024*1024字节大小。 + /// + /// + /// 保存路径 + /// 推送的文件信息 + /// 元数据 + /// 超时设置 + /// 可取消令箭 + /// + Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default); + + #endregion 小文件 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs.meta new file mode 100644 index 0000000..f330b97 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcActor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f8088fd54befb2d45928f75b2a86080e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs new file mode 100644 index 0000000..be37319 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// ITargetRpcClient + /// + public interface ITargetRpcClient + { + /// + /// 调用对应ID的客户端Rpc + /// + /// 客户端ID + /// 方法名 + /// 调用配置 + /// 参数 + /// 调用超时 + /// 序列化异常 + /// 调用内部异常 + /// 没有找到ID对应的客户端 + /// 其他异常 + Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters); + + /// + /// 调用对应ID的客户端Rpc + /// + /// 客户端ID + /// 方法名 + /// 调用配置 + /// 参数 + /// 调用超时 + /// 序列化异常 + /// 调用内部异常 + /// 没有找到ID对应的客户端 + /// 其他异常 + /// 返回值 + Task InvokeAsync(string targetId, string method, IInvokeOption invokeOption, params object[] parameters); + + /// + /// 调用对应ID的客户端Rpc + /// + /// 客户端ID + /// 方法名 + /// 调用配置 + /// 参数 + /// 调用超时 + /// 序列化异常 + /// 调用内部异常 + /// 没有找到ID对应的客户端 + /// 其他异常 + void Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters); + + /// + /// 调用对应ID的客户端Rpc + /// + /// 客户端ID + /// 方法名 + /// 调用配置 + /// 参数 + /// 调用超时 + /// 序列化异常 + /// 调用内部异常 + /// 没有找到ID对应的客户端 + /// 其他异常 + /// 返回值 + T Invoke(string targetId, string method, IInvokeOption invokeOption, params object[] parameters); + + /// + /// 调用对应ID的客户端Rpc + /// + /// 客户端ID + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// 调用超时 + /// 序列化异常 + /// 调用内部异常 + /// 没有找到ID对应的客户端 + /// 其他异常 + void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types); + + /// + /// 调用对应ID的客户端Rpc + /// + /// 客户端ID + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// 调用超时 + /// 序列化异常 + /// 调用内部异常 + /// 没有找到ID对应的客户端 + /// 其他异常 + /// 返回值 + T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs.meta new file mode 100644 index 0000000..70afd3f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Interface/ITargetRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1f8a02dd7ff25854d92666bb342a8ef7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs new file mode 100644 index 0000000..9f38ec1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs @@ -0,0 +1,228 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using TouchSocket.Core; +using TouchSocket.Resources; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + public partial class RpcActor + { + private readonly ConcurrentDictionary m_userChannels; + + /// + /// + /// + /// + /// + public bool ChannelExisted(int id) + { + return m_userChannels.ContainsKey(id); + } + + /// + public Channel CreateChannel() + { + return this.PrivateCreateChannel(default, true); + } + + /// + public Channel CreateChannel(int id) + { + return this.PrivateCreateChannel(default, false, id); + } + + /// + public Channel CreateChannel(string targetId, int id) + { + if (string.IsNullOrEmpty(targetId)) + { + throw new ArgumentException($"“{nameof(targetId)}”不能为 null 或空。", nameof(targetId)); + } + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor actor)) + { + return actor.CreateChannel(id); + } + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription()); + } + return this.PrivateCreateChannel(targetId, false, id); + } + + private Channel PrivateCreateChannel(string targetId, bool random, int id = 0) + { + lock (SyncRoot) + { + if (random) + { + id = new object().GetHashCode(); + } + else + { + if (ChannelExisted(id)) + { + throw new Exception(TouchSocketStatus.ChannelExisted.GetDescription(id)); + } + } + + ByteBlock byteBlock = new ByteBlock(); + WaitCreateChannelPackage waitCreateChannel = new WaitCreateChannelPackage() + { + Random = random, + ChannelID = id, + SourceId = this.ID, + TargetId = targetId, + Route = targetId.HasValue() + }; + WaitData waitData = WaitHandlePool.GetWaitData(waitCreateChannel); + + try + { + waitCreateChannel.Package(byteBlock); + Send(TouchRpcUtility.P_100_CreateChannel_Request, byteBlock); + switch (waitData.Wait(10 * 1000)) + { + case WaitDataStatus.SetRunning: + { + WaitCreateChannelPackage result = (WaitCreateChannelPackage)waitData.WaitResult; + switch (result.Status.ToStatus()) + { + case TouchSocketStatus.Success: + { + InternalChannel channel = new InternalChannel(this, targetId); + channel.SetID(result.ChannelID); + channel.SetUsing(); + if (m_userChannels.TryAdd(result.ChannelID, channel)) + { + return channel; + } + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + case TouchSocketStatus.ClientNotFind: + { + throw new Exception(TouchSocketStatus.ClientNotFind.GetDescription(targetId)); + } + case TouchSocketStatus.RoutingNotAllowed: + default: + { + throw new Exception(result.Status.ToStatus().GetDescription(result.Message)); + } + } + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException(TouchSocketStatus.Overtime.GetDescription()); + } + default: + { + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + } + + internal void SendChannelPackage(ChannelPackage channelPackage) + { + using (ByteBlock byteBlock = new ByteBlock(channelPackage.GetLen())) + { + channelPackage.Package(byteBlock); + this.Send(TouchRpcUtility.P_101_ChannelPackage, byteBlock); + } + } + + /// + public Channel CreateChannel(string targetId) + { + if (string.IsNullOrEmpty(targetId)) + { + throw new ArgumentException($"“{nameof(targetId)}”不能为 null 或空。", nameof(targetId)); + } + + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor actor)) + { + return actor.CreateChannel(); + } + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription()); + } + return this.PrivateCreateChannel(targetId, true); + } + + internal bool RemoveChannel(int id) + { + return m_userChannels.TryRemove(id, out _); + } + + /// + /// 订阅通道 + /// + /// + /// + /// + public bool TrySubscribeChannel(int id, out Channel channel) + { + if (m_userChannels.TryGetValue(id, out InternalChannel channelOut)) + { + if (channelOut.Using) + { + channel = null; + return false; + } + channelOut.SetUsing(); + channel = channelOut; + return true; + } + channel = null; + return false; + } + + private bool QueueChannelPackage(ChannelPackage channelPackage) + { + if (m_userChannels.TryGetValue(channelPackage.ChannelId, out InternalChannel channel)) + { + channel.ReceivedData(channelPackage); + return true; + } + + return false; + } + + private bool RequestCreateChannel(int id, string targetId) + { + lock (SyncRoot) + { + InternalChannel channel = new InternalChannel(this, targetId); + channel.SetID(id); + if (m_userChannels.TryAdd(id, channel)) + { + return true; + } + else + { + channel.SafeDispose(); + return false; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs.meta new file mode 100644 index 0000000..efc254f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Channel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 944975f2adf09264f90078d7761ec78a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs new file mode 100644 index 0000000..e2350c7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs @@ -0,0 +1,1220 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Rpc.TouchRpc +{ + public partial class RpcActor + { + private readonly ConcurrentDictionary m_eventArgs; + private string m_rootPath = string.Empty; + + /// + public string RootPath + { + get => m_rootPath; + set + { + value ??= string.Empty; + m_rootPath = value; + } + } + + #region Pull + + /// + public Result PullFile(FileOperator fileOperator) + { + return this.PrivatePullFile(default, fileOperator); + } + + /// + public Result PullFile(string targetId, FileOperator fileOperator) + { + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor rpcActor)) + { + return rpcActor.PullFile(fileOperator); + } + return new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription()); + } + + return this.PrivatePullFile(targetId, fileOperator); + } + + /// + public Task PullFileAsync(string targetId, FileOperator fileOperator) + { + return EasyTask.Run(() => + { + return PullFile(targetId, fileOperator); + }); + } + + /// + public Task PullFileAsync(FileOperator fileOperator) + { + return EasyTask.Run(() => + { + return PullFile(fileOperator); + }); + } + + private Result PreviewPullFile(string targetId, FileOperator fileOperator, WaitFileInfoPackage waitFileInfoPackage) + { + TouchRpcFileInfo fileInfo = waitFileInfoPackage.FileInfo; + fileOperator.SavePath = FileController.GetFullPath(m_rootPath, fileOperator.SavePath); + TouchRpcFileStream stream; + try + { + FileController.TryReadTempInfo(fileOperator.SavePath, fileOperator.Flags, ref fileInfo); + stream = TouchRpcFileStream.Create(fileOperator.SavePath, ref fileInfo, fileOperator.Flags.HasFlag(TransferFlags.BreakpointResume)); + } + catch (Exception ex) + { + return fileOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + } + + WaitTransferPackage waitTransfer = new WaitTransferPackage() + { + EventHashCode = waitFileInfoPackage.EventHashCode, + Path = fileInfo.FullName, + Position = fileInfo.Position, + SourceId = this.ID, + TargetId = targetId, + Route = targetId.HasValue() + }; + + WaitData waitData = WaitHandlePool.GetWaitData(waitTransfer); + ByteBlock byteBlock = new ByteBlock(); + Channel channel = default; + try + { + if (targetId == null) + { + channel = CreateChannel(); + } + else + { + channel = CreateChannel(targetId); + } + waitTransfer.ChannelID = channel.ID; + waitTransfer.Package(byteBlock); + Send(TouchRpcUtility.P_501_BeginPullFile_Request, byteBlock); + + if (fileOperator.Token.IsCancellationRequested) + { + waitData.SetCancellationToken(fileOperator.Token); + } + + switch (waitData.Wait(fileOperator.Timeout)) + { + case WaitDataStatus.SetRunning: + { + WaitTransferPackage waitTransferResult = (WaitTransferPackage)waitData.WaitResult; + switch (waitTransferResult.Status.ToStatus()) + { + case TouchSocketStatus.Success: + { + fileOperator.SetFileCompletedLength(fileInfo.Position); + fileOperator.SetLength(fileInfo.Length); + channel.Timeout = fileOperator.Timeout; + while (channel.MoveNext()) + { + if (fileOperator.Token.IsCancellationRequested) + { + channel.Cancel(); + fileOperator.SetResult(new Result(ResultCode.Canceled)); + break; + } + byte[] data = channel.GetCurrent(); + if (data != null) + { + stream.Write(data, 0, data.Length); + fileInfo.Position = stream.FileWriter.Position; + fileOperator.AddFlow(data.Length); + } + } + + if (channel.Status == ChannelStatus.Completed) + { + stream.FinishStream(); + return fileOperator.SetResult(new Result(ResultCode.Success)); + } + else + { + return fileOperator.SetResult(new Result(channel.Status.ToResultCode())); + } + } + case TouchSocketStatus.LoadStreamFail: + return fileOperator.SetResult(new Result(ResultCode.Fail, TouchSocketStatus.LoadStreamFail.GetDescription(fileInfo.FullName))); + + default: + return fileOperator.SetResult(new Result(ResultCode.Error, waitTransferResult.Status.ToStatus().GetDescription(waitTransferResult.Message))); + } + } + case WaitDataStatus.Overtime: + { + return fileOperator.SetResult(new Result(ResultCode.Overtime)); + } + case WaitDataStatus.Canceled: + { + return fileOperator.SetResult(new Result(ResultCode.Canceled)); + } + case WaitDataStatus.Disposed: + default: + { + return fileOperator.SetResult(new Result(ResultCode.Error)); + } + } + } + catch (Exception ex) + { + return fileOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + } + finally + { + WaitHandlePool.Destroy(waitData); + stream.SafeDispose(); + byteBlock.Dispose(); + channel.SafeDispose(); + } + } + + private Result PrivatePullFile(string targetId, FileOperator fileOperator) + { + if (fileOperator is null) + { + return new Result(ResultCode.Error, TouchSocketStatus.ArgumentNull.GetDescription(nameof(fileOperator))); + } + + WaitFileInfoPackage waitFileInfo = new WaitFileInfoPackage + { + SourceId = this.ID, + TargetId = targetId, + Route = targetId.HasValue(), + Metadata = fileOperator.Metadata, + SavePath = this.FileController.GetFullPath(this.m_rootPath, fileOperator.SavePath), + Flags = fileOperator.Flags, + ResourcePath = fileOperator.ResourcePath + }; + + WaitData waitData = WaitHandlePool.GetWaitData(waitFileInfo); + + ByteBlock byteBlock = new ByteBlock(); + try + { + waitFileInfo.Package(byteBlock); + Send(TouchRpcUtility.P_500_PullFile_Request, byteBlock); + + if (fileOperator.Token.IsCancellationRequested) + { + waitData.SetCancellationToken(fileOperator.Token); + } + + waitData.Wait(fileOperator.Timeout); + + switch (waitData.Status) + { + case WaitDataStatus.SetRunning: + { + WaitFileInfoPackage waitFileResult = (WaitFileInfoPackage)waitData.WaitResult; + switch (waitFileResult.Status.ToStatus()) + { + case TouchSocketStatus.Success: + return PreviewPullFile(targetId, fileOperator, waitFileResult); + + case TouchSocketStatus.FileNotExists: + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.FileNotExists.GetDescription(waitFileResult.ResourcePath))); + + case TouchSocketStatus.RemoteRefuse: + default: + return fileOperator.SetResult(new Result(ResultCode.Fail, waitFileResult.Status.ToStatus().GetDescription(waitFileResult.Message))); + } + } + case WaitDataStatus.Overtime: + { + return fileOperator.SetResult(Result.Overtime); + } + case WaitDataStatus.Canceled: + { + return fileOperator.SetResult(Result.Canceled); + } + case WaitDataStatus.Disposed: + default: + { + return fileOperator.SetResult(Result.UnknownFail); + } + } + } + catch (Exception ex) + { + return fileOperator.SetResult(new Result(ex)); + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + #endregion Pull + + #region Push + + /// + public Result PushFile(FileOperator fileOperator) + { + return PrivatePushFile(default, fileOperator); + } + + /// + public Result PushFile(string targetId, FileOperator fileOperator) + { + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor rpcActor)) + { + return rpcActor.PushFile(fileOperator); + } + return new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription()); + } + return this.PrivatePushFile(default, fileOperator); + } + + /// + public Task PushFileAsync(string targetId, FileOperator fileOperator) + { + return EasyTask.Run(() => + { + return PushFile(targetId, fileOperator); + }); + } + + /// + public Task PushFileAsync(FileOperator fileOperator) + { + return EasyTask.Run(() => + { + return PushFile(fileOperator); + }); + } + + private Result PreviewPushFile(FileOperator fileOperator, WaitTransferPackage waitTransfer) + { + try + { + using FileStorageReader reader = FilePool.GetReader(waitTransfer.Path); + fileOperator.SetLength(reader.FileStorage.FileInfo.Length); + if (TrySubscribeChannel(waitTransfer.ChannelID, out Channel channel)) + { + ByteBlock byteBlock = BytePool.Default.GetByteBlock(TouchRpcUtility.TransferPackage); + try + { + long position = waitTransfer.Position; + reader.Position = position; + fileOperator.SetFileCompletedLength(waitTransfer.Position); + + channel.Timeout = fileOperator.Timeout; + while (true) + { + if (fileOperator.Token.IsCancellationRequested) + { + channel.Cancel("主动取消"); + fileOperator.SetResult(new Result(ResultCode.Canceled)); + break; + } + int r = reader.Read(byteBlock.Buffer, 0, (int)Math.Min(TouchRpcUtility.TransferPackage, fileOperator.MaxSpeed / 10.0)); + if (r == 0) + { + channel.Complete(); + WaitPushFileAckPackage waitResult = null; + if (SpinWait.SpinUntil(() => + { + if (m_eventArgs.TryRemove(waitTransfer.EventHashCode, out object obj)) + { + waitResult = (WaitPushFileAckPackage)obj; + return true; + } + return false; + }, fileOperator.Timeout)) + { + if (waitResult.Status.ToStatus() == TouchSocketStatus.Success) + { + return fileOperator.SetResult(new Result(ResultCode.Success)); + } + else + { + return fileOperator.SetResult(new Result(ResultCode.Error, waitResult.Message)); + } + } + else + { + return fileOperator.SetResult(new Result(ResultCode.Overtime, "等待最后状态确认超时。")); + } + } + else + { + position += r; + if (channel.TryWrite(byteBlock.Buffer, 0, r)) + { + fileOperator.AddFlow(r); + } + else + { + break; + } + } + } + if (channel.Status == ChannelStatus.Cancel && !string.IsNullOrEmpty(channel.LastOperationMes)) + { + return fileOperator.SetResult(new Result(ResultCode.Canceled, channel.LastOperationMes)); + } + else + { + return fileOperator.SetResult(new Result(channel.Status.ToResultCode())); + } + } + catch (Exception ex) + { + return fileOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + } + finally + { + byteBlock.Dispose(); + } + } + else + { + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.SetChannelFail.GetDescription())); + } + } + catch (Exception ex) + { + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.LoadStreamFail.GetDescription(waitTransfer.Path, ex.Message))); + } + } + + private Result PrivatePushFile(string targetId, FileOperator fileOperator) + { + if (fileOperator is null) + { + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.ArgumentNull.GetDescription(nameof(fileOperator)))); + } + + string fullPath = FileController.GetFullPath(m_rootPath, fileOperator.ResourcePath); + + if (!File.Exists(fullPath)) + { + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.FileNotExists.GetDescription(fullPath))); + } + + TouchRpcFileInfo fileInfo = new TouchRpcFileInfo(); + try + { + FileController.GetFileInfo(fullPath, fileOperator.Flags.HasFlag(TransferFlags.MD5Verify), ref fileInfo); + } + catch (Exception ex) + { + return fileOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + } + + WaitFileInfoPackage waitFileInfoPackage = new WaitFileInfoPackage() + { + FileInfo = fileInfo, + Metadata = fileOperator.Metadata, + ResourcePath = this.FileController.GetFullPath(this.m_rootPath, fileOperator.ResourcePath), + SavePath = fileOperator.SavePath, + Flags = fileOperator.Flags, + TargetId = targetId, + SourceId = this.ID, + Route = targetId.HasValue() + }; + WaitData waitData = WaitHandlePool.GetWaitData(waitFileInfoPackage); + + try + { + SendPackage(TouchRpcUtility.P_502_PushFile_Request, waitFileInfoPackage); + waitData.SetCancellationToken(fileOperator.Token); + + waitData.Wait(fileOperator.Timeout); + + switch (waitData.Status) + { + case WaitDataStatus.SetRunning: + { + WaitTransferPackage waitResult = (WaitTransferPackage)waitData.WaitResult; + switch (waitResult.Status.ToStatus()) + { + case TouchSocketStatus.Success: + return PreviewPushFile(fileOperator, waitResult); + + case TouchSocketStatus.LoadStreamFail: + { + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.LoadStreamFail.GetDescription(waitResult.Path, waitResult.Message))); + } + case TouchSocketStatus.ClientNotFind: + { + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription(targetId))); + } + case TouchSocketStatus.DirectoryNotExists: + { + return fileOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.DirectoryNotExists.GetDescription(waitResult.Path))); + } + case TouchSocketStatus.RemoteRefuse: + default: + return fileOperator.SetResult(new Result(ResultCode.Error, waitResult.Status.ToStatus().GetDescription(waitResult.Message))); + } + } + case WaitDataStatus.Overtime: + { + return fileOperator.SetResult(new Result(ResultCode.Overtime)); + } + case WaitDataStatus.Canceled: + { + return fileOperator.SetResult(new Result(ResultCode.Canceled)); + } + case WaitDataStatus.Disposed: + default: + { + return fileOperator.SetResult(new Result(ResultCode.Error)); + } + } + } + catch (Exception ex) + { + return fileOperator.SetResult(new Result(ex)); + } + finally + { + WaitHandlePool.Destroy(waitData); + } + } + + #endregion Push + + #region 小文件传输 + + /// + /// 允许传输的小文件的最大长度。默认1024*1024字节。 + /// 注意,当调整该值时,应该和对端保持一致。 + /// + public int MaxSmallFileLength { get; set; } = 1024 * 1024; + + /// + public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor actor)) + { + return actor.PullSmallFile(path, metadata, timeout, token); + } + return new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription()); + } + + return PrivatePullSmallFile(targetId, path, metadata, timeout, token); + } + + /// + public PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return PrivatePullSmallFile(default, path, metadata, timeout, token); + } + + /// + public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return Task.Run(() => + { + return PullSmallFile(targetId, path, metadata, timeout, token); + }); + } + + /// + public Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return Task.Run(() => + { + return PullSmallFile(path, metadata, timeout, token); + }); + } + + /// + public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor rpcActor)) + { + return rpcActor.PushSmallFile(savePath, fileInfo, metadata, timeout, token); + } + return new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription()); + } + return PrivatePushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return PrivatePushSmallFile(default, savePath, fileInfo, metadata, timeout, token); + } + + /// + public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return Task.Run(() => + { + return PushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); + }); + } + + /// + public Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + return Task.Run(() => + { + return PushSmallFile(savePath, fileInfo, metadata, timeout, token); + }); + } + + private PullSmallFileResult PrivatePullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + WaitSmallFilePackage waitSmallFilePackage = new WaitSmallFilePackage() + { + Path = path, + SourceId = ID, + TargetId = targetId, + Route = targetId.HasValue(), + Metadata = metadata + }; + + WaitData waitData = WaitHandlePool.GetWaitData(waitSmallFilePackage); + + ByteBlock byteBlock = new ByteBlock(); + try + { + waitSmallFilePackage.Package(byteBlock); + Send(TouchRpcUtility.P_517_PullSmallFile_Request, byteBlock); + waitData.SetCancellationToken(token); + + waitData.Wait(timeout); + + switch (waitData.Status) + { + case WaitDataStatus.SetRunning: + { + WaitSmallFilePackage waitFile = (WaitSmallFilePackage)waitData.WaitResult; + switch (waitFile.Status.ToStatus()) + { + case TouchSocketStatus.Success: + { + return new PullSmallFileResult(waitFile.Data); + } + case TouchSocketStatus.FileNotExists: + { + return new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.FileNotExists.GetDescription(waitFile.Path)); + } + case TouchSocketStatus.RemoteRefuse: + case TouchSocketStatus.LengthErrorWhenRead: + case TouchSocketStatus.FileLengthTooLong: + case TouchSocketStatus.ClientNotFind: + default: + { + return new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.RemoteRefuse.GetDescription(waitFile.Message)); + } + } + } + case WaitDataStatus.Overtime: + { + return new PullSmallFileResult(ResultCode.Overtime); + } + case WaitDataStatus.Canceled: + { + return new PullSmallFileResult(ResultCode.Canceled); + } + case WaitDataStatus.Disposed: + default: + { + return new PullSmallFileResult(ResultCode.Error, TouchSocketStatus.UnknownError.GetDescription()); + } + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + private Result PrivatePushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) + { + if (!File.Exists(fileInfo.FullName)) + { + return new Result(ResultCode.Error, TouchSocketStatus.FileNotExists.GetDescription(fileInfo.FullName)); + } + if (fileInfo.Length > MaxSmallFileLength) + { + return new Result(ResultCode.Error, TouchSocketStatus.FileLengthTooLong.GetDescription()); + } + WaitSmallFilePackage waitSmallFilePackage = new WaitSmallFilePackage() + { + Path = savePath, + SourceId = ID, + Metadata = metadata, + Route = targetId.HasValue(), + TargetId = targetId, + FileInfo = new RemoteFileInfo(fileInfo) + }; + + WaitData waitData = WaitHandlePool.GetWaitData(waitSmallFilePackage); + + ByteBlock byteBlock = new ByteBlock(); + byte[] buffer = BytePool.Default.GetByteCore((int)fileInfo.Length); + try + { + int r = FileController.ReadAllBytes(fileInfo, buffer); + if (r <= 0) + { + return new Result(ResultCode.Error, TouchSocketStatus.LengthErrorWhenRead.GetDescription()); + } + waitSmallFilePackage.Data = buffer; + waitSmallFilePackage.Len = r; + + waitSmallFilePackage.Package(byteBlock); + Send(TouchRpcUtility.P_518_PushSmallFile_Request, byteBlock); + waitData.SetCancellationToken(token); + + waitData.Wait(timeout); + + switch (waitData.Status) + { + case WaitDataStatus.SetRunning: + { + WaitSmallFilePackage waitFile = (WaitSmallFilePackage)waitData.WaitResult; + switch (waitFile.Status.ToStatus()) + { + case TouchSocketStatus.Success: + { + return Result.Success; + } + case TouchSocketStatus.RemoteRefuse: + { + return new Result(ResultCode.Error, TouchSocketStatus.RemoteRefuse.GetDescription(waitFile.Message)); + } + case TouchSocketStatus.ClientNotFind: + { + return new Result(ResultCode.Error, TouchSocketStatus.ClientNotFind.GetDescription()); + } + default: + return new Result(ResultCode.Exception, waitFile.Message); + } + } + case WaitDataStatus.Overtime: + { + return Result.Overtime; + } + case WaitDataStatus.Canceled: + { + return Result.Canceled; + } + case WaitDataStatus.Disposed: + default: + { + return Result.UnknownFail; + } + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + BytePool.Default.Recycle(buffer); + } + } + + private void RequestPullSmallFile(object o) + { + //2.不响应 + //3.不允许 + //4.不存在 + //5.读取文件长度异常 + + byte[] buffer = BytePool.Default.GetByteCore(MaxSmallFileLength); + try + { + WaitSmallFilePackage waitSmallFilePackage = (WaitSmallFilePackage)o; + Result resultThis = Result.Success; + try + { + FileOperationEventArgs args = new FileOperationEventArgs(TransferType.SmallPull, + waitSmallFilePackage.Metadata, default) + { + ResourcePath = waitSmallFilePackage.Path + }; + + OnFileTransfering?.Invoke(this, args); + + string fullPath = FileController.GetFullPath(RootPath, args.ResourcePath); + waitSmallFilePackage.Path = fullPath; + if (args.IsPermitOperation) + { + if (File.Exists(fullPath)) + { + FileInfo fileInfo = new FileInfo(fullPath); + if (fileInfo.Length > MaxSmallFileLength) + { + waitSmallFilePackage.Status = TouchSocketStatus.FileLengthTooLong.ToValue(); + resultThis = new Result(ResultCode.Error, TouchSocketStatus.FileLengthTooLong.GetDescription()); + } + else + { + int r = FileController.ReadAllBytes(fileInfo, buffer); + if (r > 0) + { + waitSmallFilePackage.Data = buffer; + waitSmallFilePackage.Len = r; + waitSmallFilePackage.FileInfo = new RemoteFileInfo(fileInfo); + waitSmallFilePackage.Status = TouchSocketStatus.Success.ToValue(); + } + else + { + waitSmallFilePackage.Status = TouchSocketStatus.LengthErrorWhenRead.ToValue(); + resultThis = new Result(ResultCode.Error, TouchSocketStatus.LengthErrorWhenRead.GetDescription()); + } + } + } + else + { + waitSmallFilePackage.Status = TouchSocketStatus.FileNotExists.ToValue(); + resultThis = new Result(ResultCode.Error, TouchSocketStatus.FileNotExists.GetDescription(fullPath)); + } + } + else + { + waitSmallFilePackage.Status = TouchSocketStatus.RemoteRefuse.ToValue(); + waitSmallFilePackage.Message = args.Message; + resultThis = new Result(ResultCode.Error, TouchSocketStatus.RemoteRefuse.GetDescription(args.Message)); + } + } + catch (Exception ex) + { + waitSmallFilePackage.Status = TouchSocketStatus.Exception.ToValue(); + waitSmallFilePackage.Message = ex.Message; + } + + using (ByteBlock byteBlock = new ByteBlock()) + { + waitSmallFilePackage.SwitchId(); + waitSmallFilePackage.Package(byteBlock); + Send(TouchRpcUtility.P_1517_PullSmallFile_Response, byteBlock); + } + + FileTransferStatusEventArgs resultArgs = new FileTransferStatusEventArgs( + TransferType.SmallPull, waitSmallFilePackage.Metadata, waitSmallFilePackage.FileInfo, resultThis) + { + ResourcePath = waitSmallFilePackage.Path + }; + OnFileTransfered?.Invoke(this, resultArgs); + } + catch + { + } + finally + { + BytePool.Default.Recycle(buffer); + } + } + + private void RequestPushSmallFile(object o) + { + //2.不响应 + //3.不允许 + + try + { + WaitSmallFilePackage waitSmallFilePackage = (WaitSmallFilePackage)o; + Result resultThis = Result.Success; + try + { + FileOperationEventArgs args = new FileOperationEventArgs(TransferType.SmallPush, + waitSmallFilePackage.Metadata, waitSmallFilePackage.FileInfo) + { + SavePath = waitSmallFilePackage.Path + }; + + OnFileTransfering?.Invoke(this, args); + + string fullPath = FileController.GetFullPath(RootPath, args.SavePath); + waitSmallFilePackage.Path = fullPath; + if (args.IsPermitOperation) + { + FileInfo fileInfo = new FileInfo(fullPath); + FileController.WriteAllBytes(fileInfo, waitSmallFilePackage.Data, 0, waitSmallFilePackage.Data.Length); + waitSmallFilePackage.Status = TouchSocketStatus.Success.ToValue(); + } + else + { + waitSmallFilePackage.Status = TouchSocketStatus.RemoteRefuse.ToValue(); + waitSmallFilePackage.Message = args.Message; + resultThis = new Result(ResultCode.Error, TouchSocketStatus.RemoteRefuse.GetDescription(args.Message)); + } + } + catch (Exception ex) + { + waitSmallFilePackage.Status = TouchSocketStatus.Exception.ToValue(); + waitSmallFilePackage.Message = ex.Message; + } + waitSmallFilePackage.FileInfo = default; + waitSmallFilePackage.Data = default; + waitSmallFilePackage.SwitchId(); + using (ByteBlock byteBlock = new ByteBlock()) + { + waitSmallFilePackage.Package(byteBlock); + Send(TouchRpcUtility.P_1518_PushSmallFile_Response, byteBlock); + } + + FileTransferStatusEventArgs resultArgs = new FileTransferStatusEventArgs( + TransferType.SmallPush, waitSmallFilePackage.Metadata, waitSmallFilePackage.FileInfo, resultThis) + { + SavePath = waitSmallFilePackage.Path + }; + OnFileTransfered?.Invoke(this, resultArgs); + } + catch + { + } + } + + #endregion 小文件传输 + + private void BeginPullFile(object o) + { + try + { + WaitTransferPackage waitTransferPackage = (WaitTransferPackage)o; + FileTransferStatusEventArgs e; + if (m_eventArgs.TryRemove(waitTransferPackage.EventHashCode, out object obj) && obj is FileOperationEventArgs args) + { + try + { + using (FileStorageReader reader = FilePool.GetReader(waitTransferPackage.Path)) + { + if (TrySubscribeChannel(waitTransferPackage.ChannelID, out Channel channel)) + { + ByteBlock byteBlock = BytePool.Default.GetByteBlock(TouchRpcUtility.TransferPackage); + FileOperator fileOperator = args.FileOperator; + fileOperator.SetLength(reader.FileStorage.FileInfo.Length); + try + { + waitTransferPackage.Status = TouchSocketStatus.Success.ToValue(); + waitTransferPackage.SwitchId(); + SendPackage(TouchRpcUtility.P_1501_BeginPullFile_Response, waitTransferPackage); + long position = waitTransferPackage.Position; + reader.Position = position; + fileOperator.SetFileCompletedLength(position); + while (true) + { + if (fileOperator.Token.IsCancellationRequested) + { + channel.Cancel("主动取消"); + fileOperator.SetResult(new Result(ResultCode.Canceled)); + break; + } + int r = reader.Read(byteBlock.Buffer, 0, + (int)Math.Min(TouchRpcUtility.TransferPackage, fileOperator.MaxSpeed / 10.0)); + if (r == 0) + { + channel.Complete(); + break; + } + else + { + position += r; + if (channel.TryWrite(byteBlock.Buffer, 0, r)) + { + fileOperator.AddFlow(r); + } + else + { + break; + } + } + } + } + catch + { + } + finally + { + byteBlock.Dispose(); + + e = new FileTransferStatusEventArgs( + fileOperator.SetResult(new Result(channel.Status.ToResultCode())), args); + OnFileTransfered?.Invoke(this, e); + } + + return; + } + else + { + waitTransferPackage.Status = TouchSocketStatus.SetChannelFail.ToValue(); + e = new FileTransferStatusEventArgs(new Result(ResultCode.Error, StringResStore.GetDescription(TouchSocketStatus.SetChannelFail)), args); + } + } + } + catch (Exception ex) + { + waitTransferPackage.Status = TouchSocketStatus.Exception.ToValue(); + waitTransferPackage.Message = ex.Message; + e = new FileTransferStatusEventArgs(new Result(ResultCode.Error, StringResStore.GetDescription(TouchSocketStatus.LoadStreamFail)), args); + } + } + else + { + e = new FileTransferStatusEventArgs(TransferType.Pull, default, default, new Result(ResultCode.Overtime, StringResStore.GetDescription(TouchSocketStatus.GetEventArgsFail))); + waitTransferPackage.Status = TouchSocketStatus.GetEventArgsFail.ToValue(); + } + + waitTransferPackage.SwitchId(); + SendPackage(TouchRpcUtility.P_1501_BeginPullFile_Response, waitTransferPackage); + + OnFileTransfered?.Invoke(this, e); + } + catch + { + } + } + + private void RequestPullFile(object o) + { + try + { + WaitFileInfoPackage waitFileInfoPackage = (WaitFileInfoPackage)o; + try + { + FileOperator fileOperator = new FileOperator() + { + Flags = waitFileInfoPackage.Flags, + ResourcePath = waitFileInfoPackage.ResourcePath, + SavePath = waitFileInfoPackage.SavePath, + Metadata = waitFileInfoPackage.Metadata + }; + + FileOperationEventArgs args = new FileOperationEventArgs(TransferType.Pull, + fileOperator, null); + + OnFileTransfering?.Invoke(this, args); + + args.ResourcePath = FileController.GetFullPath(m_rootPath, args.ResourcePath); + + if (args.IsPermitOperation) + { + if (File.Exists(args.ResourcePath)) + { + //合法传输 + TouchRpcFileInfo touchRpcFileInfo = new TouchRpcFileInfo(); + FileController.GetFileInfo(args.ResourcePath, args.Flags.HasFlag(TransferFlags.MD5Verify), ref touchRpcFileInfo); + waitFileInfoPackage.FileInfo = touchRpcFileInfo; + waitFileInfoPackage.Status = TouchSocketStatus.Success.ToValue(); + waitFileInfoPackage.EventHashCode = args.GetHashCode(); + if (m_eventArgs.TryAdd(args.GetHashCode(), args)) + { + EasyTask.DelayRun(1000 * 60, args, (a) => + { + if (m_eventArgs.TryRemove(a.GetHashCode(), out object obj) && obj is FileOperationEventArgs eventArgs) + { + FileTransferStatusEventArgs e = new FileTransferStatusEventArgs( + new Result(ResultCode.Overtime, StringResStore.GetDescription(TouchSocketStatus.Overtime)), eventArgs); + OnFileTransfered?.Invoke(this, e); + } + }); + } + else + { + waitFileInfoPackage.Status = TouchSocketStatus.UnknownError.ToValue(); + } + } + else + { + waitFileInfoPackage.Status = TouchSocketStatus.FileNotExists.ToValue(); + } + } + else + { + waitFileInfoPackage.Message = args.Message; + waitFileInfoPackage.Status = TouchSocketStatus.RemoteRefuse.ToValue(); + } + } + catch (Exception ex) + { + waitFileInfoPackage.Status = TouchSocketStatus.Exception.ToValue(); + waitFileInfoPackage.Message = ex.Message; + } + waitFileInfoPackage.SwitchId(); + this.SendPackage(TouchRpcUtility.P_1500_PullFile_Response, waitFileInfoPackage); + } + catch + { + } + } + + private void RequestPushFile(object o) + { + try + { + WaitFileInfoPackage waitFileInfoPackage = (WaitFileInfoPackage)o; + TouchRpcFileInfo fileInfo = waitFileInfoPackage.FileInfo; + FileOperator fileOperator = new FileOperator() + { + ResourcePath = waitFileInfoPackage.ResourcePath, + SavePath = waitFileInfoPackage.SavePath, + Flags = waitFileInfoPackage.Flags, + Metadata = waitFileInfoPackage.Metadata, + }; + WaitTransferPackage waitTransferPackage = new WaitTransferPackage() + { + Sign = waitFileInfoPackage.Sign, + TargetId = waitFileInfoPackage.SourceId, + SourceId = waitFileInfoPackage.TargetId, + Route = waitFileInfoPackage.Route, + }; + + FileOperationEventArgs args = new FileOperationEventArgs(TransferType.Push, fileOperator, fileInfo); + OnFileTransfering?.Invoke(this, args); + + waitTransferPackage.Path = args.ResourcePath; + waitTransferPackage.EventHashCode = args.GetHashCode(); + + if (!args.IsPermitOperation) + { + fileOperator.SetResult(new Result(ResultCode.Fail, TouchSocketStatus.RemoteRefuse.GetDescription(args.Message))); + waitTransferPackage.Message = args.Message; + waitTransferPackage.Status = TouchSocketStatus.RemoteRefuse.ToValue(); + OnFileTransfered?.Invoke(this, new FileTransferStatusEventArgs(fileOperator.Result, args)); + SendPackage(TouchRpcUtility.P_1502_PushFile_Response, waitTransferPackage); + return; + } + + string saveFullPath = FileController.GetFullPath(m_rootPath, args.SavePath); + + if (!Directory.Exists(Path.GetDirectoryName(saveFullPath))) + { + fileOperator.SetResult(new Result(ResultCode.Fail, TouchSocketStatus.DirectoryNotExists.GetDescription(Path.GetDirectoryName(saveFullPath)))); + waitTransferPackage.Message = args.Message; + waitTransferPackage.Status = TouchSocketStatus.DirectoryNotExists.ToValue(); + waitTransferPackage.Path = Path.GetDirectoryName(saveFullPath); + OnFileTransfered?.Invoke(this, new FileTransferStatusEventArgs(fileOperator.Result, args)); + SendPackage(TouchRpcUtility.P_1502_PushFile_Response, waitTransferPackage); + return; + } + Channel channel = null; + try + { + FileController.TryReadTempInfo(saveFullPath, args.Flags, ref fileInfo); + using (TouchRpcFileStream stream = TouchRpcFileStream.Create(saveFullPath, ref fileInfo, args.Flags.HasFlag(TransferFlags.MD5Verify))) + { + if (waitFileInfoPackage.Route) + { + channel = CreateChannel(waitTransferPackage.SourceId); + } + else + { + channel = CreateChannel(); + } + + waitTransferPackage.ChannelID = channel.ID; + waitTransferPackage.Position = fileInfo.Position; + waitTransferPackage.Status = TouchSocketStatus.Success.ToValue(); + SendPackage(TouchRpcUtility.P_1502_PushFile_Response, waitTransferPackage); + + fileOperator.SetFileCompletedLength(fileInfo.Position); + fileOperator.SetLength(fileInfo.Length); + while (channel.MoveNext()) + { + if (fileOperator.Token.IsCancellationRequested) + { + channel.Cancel(); + fileOperator.SetResult(new Result(ResultCode.Canceled)); + break; + } + + byte[] data = channel.GetCurrent(); + if (data != null) + { + stream.Write(data, 0, data.Length); + fileInfo.Position = stream.FileWriter.Position; + fileOperator.AddFlow(data.Length); + } + } + + if (channel.Status == ChannelStatus.Completed) + { + stream.FinishStream(); + fileOperator.SetResult(new Result(ResultCode.Success)); + } + else + { + fileOperator.SetResult(new Result(channel.Status.ToResultCode())); + } + } + } + catch (Exception ex) + { + fileOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + channel?.Cancel(ex.Message); + } + finally + { + channel.SafeDispose(); + } + + OnFileTransfered?.Invoke(this, new FileTransferStatusEventArgs(fileOperator.Result, args)); + if (channel?.Status == ChannelStatus.Completed && fileOperator.Result.IsSuccess()) + { + SendPackage(TouchRpcUtility.P_509_PushFileAck_Request, new WaitPushFileAckPackage() + { + TargetId = waitFileInfoPackage.SourceId, + SourceId = waitFileInfoPackage.TargetId, + Route = waitFileInfoPackage.Route, + Sign = args.GetHashCode(), + Status = TouchSocketStatus.Success.ToValue(), + Message = fileOperator.Result.Message + }); + } + else + { + SendPackage(TouchRpcUtility.P_509_PushFileAck_Request, new WaitPushFileAckPackage() + { + TargetId = waitFileInfoPackage.SourceId, + SourceId = waitFileInfoPackage.TargetId, + Route = waitFileInfoPackage.Route, + Sign = args.GetHashCode(), + Status = TouchSocketStatus.Exception.ToValue(), + Message = fileOperator.Result.Message + }); + } + } + catch + { + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs.meta new file mode 100644 index 0000000..debc235 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-File.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0779cd3c6f4e98549a7ea47cab1a18b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs new file mode 100644 index 0000000..e7a0390 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs @@ -0,0 +1,1085 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + public partial class RpcActor + { + private readonly ConcurrentDictionary m_contextDic; + + /// + public object Caller { get; set; } + + /// + public RpcStore RpcStore { get; set; } + + /// + public SerializationSelector SerializationSelector { get; set; } + + #region Rpc + + /// + public T Invoke(string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + SourceId = ID + }; + WaitData waitData = WaitHandlePool.GetWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, Sign = rpcPackage.Sign }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + return default; + } + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + break; + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + if (resultContext.IsByRef) + { + try + { + for (int i = 0; i < parameters.Length; i++) + { + parameters[i] = SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ParametersBytes[i], types[i]); + } + } + catch (System.Exception e) + { + throw new Exception(e.Message); + } + } + else + { + parameters = null; + } + return (T)SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ReturnParameterBytes, typeof(T)); + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + default: + return default; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public void Invoke(string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + SourceId = ID + }; + + WaitData waitData = WaitHandlePool.GetWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, Sign = rpcPackage.Sign }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + break; + + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + break; + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + break; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + if (resultContext.IsByRef) + { + for (int i = 0; i < parameters.Length; i++) + { + parameters[i] = SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ParametersBytes[i], types[i]); + } + } + else + { + parameters = null; + } + break; + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + break; + } + default: + break; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public void Invoke(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + SourceId = ID + }; + + WaitData waitData = WaitHandlePool.GetWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, Sign = rpcPackage.Sign }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + if (parameters != null) + { + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + } + + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + break; + + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + break; + + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + break; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + break; + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + break; + } + default: + break; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public T Invoke(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + SourceId = ID + }; + + WaitData waitData = WaitHandlePool.GetWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, Sign = rpcPackage.Sign }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + if (parameters != null) + { + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + } + + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + return default; + } + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + return (T)SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ReturnParameterBytes, typeof(T)); + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + + default: + return default; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public Task InvokeAsync(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + Invoke(invokeKey, invokeOption, parameters); + }); + } + + /// + public Task InvokeAsync(string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + return Invoke(invokeKey, invokeOption, parameters); + }); + } + + #endregion Rpc + + #region IdRpc + + /// + public void Invoke(string targetId, string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + if (string.IsNullOrEmpty(targetId)) + { + throw new ArgumentException($"“{nameof(targetId)}”不能为 null 或空。", nameof(targetId)); + } + + if (string.IsNullOrEmpty(invokeKey)) + { + throw new ArgumentException($"“{nameof(invokeKey)}”不能为 null 或空。", nameof(invokeKey)); + } + + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor actor)) + { + actor.Invoke(invokeKey, invokeOption, parameters); + return; + } + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription()); + } + + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + Route = true, + TargetId = targetId, + SourceId = ID, + }; + + WaitData waitData = WaitHandlePool.GetReverseWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, TargetId = targetId, Sign = rpcPackage.Sign, Route = true }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + if (parameters != null) + { + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + } + + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + } + break; + + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + break; + + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + break; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + break; + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + break; + } + default: + break; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public T Invoke(string targetId, string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + if (string.IsNullOrEmpty(targetId)) + { + throw new ArgumentException($"“{nameof(targetId)}”不能为 null 或空。", nameof(targetId)); + } + + if (string.IsNullOrEmpty(invokeKey)) + { + throw new ArgumentException($"“{nameof(invokeKey)}”不能为 null 或空。", nameof(invokeKey)); + } + + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor rpcActor)) + { + return rpcActor.Invoke(invokeKey, invokeOption, parameters); + } + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription()); + } + + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + TargetId = targetId, + SourceId = ID, + Route = true + }; + + WaitData waitData = WaitHandlePool.GetReverseWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, TargetId = targetId, Sign = rpcPackage.Sign, Route = true }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + if (parameters != null) + { + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + } + + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + return default; + } + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + return (T)SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ReturnParameterBytes, typeof(T)); + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + + default: + return default; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public void Invoke(string targetId, string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + if (string.IsNullOrEmpty(targetId)) + { + throw new ArgumentException($"“{nameof(targetId)}”不能为 null 或空。", nameof(targetId)); + } + + if (string.IsNullOrEmpty(invokeKey)) + { + throw new ArgumentException($"“{nameof(invokeKey)}”不能为 null 或空。", nameof(invokeKey)); + } + + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor rpcActor)) + { + rpcActor.Invoke(invokeKey, invokeOption, ref parameters, types); + return; + } + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription()); + } + + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + TargetId = targetId, + SourceId = ID, + Route = true + }; + + WaitData waitData = WaitHandlePool.GetReverseWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, TargetId = targetId, Sign = rpcPackage.Sign, Route = true }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + return; + } + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + if (resultContext.IsByRef) + { + for (int i = 0; i < parameters.Length; i++) + { + parameters[i] = SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ParametersBytes[i], types[i]); + } + } + else + { + parameters = null; + } + break; + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return; + } + + default: + return; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public T Invoke(string targetId, string invokeKey, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + if (string.IsNullOrEmpty(targetId)) + { + throw new ArgumentException($"“{nameof(targetId)}”不能为 null 或空。", nameof(targetId)); + } + + if (string.IsNullOrEmpty(invokeKey)) + { + throw new ArgumentException($"“{nameof(invokeKey)}”不能为 null 或空。", nameof(invokeKey)); + } + + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor rpcActor)) + { + return rpcActor.Invoke(invokeKey, invokeOption, ref parameters, types); + } + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription()); + } + + TouchRpcPackage rpcPackage = new TouchRpcPackage + { + MethodName = invokeKey, + TargetId = targetId, + SourceId = ID, + Route = true + }; + + WaitData waitData = WaitHandlePool.GetReverseWaitData(rpcPackage); + ByteBlock byteBlock = new ByteBlock(); + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + if (invokeOption.Token.CanBeCanceled) + { + waitData.SetCancellationToken(invokeOption.Token); + invokeOption.Token.Register(CanceledInvoke, new CanceledPackage() { SourceId = ID, TargetId = targetId, Sign = rpcPackage.Sign, Route = true }); + } + + try + { + rpcPackage.LoadInvokeOption(invokeOption); + List datas = new List(); + foreach (object parameter in parameters) + { + datas.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, parameter)); + } + rpcPackage.ParametersBytes = datas; + rpcPackage.Package(byteBlock); + + switch (invokeOption.FeedbackType) + { + case FeedbackType.OnlySend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + return default; + } + case FeedbackType.WaitSend: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + case FeedbackType.WaitInvoke: + { + Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 0, byteBlock.Len); + switch (waitData.Wait(invokeOption.Timeout)) + { + case WaitDataStatus.SetRunning: + { + TouchRpcPackage resultContext = (TouchRpcPackage)waitData.WaitResult; + resultContext.ThrowStatus(); + if (resultContext.IsByRef) + { + for (int i = 0; i < parameters.Length; i++) + { + parameters[i] = SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ParametersBytes[i], types[i]); + } + } + else + { + parameters = null; + } + return (T)SerializationSelector.DeserializeParameter(resultContext.SerializationType, resultContext.ReturnParameterBytes, typeof(T)); + } + case WaitDataStatus.Overtime: + { + throw new TimeoutException("等待结果超时"); + } + } + return default; + } + + default: + return default; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + public Task InvokeAsync(string targetId, string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + Invoke(targetId, invokeKey, invokeOption, parameters); + }); + } + + /// + public Task InvokeAsync(string targetId, string invokeKey, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + return Invoke(targetId, invokeKey, invokeOption, parameters); + }); + } + + #endregion IdRpc + + private void CanceledInvoke(object obj) + { + if (obj is CanceledPackage canceled) + { + using (ByteBlock byteBlock = new ByteBlock()) + { + canceled.Package(byteBlock); + Send(TouchRpcUtility.P_204_CancelInvoke, byteBlock); + } + } + } + + private void InvokeThis(object o) + { + try + { + TouchRpcPackage rpcPackage = (TouchRpcPackage)o; + + List psData = rpcPackage.ParametersBytes; + if (rpcPackage.Feedback == FeedbackType.WaitSend) + { + using (ByteBlock returnByteBlock = new ByteBlock()) + { + var methodName = rpcPackage.MethodName; + var parametersBytes = rpcPackage.ParametersBytes; + + rpcPackage.SwitchId(); + rpcPackage.MethodName = default; + rpcPackage.ParametersBytes = default; + rpcPackage.Status = TouchSocketStatus.Success.ToValue(); + rpcPackage.Package(returnByteBlock); + Send(TouchRpcUtility.P_1200_Invoke_Response, returnByteBlock); + + rpcPackage.SwitchId(); + rpcPackage.MethodName= methodName; + rpcPackage.ParametersBytes = parametersBytes; + } + } + + InvokeResult invokeResult = new InvokeResult(); + object[] ps = null; + MethodInstance methodInstance = GetInvokeMethod?.Invoke(rpcPackage.MethodName); + TouchRpcCallContext callContext = null; + if (methodInstance != null) + { + try + { + if (methodInstance.IsEnable) + { + callContext = new TouchRpcCallContext() + { + Caller = Caller, + MethodInstance = methodInstance, + TouchRpcPackage = rpcPackage + }; + + m_contextDic.TryAdd(rpcPackage.Sign, callContext); + + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + ps = new object[methodInstance.ParameterTypes.Length]; + ps[0] = callContext; + for (int i = 0; i < psData.Count; i++) + { + ps[i + 1] = SerializationSelector.DeserializeParameter(rpcPackage.SerializationType, psData[i], methodInstance.ParameterTypes[i + 1]); + } + } + else + { + ps = new object[methodInstance.ParameterTypes.Length]; + for (int i = 0; i < methodInstance.ParameterTypes.Length; i++) + { + ps[i] = SerializationSelector.DeserializeParameter(rpcPackage.SerializationType, psData[i], methodInstance.ParameterTypes[i]); + } + } + } + else + { + invokeResult.Status = InvokeStatus.UnEnable; + } + } + catch (Exception ex) + { + invokeResult.Status = InvokeStatus.Exception; + invokeResult.Message = ex.Message; + } + } + else + { + invokeResult.Status = InvokeStatus.UnFound; + } + + if (invokeResult.Status == InvokeStatus.Ready) + { + IRpcServer rpcServer = methodInstance.ServerFactory.Create(callContext, ps); + if (rpcServer is ITransientRpcServer transientRpcServer) + { + transientRpcServer.CallContext = callContext; + } + invokeResult = RpcStore.Execute(rpcServer, ps, callContext); + } + + if (rpcPackage.Feedback == FeedbackType.OnlySend) + { + return; + } + + switch (invokeResult.Status) + { + case InvokeStatus.UnFound: + { + rpcPackage.Status = TouchSocketStatus.RpcMethodNotFind.ToValue(); + break; + } + case InvokeStatus.Success: + { + if (methodInstance.HasReturn) + { + rpcPackage.ReturnParameterBytes = SerializationSelector.SerializeParameter(rpcPackage.SerializationType, invokeResult.Result); + } + else + { + rpcPackage.ReturnParameterBytes = null; + } + + if (methodInstance.IsByRef) + { + rpcPackage.IsByRef = true; + rpcPackage.ParametersBytes = new List(); + + int i = 0; + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + i = 1; + } + for (; i < ps.Length; i++) + { + rpcPackage.ParametersBytes.Add(SerializationSelector.SerializeParameter(rpcPackage.SerializationType, ps[i])); + } + } + else + { + rpcPackage.ParametersBytes = null; + } + + rpcPackage.Status = TouchSocketStatus.Success.ToValue(); + break; + } + case InvokeStatus.UnEnable: + { + rpcPackage.Status = TouchSocketStatus.RpcMethodDisable.ToValue(); + break; + } + case InvokeStatus.InvocationException: + { + rpcPackage.Status = TouchSocketStatus.RpcInvokeException.ToValue(); + rpcPackage.Message = invokeResult.Message; + break; + } + case InvokeStatus.Exception: + { + rpcPackage.Status = TouchSocketStatus.Exception.ToValue(); + rpcPackage.Message = invokeResult.Message; + break; + } + default: + return; + } + + m_contextDic.TryRemove(rpcPackage.Sign, out _); + + using (ByteBlock byteBlock = new ByteBlock()) + { + rpcPackage.MethodName = default; + rpcPackage.SwitchId(); + rpcPackage.Package(byteBlock); + Send(TouchRpcUtility.P_1200_Invoke_Response, byteBlock); + } + } + catch + { + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs.meta new file mode 100644 index 0000000..d167e3d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Rpc.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d7d8debade4a3649a3b3ce8de6d786c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs new file mode 100644 index 0000000..e1ee902 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs @@ -0,0 +1,295 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Rpc.TouchRpc +{ + public partial class RpcActor + { + /// + /// 发送流数据 + /// + /// + /// + /// + /// + public Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = default) + { + WaitStream waitStream = new WaitStream(); + WaitData waitData = WaitHandlePool.GetWaitData(waitStream); + waitStream.Metadata = metadata; + long size = stream.Length - stream.Position; + streamOperator.SetLength(size); + waitStream.Size = size; + waitStream.StreamType = stream.GetType().FullName; + ByteBlock byteBlock = BytePool.Default.GetByteBlock(TouchRpcUtility.TransferPackage); + byteBlock.WriteObject(waitStream); + try + { + Send(TouchRpcUtility.P_400_SendStreamToSocketClient_Request, byteBlock); + + waitData.SetCancellationToken(streamOperator.Token); + + waitData.Wait(streamOperator.Timeout); + + switch (waitData.Status) + { + case WaitDataStatus.SetRunning: + { + WaitStream waitStreamResult = (WaitStream)waitData.WaitResult; + if (waitStreamResult.Status == 1) + { + if (TrySubscribeChannel(waitStreamResult.ChannelID, out Channel channel)) + { + while (true) + { + if (streamOperator.Token.IsCancellationRequested) + { + channel.Cancel(); + return streamOperator.SetResult(new Result(ResultCode.Canceled)); + } + int r = stream.Read(byteBlock.Buffer, 0, + (int)Math.Min(TouchRpcUtility.TransferPackage, streamOperator.MaxSpeed / 10.0)); + if (r <= 0) + { + channel.Complete(); + return streamOperator.SetResult(new Result(ResultCode.Success)); + } + + channel.Write(byteBlock.Buffer, 0, r); + streamOperator.AddFlow(r); + } + } + else + { + return streamOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.SetChannelFail.GetDescription())); + } + } + else if (waitStreamResult.Status == 2) + { + return streamOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.RemoteRefuse.GetDescription(waitStreamResult.Message))); + } + else if (waitStreamResult.Status == 3) + { + return streamOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.Exception.GetDescription(waitStreamResult.Message))); + } + else + { + return streamOperator.SetResult(new Result(ResultCode.Error)); + } + } + case WaitDataStatus.Overtime: + { + return streamOperator.SetResult(new Result(ResultCode.Overtime)); + } + case WaitDataStatus.Canceled: + { + return streamOperator.SetResult(new Result(ResultCode.Canceled)); + } + case WaitDataStatus.Disposed: + default: + { + return streamOperator.SetResult(new Result(ResultCode.Error)); + } + } + } + catch (Exception ex) + { + return streamOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + } + finally + { + WaitHandlePool.Destroy(waitData); + byteBlock.Dispose(); + } + } + + /// + /// 发送流数据 + /// + /// + /// + /// + /// + public Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = default) + { + return EasyTask.Run(() => + { + return SendStream(stream, streamOperator, metadata); + }); + } + + private void RequestStreamToClient(object obj) + { + try + { + WaitStream waitStream = (WaitStream)obj; + StreamOperator streamOperator = new StreamOperator(); + StreamInfo streamInfo = new StreamInfo(waitStream.Size, waitStream.StreamType); + StreamOperationEventArgs args = new StreamOperationEventArgs(streamOperator, waitStream.Metadata, streamInfo); + + try + { + OnStreamTransfering?.Invoke(this, args); + + if (args.IsPermitOperation) + { + if (args.Bucket != null) + { + waitStream.Status = 1; + Channel channel = CreateChannel(); + waitStream.ChannelID = channel.ID; + TaskTransferingStream(streamOperator, args, channel, waitStream.Size); + } + else + { + streamOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.StreamBucketNull.GetDescription())); + waitStream.Status = 3; + waitStream.Message = "未设置流容器"; + + OnStreamTransfered?.Invoke(this, new StreamStatusEventArgs(new Result(ResultCode.Error, waitStream.Message), waitStream.Metadata, streamInfo) + { Message = args.Message }); + } + } + else + { + streamOperator.SetResult(new Result(ResultCode.Error, args.Message)); + waitStream.Status = 2; + waitStream.Message = args.Message; + + OnStreamTransfered?.Invoke(this, new StreamStatusEventArgs(new Result(ResultCode.Error, TouchSocketStatus.RemoteRefuse.GetDescription(waitStream.Message)), waitStream.Metadata, streamInfo) + { Message = args.Message }); + } + } + catch (Exception ex) + { + streamOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + waitStream.Status = 3; + waitStream.Message = ex.Message; + + Logger.Log(LogType.Error, this, $"在{nameof(RequestStreamToClient)}中发生错误。", ex); + } + + waitStream.Metadata = null; + using (ByteBlock byteBlock = new ByteBlock()) + { + byteBlock.WriteObject(waitStream); + Send(TouchRpcUtility.P_401_SendStreamToClient, byteBlock); + } + } + catch + { + } + } + + private void RequestStreamToSocketClient(object obj) + { + try + { + WaitStream waitStream = (WaitStream)obj; + StreamOperator streamOperator = new StreamOperator(); + StreamInfo streamInfo = new StreamInfo(waitStream.Size, waitStream.StreamType); + StreamOperationEventArgs args = new StreamOperationEventArgs(streamOperator, waitStream.Metadata, streamInfo); + + try + { + OnStreamTransfering?.Invoke(this, args); + if (args.IsPermitOperation) + { + if (args.Bucket != null) + { + waitStream.Status = 1; + Channel channel = CreateChannel(); + waitStream.ChannelID = channel.ID; + TaskTransferingStream(streamOperator, args, channel, waitStream.Size); + } + else + { + streamOperator.SetResult(new Result(ResultCode.Error, TouchSocketStatus.StreamBucketNull.GetDescription())); + waitStream.Status = 3; + waitStream.Message = "未设置流容器"; + + OnStreamTransfered?.Invoke(this, new StreamStatusEventArgs(new Result(ResultCode.Error, waitStream.Message), waitStream.Metadata, streamInfo) + { Message = args.Message }); + } + } + else + { + streamOperator.SetResult(new Result(ResultCode.Error, args.Message)); + waitStream.Status = 2; + waitStream.Message = args.Message; + + OnStreamTransfered?.Invoke(this, new StreamStatusEventArgs(new Result(ResultCode.Error, TouchSocketStatus.RemoteRefuse.GetDescription(waitStream.Message)), waitStream.Metadata, streamInfo) + { Message = args.Message }); + } + } + catch (Exception ex) + { + streamOperator.SetResult(new Result(ResultCode.Error, ex.Message)); + waitStream.Status = 3; + waitStream.Message = ex.Message; + + Logger.Log(LogType.Error, this, $"在{nameof(RequestStreamToSocketClient)}中发生错误。", ex); + } + + waitStream.Metadata = null; + using (ByteBlock byteBlock = new ByteBlock()) + { + byteBlock.WriteObject(waitStream); + Send(TouchRpcUtility.P_1400_SendStreamToSocketClient_Response, byteBlock); + } + } + catch + { + } + } + + private void TaskTransferingStream(StreamOperator streamOperator, StreamOperationEventArgs args, Channel channel, long size) + { + ThreadPool.QueueUserWorkItem((obj) => + { + try + { + streamOperator.SetLength(size); + Stream stream = args.Bucket; + while (channel.MoveNext()) + { + if (streamOperator.Token.IsCancellationRequested) + { + channel.Cancel(); + streamOperator.SetResult(new Result(ResultCode.Canceled)); + break; + } + var data = channel.GetCurrent(); + if (data != null) + { + stream.Write(data, 0, data.Length); + streamOperator.AddFlow(data.Length); + } + } + OnStreamTransfered?.Invoke(this, new StreamStatusEventArgs(streamOperator.SetResult(new Result(channel.Status.ToResultCode())), + args.Metadata, args.StreamInfo) + { Bucket = stream, Message = args.Message }); + } + catch + { + } + }); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs.meta new file mode 100644 index 0000000..4b22f04 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor-Stream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e67191072b48e149a0c843f0a065413 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs new file mode 100644 index 0000000..de3997e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs @@ -0,0 +1,1387 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// RpcActor + /// + public partial class RpcActor : DisposableObject, IRpcActor + { + /// + /// 结束标识编码。 + /// + public static readonly byte[] EndCodes = new byte[] { 20, 17, 11, 25 }; + + #region 委托 + + /// + /// 获取调用函数的委托 + /// + public Func GetInvokeMethod { get; set; } + + /// + /// 请求关闭 + /// + public Action OnClose { get; set; } + + /// + /// 当文件传输结束之后。并不意味着完成传输,请通过属性值进行判断。 + /// + public Action OnFileTransfered { get; set; } + + /// + /// 当需要路由的时候 + /// + public Action OnRouting { get; set; } + + /// + /// 在文件传输即将进行时触发。 + /// + public Action OnFileTransfering { get; set; } + + /// + /// 查找其他RpcActor + /// + public Func OnFindRpcActor { get; set; } + + /// + /// 在完成握手连接时 + /// + public Action OnHandshaked { get; set; } + + /// + /// 握手 + /// + public Action OnHandshaking { get; set; } + + /// + /// 接收到数据 + /// + public Action OnReceived { get; set; } + + /// + /// 重设ID + /// + public Action OnResetID { get; set; } + + /// + /// 流数据处理,用户需要在此事件中对e.Bucket手动释放。 + /// + public Action OnStreamTransfered { get; set; } + + /// + /// 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 + /// + public Action OnStreamTransfering { get; set; } + + /// + /// 发送数据接口 + /// + public Action[]> OutputSend { get; set; } + + #endregion 委托 + + #region 属性 + + /// + /// 文件资源访问接口。 + /// + public IFileResourceController FileController { get; set; } + + /// + /// 本节点ID + /// + public string ID { get; set; } + + /// + /// + /// + public bool IsHandshaked { get; private set; } + + /// + /// 是否为服务器组件 + /// + public bool IsService { get; private set; } + + /// + /// 日志 + /// + public ILog Logger { get; set; } + + /// + /// 获取可用于同步对的访问的对象。 + /// + public object SyncRoot { get; } = new object(); + + /// + /// + /// + public Func TryCanInvoke { get; set; } + + /// + /// 等待返回池 + /// + public WaitHandlePool WaitHandlePool { get; private set; } + + #endregion 属性 + + /// + /// 构造函数 + /// + public RpcActor(bool isService) + { + m_eventArgs = new ConcurrentDictionary(); + WaitHandlePool = new WaitHandlePool(); + m_userChannels = new ConcurrentDictionary(); + m_contextDic = new ConcurrentDictionary(); + IsService = isService; + } + + /// + /// 关闭 + /// + /// + public void Close(string message) + { + if (IsHandshaked) + { + IsHandshaked = false; + foreach (var item in m_userChannels.Values) + { + item.RequestDispose(false); + } + var keys = m_contextDic.Keys.ToArray(); + foreach (var item in keys) + { + if (m_contextDic.TryRemove(item, out TouchRpcCallContext rpcCallContext)) + { + rpcCallContext.TryCancel(); + } + } + WaitHandlePool.CancelAll(); + OnClose?.Invoke(this, message); + } + } + + /// + /// 建立对点 + /// + /// + /// + /// + public void Handshake(string verifyToken, string id, CancellationToken token = default, int timeout = 5000, Metadata metadata = null) + { + if (IsHandshaked) + { + return; + } + WaitVerify waitVerify = new WaitVerify() + { + Token = verifyToken, + ID = id, + Metadata = metadata + }; + WaitData waitData = WaitHandlePool.GetWaitData(waitVerify); + waitData.SetCancellationToken(token); + + try + { + SendFastObject(TouchRpcUtility.P_0_Handshake_Request, waitVerify); + switch (waitData.Wait(timeout)) + { + case WaitDataStatus.SetRunning: + { + WaitVerify verifyResult = (WaitVerify)waitData.WaitResult; + if (verifyResult.Status == 1) + { + ID = verifyResult.ID; + IsHandshaked = true; + OnHandshaked?.Invoke(this, new VerifyOptionEventArgs(verifyToken, verifyResult.Metadata) { Message = "成功建立" }); + verifyResult.Handle = true; + return; + } + else if (verifyResult.Status == 3) + { + verifyResult.Handle = true; + Close("连接数量已达到服务器设定最大值"); + throw new Exception("连接数量已达到服务器设定最大值"); + } + else if (verifyResult.Status == 4) + { + verifyResult.Handle = true; + Close("服务器拒绝连接"); + throw new Exception("服务器拒绝连接"); + } + else + { + verifyResult.Handle = true; + Close(verifyResult.Message); + throw new TokenVerifyException(verifyResult.Message); + } + } + case WaitDataStatus.Overtime: + Close("连接超时"); + throw new TimeoutException("连接超时"); + case WaitDataStatus.Canceled: + case WaitDataStatus.Disposed: + default: + Close(null); + return; + } + } + finally + { + WaitHandlePool.Destroy(waitData); + } + } + + /// + /// 处理接收数据 + /// + /// + public void InputReceivedData(ByteBlock byteBlock) + { + short protocol = TouchSocketBitConverter.Default.ToInt16(byteBlock.Buffer, 0); + switch (protocol) + { + #region 0-99 + + case TouchRpcUtility.P_0_Handshake_Request: + { + try + { + WaitVerify waitVerify = byteBlock.Seek(2).ReadObject(); + VerifyOptionEventArgs args = new VerifyOptionEventArgs(waitVerify.Token, waitVerify.Metadata); + if (!waitVerify.ID.IsNullOrEmpty()) + { + OnResetID?.Invoke(true, this, new WaitSetID(ID, waitVerify.ID)); + ID = waitVerify.ID; + } + OnHandshaking?.Invoke(this, args); + + if (args.IsPermitOperation) + { + waitVerify.ID = ID; + waitVerify.Status = 1; + byteBlock.Reset(); + byteBlock.WriteObject(waitVerify); + Send(TouchRpcUtility.P_1000_Handshake_Response, byteBlock); + IsHandshaked = true; + args.Message = "Success"; + ThreadPool.QueueUserWorkItem((o) => + { + try + { + OnHandshaked?.Invoke(this, args); + } + catch + { + } + },default); + } + else + { + waitVerify.Status = 2; + waitVerify.Message = args.Message; + byteBlock.Reset(); + byteBlock.WriteObject(waitVerify); + Send(TouchRpcUtility.P_1000_Handshake_Response, byteBlock); + Close(args.Message); + } + } + catch (Exception ex) + { + Close(ex.Message); + } + return; + } + case TouchRpcUtility.P_1000_Handshake_Response: + { + WaitVerify waitVerify = byteBlock.Seek(2).ReadObject(); + WaitHandlePool.SetRun(waitVerify); + SpinWait.SpinUntil(() => + { + return waitVerify.Handle; + }, 3000); + return; + } + case TouchRpcUtility.P_1_ResetID_Request: + { + try + { + byteBlock.Pos = 2; + WaitSetID waitSetID = byteBlock.ReadObject(); + try + { + OnResetID?.Invoke(false, this, waitSetID); + ID = waitSetID.NewID; + waitSetID.Status = 1; + } + catch (System.Exception ex) + { + waitSetID.Status = 2; + waitSetID.Message = ex.Message; + } + byteBlock.Reset(); + byteBlock.WriteObject(waitSetID); + Send(TouchRpcUtility.P_1001_ResetID_Response, byteBlock); + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1001_ResetID_Response: + { + try + { + byteBlock.Pos = 2; + WaitHandlePool.SetRun(byteBlock.ReadObject()); + } + catch (System.Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_2_Ping_Request://心跳 + { + byteBlock.Pos = 2; + + try + { + WaitPingPackage waitPing = new WaitPingPackage(); + waitPing.UnpackageRouter(byteBlock); + if (IsService && waitPing.Route) + { + if (TryRoute(RouteType.Ping, waitPing)) + { + if (TryFindRpcActor(waitPing.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_2_Ping_Request, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitPing.UnpackageBody(byteBlock); + waitPing.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + } + else + { + waitPing.UnpackageBody(byteBlock); + waitPing.Status = TouchSocketStatus.RoutingNotAllowed.ToValue(); + } + } + else + { + waitPing.UnpackageBody(byteBlock); + waitPing.Status = TouchSocketStatus.Success.ToValue(); + } + waitPing.SwitchId(); + byteBlock.Reset(); + waitPing.Package(byteBlock); + Send(TouchRpcUtility.P_1002_Ping_Response, byteBlock); + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1002_Ping_Response://心跳 + { + try + { + byteBlock.Pos = 2; + WaitPingPackage waitPing = new WaitPingPackage(); + waitPing.UnpackageRouter(byteBlock); + if (IsService && waitPing.Route) + { + if (TryFindRpcActor(waitPing.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_1002_Ping_Response, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + waitPing.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(waitPing); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + + #endregion 0-99 + + #region 100-199 + + case TouchRpcUtility.P_100_CreateChannel_Request: + { + try + { + byteBlock.Pos = 2; + WaitCreateChannelPackage waitCreateChannel = new WaitCreateChannelPackage(); + waitCreateChannel.UnpackageRouter(byteBlock); + if (this.IsService && waitCreateChannel.Route) + { + if (this.TryRoute(RouteType.CreateChannel, waitCreateChannel)) + { + if (TryFindRpcActor(waitCreateChannel.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_100_CreateChannel_Request, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitCreateChannel.UnpackageBody(byteBlock); + waitCreateChannel.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + } + else + { + waitCreateChannel.UnpackageBody(byteBlock); + waitCreateChannel.Status = TouchSocketStatus.RoutingNotAllowed.ToValue(); + } + } + else + { + waitCreateChannel.UnpackageBody(byteBlock); + + while (true) + { + if (RequestCreateChannel(waitCreateChannel.ChannelID, waitCreateChannel.Route ? waitCreateChannel.SourceId : waitCreateChannel.TargetId)) + { + waitCreateChannel.Status = TouchSocketStatus.Success.ToValue(); + break; + } + else + { + waitCreateChannel.Status = TouchSocketStatus.ChannelExisted.ToValue(); + } + + if (!waitCreateChannel.Random) + { + break; + } + waitCreateChannel.ChannelID = new object().GetHashCode(); + } + } + + waitCreateChannel.SwitchId(); + byteBlock.Reset(); + waitCreateChannel.Package(byteBlock); + Send(TouchRpcUtility.P_1100_CreateChannel_Response, byteBlock); + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1100_CreateChannel_Response: + { + try + { + byteBlock.Pos = 2; + WaitCreateChannelPackage waitCreateChannel = new WaitCreateChannelPackage(); + waitCreateChannel.UnpackageRouter(byteBlock); + if (this.IsService && waitCreateChannel.Route) + { + if (TryFindRpcActor(waitCreateChannel.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_1100_CreateChannel_Response, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + } + else + { + waitCreateChannel.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(waitCreateChannel); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_101_ChannelPackage: + { + try + { + byteBlock.Pos = 2; + ChannelPackage channelPackage = new ChannelPackage(); + channelPackage.UnpackageRouter(byteBlock); + if (this.IsService && channelPackage.Route) + { + if (TryFindRpcActor(channelPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_101_ChannelPackage, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + else + { + channelPackage.UnpackageBody(byteBlock); + channelPackage.Message = TouchSocketStatus.ClientNotFind.GetDescription(channelPackage.TargetId); + channelPackage.SwitchId(); + channelPackage.RunNow = true; + channelPackage.DataType = ChannelDataType.DisposeOrder; + byteBlock.Reset(); + channelPackage.Package(byteBlock); + this.Send(TouchRpcUtility.P_101_ChannelPackage, byteBlock); + } + } + else + { + channelPackage.UnpackageBody(byteBlock); + QueueChannelPackage(channelPackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + + #endregion 100-199 + + #region 200-299 + + case TouchRpcUtility.P_200_Invoke_Request: + { + try + { + byteBlock.Pos = 2; + WaitRouterPackage waitRouterPackage = new WaitRouterPackage(); + waitRouterPackage.UnpackageRouter(byteBlock); + if (IsService && waitRouterPackage.Route) + { + if (this.TryRoute(RouteType.Rpc, waitRouterPackage)) + { + if (TryFindRpcActor(waitRouterPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_200_Invoke_Request, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitRouterPackage.UnpackageBody(byteBlock); + waitRouterPackage.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + } + else + { + waitRouterPackage.UnpackageBody(byteBlock); + waitRouterPackage.Status = TouchSocketStatus.RoutingNotAllowed.ToValue(); + } + + byteBlock.Reset(); + waitRouterPackage.SwitchId(); + + TouchRpcPackage rpcPackage = waitRouterPackage.Map(); + rpcPackage.Package(byteBlock); + this.Send(TouchRpcUtility.P_1200_Invoke_Response, byteBlock); + } + else + { + TouchRpcPackage rpcPackage = new TouchRpcPackage(); + rpcPackage.Unpackage(byteBlock.Seek(2)); + ThreadPool.QueueUserWorkItem(InvokeThis, rpcPackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1200_Invoke_Response: + { + try + { + byteBlock.Pos = 2; + TouchRpcPackage rpcPackage = new TouchRpcPackage(); + rpcPackage.UnpackageRouter(byteBlock); + if (IsService && rpcPackage.Route) + { + if (this.TryFindRpcActor(rpcPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_1200_Invoke_Response, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + rpcPackage.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(rpcPackage); + } + } + catch (System.Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_204_CancelInvoke: + { + try + { + byteBlock.Pos = 2; + CanceledPackage canceledPackage = new CanceledPackage(); + canceledPackage.UnpackageRouter(byteBlock); + if (IsService && canceledPackage.Route) + { + if (this.TryFindRpcActor(canceledPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_204_CancelInvoke, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + canceledPackage.UnpackageBody(byteBlock); + if (m_contextDic.TryGetValue(canceledPackage.Sign, out TouchRpcCallContext context)) + { + context.TokenSource.Cancel(); + } + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + + #endregion 200-299 + + #region 400-499 + + case TouchRpcUtility.P_400_SendStreamToSocketClient_Request://StreamStatusToThis + { + try + { + byteBlock.Pos = 2; + ThreadPool.QueueUserWorkItem(RequestStreamToSocketClient, byteBlock.ReadObject()); + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1400_SendStreamToSocketClient_Response://StreamStatusToThis + { + try + { + byteBlock.Pos = 2; + WaitStream waitStream = byteBlock.ReadObject(); + WaitHandlePool.SetRun(waitStream); + } + catch (System.Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_401_SendStreamToClient://StreamToThis + { + try + { + byteBlock.Pos = 2; + ThreadPool.QueueUserWorkItem(RequestStreamToClient, byteBlock.ReadObject()); + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + + #endregion 400-499 + + #region 500-599 + + case TouchRpcUtility.P_500_PullFile_Request: + { + try + { + byteBlock.Pos = 2; + WaitFileInfoPackage waitFileInfoPackage = new WaitFileInfoPackage(); + waitFileInfoPackage.UnpackageRouter(byteBlock); + if (IsService && waitFileInfoPackage.Route) + { + if (this.TryRoute(RouteType.PullFile, waitFileInfoPackage)) + { + if (TryFindRpcActor(waitFileInfoPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_500_PullFile_Request, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitFileInfoPackage.UnpackageBody(byteBlock); + waitFileInfoPackage.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + } + else + { + waitFileInfoPackage.UnpackageBody(byteBlock); + waitFileInfoPackage.Status = TouchSocketStatus.RoutingNotAllowed.ToValue(); + } + + byteBlock.Reset(); + waitFileInfoPackage.SwitchId(); + waitFileInfoPackage.Package(byteBlock); + this.Send(TouchRpcUtility.P_1500_PullFile_Response, byteBlock); + } + else + { + waitFileInfoPackage.UnpackageBody(byteBlock); + ThreadPool.QueueUserWorkItem(RequestPullFile, waitFileInfoPackage); + } + } + catch (System.Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1500_PullFile_Response: + { + try + { + byteBlock.Pos = 2; + WaitFileInfoPackage waitFileInfoPackage = new WaitFileInfoPackage(); + waitFileInfoPackage.UnpackageRouter(byteBlock); + if (IsService && waitFileInfoPackage.Route) + { + if (TryFindRpcActor(waitFileInfoPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_1500_PullFile_Response, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + waitFileInfoPackage.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(waitFileInfoPackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + + return; + } + case TouchRpcUtility.P_501_BeginPullFile_Request: + { + try + { + byteBlock.Pos = 2; + WaitTransferPackage waitTransferPackage = new WaitTransferPackage(); + waitTransferPackage.UnpackageRouter(byteBlock); + if (IsService && waitTransferPackage.Route) + { + if (TryFindRpcActor(waitTransferPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_501_BeginPullFile_Request, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitTransferPackage.UnpackageBody(byteBlock); + waitTransferPackage.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + byteBlock.Reset(); + waitTransferPackage.SwitchId(); + waitTransferPackage.Package(byteBlock); + this.Send(TouchRpcUtility.P_1501_BeginPullFile_Response, byteBlock); + } + else + { + waitTransferPackage.UnpackageBody(byteBlock); + ThreadPool.QueueUserWorkItem(BeginPullFile, waitTransferPackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1501_BeginPullFile_Response: + { + try + { + byteBlock.Pos = 2; + WaitTransferPackage waitTransferPackage = new WaitTransferPackage(); + waitTransferPackage.UnpackageRouter(byteBlock); + if (IsService && waitTransferPackage.Route) + { + if (TryFindRpcActor(waitTransferPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_1501_BeginPullFile_Response, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + waitTransferPackage.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(waitTransferPackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_502_PushFile_Request: + { + try + { + byteBlock.Pos = 2; + WaitFileInfoPackage waitFileInfoPackage = new WaitFileInfoPackage(); + waitFileInfoPackage.UnpackageRouter(byteBlock); + if (IsService && waitFileInfoPackage.Route) + { + if (this.TryRoute(RouteType.PullFile, waitFileInfoPackage)) + { + if (TryFindRpcActor(waitFileInfoPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_502_PushFile_Request, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitFileInfoPackage.UnpackageBody(byteBlock); + waitFileInfoPackage.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + } + else + { + waitFileInfoPackage.UnpackageBody(byteBlock); + waitFileInfoPackage.Status = TouchSocketStatus.RoutingNotAllowed.ToValue(); + } + + byteBlock.Reset(); + waitFileInfoPackage.SwitchId(); + waitFileInfoPackage.Package(byteBlock); + this.Send(TouchRpcUtility.P_1502_PushFile_Response, byteBlock); + } + else + { + waitFileInfoPackage.UnpackageBody(byteBlock); + ThreadPool.QueueUserWorkItem(RequestPushFile, waitFileInfoPackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1502_PushFile_Response: + { + try + { + byteBlock.Pos = 2; + WaitTransferPackage waitTransferPackage = new WaitTransferPackage(); + waitTransferPackage.UnpackageRouter(byteBlock); + if (IsService && waitTransferPackage.Route) + { + if (TryFindRpcActor(waitTransferPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_1502_PushFile_Response, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + waitTransferPackage.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(waitTransferPackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + + return; + } + case TouchRpcUtility.P_509_PushFileAck_Request: + { + try + { + byteBlock.Pos = 2; + WaitPushFileAckPackage waitPushFileAckPackage = new WaitPushFileAckPackage(); + waitPushFileAckPackage.UnpackageRouter(byteBlock); + if (IsService && waitPushFileAckPackage.Route) + { + if (TryFindRpcActor(waitPushFileAckPackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_509_PushFileAck_Request, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + waitPushFileAckPackage.UnpackageBody(byteBlock); + m_eventArgs.TryAdd((int)waitPushFileAckPackage.Sign, waitPushFileAckPackage); + + EasyTask.DelayRun(10000, waitPushFileAckPackage, (a) => + { + m_eventArgs.TryRemove((int)((WaitPushFileAckPackage)a).Sign, out _); + }); + } + } + catch (System.Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_517_PullSmallFile_Request: + { + try + { + byteBlock.Pos = 2; + var waitSmallFilePackage = new WaitSmallFilePackage(); + waitSmallFilePackage.UnpackageRouter(byteBlock); + if (IsService && waitSmallFilePackage.Route) + { + if (this.TryRoute(RouteType.PullFile, waitSmallFilePackage)) + { + if (this.TryFindRpcActor(waitSmallFilePackage.TargetId, out RpcActor actor)) + { + actor.Send(protocol, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + waitSmallFilePackage.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + waitSmallFilePackage.Status = TouchSocketStatus.RoutingNotAllowed.ToValue(); + } + byteBlock.Reset(); + waitSmallFilePackage.SwitchId(); + waitSmallFilePackage.Package(byteBlock); + Send(TouchRpcUtility.P_1517_PullSmallFile_Response, byteBlock); + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + ThreadPool.QueueUserWorkItem(RequestPullSmallFile, waitSmallFilePackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1517_PullSmallFile_Response: + { + try + { + byteBlock.Pos = 2; + var waitSmallFilePackage = new WaitSmallFilePackage(); + waitSmallFilePackage.UnpackageRouter(byteBlock); + if (IsService && waitSmallFilePackage.Route) + { + if (this.TryFindRpcActor(waitSmallFilePackage.TargetId, out RpcActor actor)) + { + actor.Send(protocol, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(waitSmallFilePackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_518_PushSmallFile_Request: + { + try + { + byteBlock.Pos = 2; + var waitSmallFilePackage = new WaitSmallFilePackage(); + waitSmallFilePackage.UnpackageRouter(byteBlock); + if (IsService && waitSmallFilePackage.Route) + { + if (this.TryRoute(RouteType.PullFile, waitSmallFilePackage)) + { + if (this.TryFindRpcActor(waitSmallFilePackage.TargetId, out RpcActor actor)) + { + actor.Send(protocol, byteBlock.Buffer, 2, byteBlock.Len - 2); + return; + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + waitSmallFilePackage.Status = TouchSocketStatus.ClientNotFind.ToValue(); + } + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + waitSmallFilePackage.Status = TouchSocketStatus.RoutingNotAllowed.ToValue(); + } + byteBlock.Reset(); + waitSmallFilePackage.SwitchId(); + waitSmallFilePackage.Package(byteBlock); + Send(TouchRpcUtility.P_1518_PushSmallFile_Response, byteBlock); + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + ThreadPool.QueueUserWorkItem(RequestPushSmallFile, waitSmallFilePackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + case TouchRpcUtility.P_1518_PushSmallFile_Response: + { + try + { + byteBlock.Pos = 2; + var waitSmallFilePackage = new WaitSmallFilePackage(); + waitSmallFilePackage.UnpackageRouter(byteBlock); + + if (IsService && waitSmallFilePackage.Route) + { + if (this.TryFindRpcActor(waitSmallFilePackage.TargetId, out RpcActor actor)) + { + actor.Send(TouchRpcUtility.P_1518_PushSmallFile_Response, byteBlock.Buffer, 2, byteBlock.Len - 2); + } + } + else + { + waitSmallFilePackage.UnpackageBody(byteBlock); + WaitHandlePool.SetRun(waitSmallFilePackage); + } + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + return; + } + + #endregion 500-599 + + default: + { + try + { + OnReceived?.Invoke(this, protocol, byteBlock); + } + catch (Exception ex) + { + Logger.Error(this, $"在protocol={protocol}中发生错误。信息:{ex.Message}"); + } + break; + } + } + } + + /// + /// 尝试获取指定Id的RpcActor。一般此方法仅在Service下有效。 + /// + /// + /// + /// + public bool TryFindRpcActor(string targetId, out RpcActor rpcActor) + { + if (targetId == ID) + { + rpcActor = this; + return true; + } + if (OnFindRpcActor?.Invoke(targetId) is RpcActor actor) + { + rpcActor = actor; + return true; + } + + rpcActor = default; + return false; + } + + /// + /// 尝试请求路由,触发路由相关插件。 + /// + /// + /// + /// + public bool TryRoute(RouteType routerType, RouterPackage routerPackage) + { + try + { + PackageRouterEventArgs args = new PackageRouterEventArgs(routerType, routerPackage); + OnRouting?.Invoke(this, args); + return args.IsPermitOperation; + } + catch + { + return false; + } + } + + /// + /// 尝试请求路由,触发路由相关插件。并在路由失败时向中传递消息。 + /// + /// + /// + /// + public bool TryRoute(RouteType routerType, WaitRouterPackage routerPackage) + { + try + { + PackageRouterEventArgs args = new PackageRouterEventArgs(routerType, routerPackage); + OnRouting?.Invoke(this, args); + routerPackage.Message = args.Message; + return args.IsPermitOperation; + } + catch + { + return false; + } + } + + /// + public bool Ping(int timeout = 5000) + { + return PrivatePing(default, timeout); + } + + /// + public bool Ping(string targetId, int timeout = 5000) + { + if (IsService) + { + if (this.TryFindRpcActor(targetId, out RpcActor rpcActor)) + { + return rpcActor.Ping(timeout); + } + return false; + } + return PrivatePing(targetId, timeout); + } + + private bool PrivatePing(string targetId, int timeout) + { + try + { + WaitPingPackage waitPing = new WaitPingPackage + { + TargetId = targetId, + SourceId = ID, + Route = targetId.HasValue() + }; + var wait = WaitHandlePool.GetWaitData(waitPing); + using (ByteBlock byteBlock = new ByteBlock()) + { + waitPing.Package(byteBlock); + Send(TouchRpcUtility.P_2_Ping_Request, byteBlock); + } + + switch (wait.Wait(timeout)) + { + case WaitDataStatus.SetRunning: + { + switch (wait.WaitResult.Status.ToStatus()) + { + case TouchSocketStatus.Success: return true; + default: + return false; + } + } + case WaitDataStatus.Default: + case WaitDataStatus.Overtime: + case WaitDataStatus.Canceled: + case WaitDataStatus.Disposed: + default: + return false; + } + } + catch + { + return false; + } + } + + /// + /// 重新设置ID,并且同步到对端 + /// + /// + /// + public void ResetID(string id) + { + WaitSetID waitSetID = new WaitSetID(ID, id); + + WaitData waitData = WaitHandlePool.GetWaitData(waitSetID); + + ByteBlock byteBlock = new ByteBlock(); + byteBlock.WriteObject(waitSetID); + + Send(TouchRpcUtility.P_1_ResetID_Request, byteBlock.Buffer, 0, byteBlock.Len); + + switch (waitData.Wait(5000)) + { + case WaitDataStatus.SetRunning: + { + if (waitData.WaitResult.Status == 1) + { + ID = id; + } + else + { + throw new Exception(waitData.WaitResult.Message); + } + break; + } + case WaitDataStatus.Overtime: + throw new TimeoutException(TouchSocketStatus.Overtime.GetDescription()); + case WaitDataStatus.Canceled: + break; + + case WaitDataStatus.Disposed: + default: + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + } + + /// + /// 以Fast序列化,发送小(64K)对象。接收方需要将Pos设为2,然后ReadObject即可。 + /// + /// + /// + public void SendFastObject(short protocol, object obj) + { + using ByteBlock byteBlock = new ByteBlock(); + byteBlock.WriteObject(obj, SerializationType.FastBinary); + Send(protocol, byteBlock); + } + + /// + /// 以包发送小(64K)对象。接收方需要将Pos设为2,然后ReadPackage即可。 + /// + /// + /// + public void SendPackage(short protocol, IPackage package) + { + using ByteBlock byteBlock = new ByteBlock(); + package.Package(byteBlock); + Send(protocol, byteBlock); + } + + #region 重写 + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + Caller = null; + OnClose = null; + OnFileTransfered = null; + OnFileTransfering = null; + OnRouting = null; + OnFindRpcActor = null; + OnHandshaked = null; + OnHandshaking = null; + OnReceived = null; + OnResetID = null; + OnStreamTransfered = null; + OnStreamTransfering = null; + OutputSend = null; + WaitHandlePool.SafeDispose(); + Close(nameof(Dispose)); + base.Dispose(disposing); + } + + #endregion 重写 + + #region 协议同步发送 + + /// + /// 发送字节 + /// + /// + /// + /// + /// + public void Send(short protocol, byte[] buffer, int offset, int length) + { + ArraySegment[] transferBytes = new ArraySegment[] + { + new ArraySegment(TouchSocketBitConverter.Default.GetBytes(protocol)), + new ArraySegment(buffer,offset,length) + }; + OutputSend?.Invoke(this, transferBytes); + } + + private void Send(short protocol, ByteBlock byteBlock) + { + Send(protocol, byteBlock.Buffer, 0, byteBlock.Len); + } + + #endregion 协议同步发送 + + #region 协议异步发送 + + /// + /// 异步发送字节 + /// + /// + /// + /// + /// + public Task SendAsync(short protocol, byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + Send(protocol, buffer, offset, length); + }); + } + + #endregion 协议异步发送 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs.meta new file mode 100644 index 0000000..58f89ca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/RpcActor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9214759cfe971bc478cee4866bfe6010 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp.meta new file mode 100644 index 0000000..15ff9d2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc191726a0f0d9a4baddaaf0f13cf27d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs new file mode 100644 index 0000000..5573f96 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net; +using TouchSocket.Core; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.TouchRpc +{ + internal class UdpRpcActor : RpcActor + { + private readonly UdpSessionBase m_udpSession; + private readonly EndPoint m_endPoint; + + public int Tick; + + public UdpRpcActor(UdpSessionBase udpSession, EndPoint endPoint, ILog logger) : base(false) + { + OutputSend = RpcActorSend; + m_udpSession = udpSession; + m_endPoint = endPoint; + Logger = logger; + } + + private void RpcActorSend(RpcActor actor, ArraySegment[] transferBytes) + { + m_udpSession.Send(m_endPoint, transferBytes); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs.meta new file mode 100644 index 0000000..068432a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/RpcActor/Udp/UdpRpcActor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 580034d7a855ba54e990424c65360c51 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream.meta new file mode 100644 index 0000000..b1d460e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8064570823a76b24fab098496b428cbb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs new file mode 100644 index 0000000..bb2504c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs @@ -0,0 +1,41 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 流信息 + /// + public struct StreamInfo + { + /// + /// 构造函数 + /// + /// + /// + public StreamInfo(long size, string streamType) + { + Size = size; + StreamType = streamType; + } + + /// + /// 流长度 + /// + public long Size { get; private set; } + + /// + /// 流类型 + /// + public string StreamType { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs.meta new file mode 100644 index 0000000..823294f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e12e984e06e5c7a4f9b28dfc4e99d1f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs new file mode 100644 index 0000000..f9c431a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 流传输操作器 + /// + public class StreamOperator : FlowOperator + { + + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs.meta new file mode 100644 index 0000000..9a3e0f6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/StreamOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4484ec54c3ec06a49a4936667f79d8a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs new file mode 100644 index 0000000..1a5dd62 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Rpc.TouchRpc +{ + /// + /// 等待流状态返回 + /// + public class WaitStream : WaitResult + { + /// + /// 流长度 + /// + public long Size { get; set; } + + /// + /// 流类型 + /// + public string StreamType { get; set; } + + /// + /// 元数据 + /// + public Metadata Metadata { get; set; } + + /// + /// 开启的通道标识 + /// + public int ChannelID { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs.meta new file mode 100644 index 0000000..f5d5a73 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/TouchRpc/Stream/WaitStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 67fcf920dae725c4d8284a7557ceb762 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi.meta new file mode 100644 index 0000000..a2d38e8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9dfab4ee5f74aae46b3bb05f9bf4b723 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute.meta new file mode 100644 index 0000000..1a15e24 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 36bd5111c18cad44ebd2b0a388939857 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs new file mode 100644 index 0000000..d3dbe11 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs @@ -0,0 +1,57 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Http; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// 跨域相关设置 + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public sealed class OriginAttribute : RpcActionFilterAttribute + { + /// + /// 允许客户端携带验证信息 + /// + public bool AllowCredentials { get; set; } = true; + + /// + /// 允许跨域的方法。 + /// 默认为“PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH” + /// + public string AllowMethods { get; set; } = "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH"; + + /// + /// 允许跨域的域名 + /// + public string AllowOrigin { get; set; } = "*"; + + /// + /// + /// + /// + /// + /// + public override void Executed(ICallContext callContext, object[] parameters, ref InvokeResult invokeResult) + { + if (callContext is IHttpCallContext httpCallContext && httpCallContext.HttpContext != default) + { + httpCallContext.HttpContext.Response.SetHeader("Access-Control-Allow-Origin", AllowOrigin); + httpCallContext.HttpContext.Response.SetHeader("Access-Control-Allow-Methods", AllowMethods); + httpCallContext.HttpContext.Response.SetHeader("Access-Control-Allow-Credentials", AllowCredentials.ToString().ToLower()); + } + base.Executed(callContext,parameters, ref invokeResult); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs.meta new file mode 100644 index 0000000..838a4c2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/OriginAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b4a35fb46ee98dd4fa9a7f29a2e68259 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs new file mode 100644 index 0000000..998841c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// 表示WebApi路由。 + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] + public class RouterAttribute : Attribute + { + /// + /// 表示WebApi路由。 + /// 该模板在用于方法时,会覆盖类的使用。 + /// 模板必须由“/”开始,如果没有设置,会自动补齐。 + /// 模板不支持参数约定,仅支持方法路由。 + /// 模板有以下约定: + /// + /// 不区分大小写 + /// 以“[Api]”表示当前类名,如果不包含此字段,则意味着会使用绝对设置 + /// 以“[Action]”表示当前方法名,如果不包含此字段,则意味着会使用绝对设置 + /// + /// + /// + /// + public RouterAttribute(string routeTemple) + { + if (!routeTemple.StartsWith("/")) + { + routeTemple = routeTemple.Insert(0, "/"); + } + RouteTemple = routeTemple; + } + + /// + /// 路由模板。 + /// + public string RouteTemple { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs.meta new file mode 100644 index 0000000..be88b77 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/RouterAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f1a0c424fd418c41a1458c9d59161c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs new file mode 100644 index 0000000..333fb8a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs @@ -0,0 +1,163 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// WebApiAttribute + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class WebApiAttribute : RpcAttribute + { + private readonly HttpMethodType m_method; + + /// + /// 构造函数。 + /// + /// + public WebApiAttribute(HttpMethodType method) + { + m_method = method; + } + + /// + /// + /// + /// + public override Type[] GetGenericConstraintTypes() + { + return new Type[] { typeof(IWebApiClient) }; + } + + /// + /// 函数类型。 + /// + public HttpMethodType Method => m_method; + + /// + /// + /// + /// + /// + public override string GetInvokenKey(MethodInstance methodInstance) + { + int i = 0; + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + i = 1; + } + if (m_method == HttpMethodType.GET) + { + string actionUrl = GetRouteUrls(methodInstance)[0]; + if (methodInstance.ParameterNames.Length > i) + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append(actionUrl); + stringBuilder.Append("?"); + for (; i < methodInstance.ParameterNames.Length; i++) + { + stringBuilder.Append(methodInstance.ParameterNames[i] + "={&}".Replace("&", i.ToString())); + if (i != methodInstance.ParameterNames.Length - 1) + { + stringBuilder.Append("&"); + } + } + actionUrl = stringBuilder.ToString(); + } + return $"GET:{actionUrl}"; + } + else if (m_method == HttpMethodType.POST) + { + string actionUrl = GetRouteUrls(methodInstance)[0]; + if (methodInstance.ParameterNames.Length > i + 1) + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append(actionUrl); + stringBuilder.Append("?"); + for (; i < methodInstance.ParameterNames.Length - 1; i++) + { + stringBuilder.Append(methodInstance.ParameterNames[i] + "={&}".Replace("&", i.ToString())); + if (i != methodInstance.ParameterNames.Length - 2) + { + stringBuilder.Append("&"); + } + } + actionUrl = stringBuilder.ToString(); + } + return $"POST:{actionUrl}"; + } + else + { + return base.GetInvokenKey(methodInstance); + } + } + + /// + /// 获取路由路径。 + /// 路由路径的第一个值会被当做调用值。 + /// + /// + /// + public virtual string[] GetRouteUrls(MethodInstance methodInstance) + { + if (methodInstance.GetAttribute() is WebApiAttribute webApiAttribute) + { + List urls = new List(); + + var attrs = methodInstance.Info.GetCustomAttributes(typeof(RouterAttribute), true); + if (attrs.Length > 0) + { + foreach (RouterAttribute item in attrs) + { + string url = item.RouteTemple.ToLower() + .Replace("[api]", methodInstance.ServerType.Name) + .Replace("[action]", webApiAttribute.GetMethodName(methodInstance, false)).ToLower(); + + if (!urls.Contains(url)) + { + urls.Add(url); + } + } + } + else + { + attrs = methodInstance.ServerType.GetCustomAttributes(typeof(RouterAttribute), true); + if (attrs.Length > 0) + { + foreach (RouterAttribute item in attrs) + { + string url = item.RouteTemple.ToLower() + .Replace("[api]", methodInstance.ServerType.Name) + .Replace("[action]", webApiAttribute.GetMethodName(methodInstance, false)).ToLower(); + + if (!urls.Contains(url)) + { + urls.Add(url); + } + } + } + else + { + urls.Add($"/{methodInstance.Info.DeclaringType.Name}/{methodInstance.Name}".ToLower()); + } + } + + return urls.ToArray(); + } + return default; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs.meta new file mode 100644 index 0000000..e6a0adf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Attribute/WebApiAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e18489e62e9c3db43bc9edf36810c558 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common.meta new file mode 100644 index 0000000..7d07ba0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc34ee96ea385eb48a98652e779660a9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs new file mode 100644 index 0000000..2e0eb81 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// 结果状态 + /// + public class ActionResult + { + /// + /// 状态类型 + /// + public InvokeStatus Status { get; set; } + + /// + /// 消息 + /// + public string Message { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs.meta new file mode 100644 index 0000000..f9bf5aa --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/ActionResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a0774244434d3f447b50a0c1f6abd745 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs new file mode 100644 index 0000000..91dd15f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.Threading; +using TouchSocket.Http; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// WebApi调用上下文 + /// + internal class WebApiCallContext : IWebApiCallContext + { + private CancellationTokenSource m_tokenSource; + + /// + /// + /// + public object Caller { get; internal set; } + + /// + /// Http上下文 + /// + public HttpContext HttpContext { get; internal set; } + + /// + /// + /// + public MethodInstance MethodInstance { get; internal set; } + + /// + /// + /// + public CancellationTokenSource TokenSource + { + get + { + if (m_tokenSource == null) + { + m_tokenSource = new CancellationTokenSource(); + } + return m_tokenSource; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs.meta new file mode 100644 index 0000000..dacc735 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Common/WebApiCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 721e1072b441f4b408bbd775755f3a29 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components.meta new file mode 100644 index 0000000..7f79912 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 48481de7fd4276f40a6adb3ba8a61f2c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs new file mode 100644 index 0000000..5d6a24a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs @@ -0,0 +1,255 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Rpc.TouchRpc; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// WebApi客户端 + /// + public class WebApiClient : HttpClientBase, IWebApiClient + { + /// + /// 构造函数 + /// + public WebApiClient() + { + m_stringConverter = new StringConverter(); + } + + /// + /// + /// + public Func TryCanInvoke { get; set; } + + private readonly StringConverter m_stringConverter; + + /// + /// 字符串转化器 + /// + public StringConverter StringConverter => m_stringConverter; + + #region RPC调用 + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + string[] strs = method.Split(':'); + if (strs.Length != 2) + { + throw new RpcException("不是有效的url请求。"); + } + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + HttpRequest request = new HttpRequest(); + + switch (strs[0]) + { + case TouchSocketHttpUtility.Get: + { + request.InitHeaders() + .SetHost(RemoteIPHost.Host) + .SetUrl(strs[1].Format(parameters)) + .AsGet(); + break; + } + case TouchSocketHttpUtility.Post: + { + request.InitHeaders() + .SetHost(RemoteIPHost.Host) + .SetUrl(strs[1].Format(parameters)) + .AsPost(); + if (parameters.Length > 0) + { + request.FromJson(parameters[parameters.Length - 1].ToJson()); + } + break; + } + default: + break; + } + + HttpResponse response = RequestContent(request, false, invokeOption.Timeout, invokeOption.Token); + + if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) + { + return default; + } + + if (response.StatusCode == "200") + { + return (T)m_stringConverter.ConvertFrom(response.GetBody(), typeof(T)); + } + else if (response.StatusCode == "422") + { + throw new RpcException(response.GetBody().FromJson().Message); + } + else + { + throw new RpcException(response.StatusMessage); + } + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + string[] strs = method.Split(':'); + if (strs.Length != 2) + { + throw new RpcException("不是有效的url请求。"); + } + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + HttpRequest request = new HttpRequest(); + + switch (strs[0]) + { + case TouchSocketHttpUtility.Get: + { + request.InitHeaders() + .SetHost(RemoteIPHost.Host) + .SetUrl(strs[1].Format(parameters)) + .AsGet(); + break; + } + case TouchSocketHttpUtility.Post: + { + request.InitHeaders() + .SetHost(RemoteIPHost.Host) + .SetUrl(strs[1].Format(parameters)) + .AsPost(); + if (parameters.Length > 0) + { + request.FromJson(parameters[parameters.Length - 1].ToJson()); + } + break; + } + default: + break; + } + HttpResponse response = RequestContent(request, false, invokeOption.Timeout, invokeOption.Token); + if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) + { + return; + } + + if (response.StatusCode == "200") + { + return; + } + else if (response.StatusCode == "422") + { + throw new RpcException(response.GetBody().FromJson().Message); + } + else + { + throw new RpcException(response.StatusMessage); + } + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + Invoke(method, invokeOption, ref parameters, null); + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return Invoke(method, invokeOption, ref parameters, null); + } + + /// + /// 函数式调用 + /// + /// 函数名 + /// 参数 + /// Rpc调用设置 + /// + /// + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + Invoke(method, invokeOption, parameters); + }); + } + + /// + /// 函数式调用 + /// + /// 方法名 + /// 参数 + /// Rpc调用设置 + /// 调用超时 + /// Rpc异常 + /// 其他异常 + /// 服务器返回结果 + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + return Invoke(method, invokeOption, parameters); + }); + } + + #endregion RPC调用 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs.meta new file mode 100644 index 0000000..8f93e90 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Components/WebApiClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 49d462b478a350e4e81e5eea168a07b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config.meta new file mode 100644 index 0000000..b84bab3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ce8754fb8ed3f24f83894f86ddc8f0f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs new file mode 100644 index 0000000..bbdeee1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; +using TouchSocket.Rpc.WebApi; + +namespace TouchSocket.Sockets +{ + /// + /// WebApiConfigExtensions + /// + public static class WebApiConfigExtensions + { + /// + /// 构建WebApiClient类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithWebApiClient(this TouchSocketConfig config) where TClient : IWebApiClient + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Connect(); + return client; + } + + /// + /// 构建WebApiClient类客户端,并连接 + /// + /// + /// + public static WebApiClient BuildWithWebApiClient(this TouchSocketConfig config) + { + return BuildWithWebApiClient(config); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs.meta new file mode 100644 index 0000000..d09420d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Config/WebApiConfigExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 100cfacbf719f4542ad14a11b355f818 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum.meta new file mode 100644 index 0000000..0af6110 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fe83de9c04f387747a73f369dad89590 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs new file mode 100644 index 0000000..de24acc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Rpc.WebApi +{ + /// + /// 请求函数类型 + /// + public enum HttpMethodType + { + /// + /// 以GET方式。支持调用上下文。 + /// 以该方式时,所有的参数类型必须是基础类型。所有的参数来源均来自url参数。 + /// + GET, + + /// + /// 以Post方式。支持调用上下文。 + /// 以该方式时,可以应对以下情况: + /// + /// 仅有一个参数时,该参数可以为任意类型,且参数来源为Body + /// 当有多个参数时,最后一个参数可以为任意类型,且参数来源为Body,其余参数均必须是基础类型,且来自url参数。 + /// + /// + POST + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs.meta new file mode 100644 index 0000000..66d54be --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Enum/HttpMethodType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2dee0b47d182bd4884e741b12315eac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions.meta new file mode 100644 index 0000000..d40c8a6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fb63fb9d85860694fb9774bcf5d5a016 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs new file mode 100644 index 0000000..0a2b56f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Rpc.WebApi; + +namespace TouchSocket.Core +{ + /// + /// WebApiPluginsManagerExtension + /// + public static class WebApiPluginsManagerExtension + { + /// + /// 使用WebApi的插件。仅服务器可用。 + /// + /// + /// + public static WebApiParserPlugin UseWebApi(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs.meta new file mode 100644 index 0000000..dc3dd17 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Extensions/WebApiPluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2aa090f36a701614eae6ccb400181c36 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface.meta new file mode 100644 index 0000000..31e9c3c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 615f4608b72cc144ab0a24d06caa314c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs new file mode 100644 index 0000000..17c1ab2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Http; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// IHttpCallContext + /// + public interface IHttpCallContext : ICallContext + { + /// + /// Http上下文 + /// + HttpContext HttpContext { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs.meta new file mode 100644 index 0000000..40e4024 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IHttpCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a7d28906585b6347aa2e0c633768b54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs new file mode 100644 index 0000000..ec53726 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// IWebApiCallContext + /// + public interface IWebApiCallContext : IHttpCallContext + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs.meta new file mode 100644 index 0000000..3f7b627 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d77ebb670c57b244eba96e9331c5c455 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs new file mode 100644 index 0000000..f1b7140 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Http; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// IWebApiClient + /// + public interface IWebApiClient : IRpcClient, IHttpClient + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs.meta new file mode 100644 index 0000000..439a8be --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Interface/IWebApiClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a931d4f194b1aa540bfc6e52b03155de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins.meta new file mode 100644 index 0000000..0af4768 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e92fb16cfdf062243bff66e28efd24e6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs new file mode 100644 index 0000000..564c368 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs @@ -0,0 +1,358 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Sockets; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.WebApi +{ + /// + /// WebApi解析器 + /// + public class WebApiParserPlugin : HttpPluginBase, IRpcParser + { + private readonly ActionMap m_actionMap; + private readonly StringConverter m_converter; + private RpcStore m_rpcStore; + + /// + /// 构造函数 + /// + public WebApiParserPlugin([DependencyParamterInject(true)] RpcStore rpcStore) + { + m_actionMap = new ActionMap(); + m_converter = new StringConverter(); + rpcStore?.AddRpcParser(GetType().Name, this); + } + + /// + /// 转化器 + /// + public StringConverter Converter => m_converter; + + /// + /// 获取路由映射图 + /// + public ActionMap RouteMap => m_actionMap; + + /// + /// 所属服务器 + /// + public RpcStore RpcStore => m_rpcStore; + + /// + /// + /// + /// + /// + protected override void OnGet(ITcpClientBase client, HttpContextEventArgs e) + { + if (m_actionMap.TryGetMethodInstance(e.Context.Request.RelativeURL.ToLower(), out MethodInstance methodInstance)) + { + e.Handled = true; + + InvokeResult invokeResult = new InvokeResult(); + object[] ps = null; + WebApiCallContext callContext = new WebApiCallContext() + { + Caller = client, + HttpContext = e.Context, + MethodInstance = methodInstance + }; + if (methodInstance.IsEnable) + { + try + { + ps = new object[methodInstance.Parameters.Length]; + int i = 0; + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + ps[i] = callContext; + i++; + } + if (e.Context.Request.Query == null) + { + for (; i < methodInstance.Parameters.Length; i++) + { + ps[i] = methodInstance.ParameterTypes[i].GetDefault(); + } + } + else + { + for (; i < methodInstance.Parameters.Length; i++) + { + string value = e.Context.Request.Query.Get(methodInstance.ParameterNames[i]); + if (!value.IsNullOrEmpty()) + { + ps[i] = m_converter.ConvertFrom(value, methodInstance.ParameterTypes[i]); + } + else + { + ps[i] = methodInstance.ParameterTypes[i].GetDefault(); + } + } + } + } + catch (Exception ex) + { + invokeResult.Status = InvokeStatus.Exception; + invokeResult.Message = ex.Message; + } + } + else + { + invokeResult.Status = InvokeStatus.UnEnable; + } + if (invokeResult.Status == InvokeStatus.Ready) + { + IRpcServer rpcServer = methodInstance.ServerFactory.Create(callContext, ps); + if (rpcServer is ITransientRpcServer transientRpcServer) + { + transientRpcServer.CallContext = callContext; + } + invokeResult = m_rpcStore.Execute(rpcServer, ps, callContext); + } + + if (e.Context.Response.Responsed) + { + return; + } + HttpResponse httpResponse = e.Context.Response; + switch (invokeResult.Status) + { + case InvokeStatus.Success: + { + httpResponse.FromJson(m_converter.ConvertTo(invokeResult.Result)).SetStatus(); + break; + } + case InvokeStatus.UnFound: + { + string jsonString = m_converter.ConvertTo(new ActionResult() { Status = invokeResult.Status, Message = invokeResult.Message }); + httpResponse.FromJson(jsonString).SetStatus("404"); + break; + } + case InvokeStatus.UnEnable: + { + string jsonString = m_converter.ConvertTo(new ActionResult() { Status = invokeResult.Status, Message = invokeResult.Message }); + httpResponse.FromJson(jsonString).SetStatus("405"); + break; + } + case InvokeStatus.InvocationException: + case InvokeStatus.Exception: + { + string jsonString = m_converter.ConvertTo(new ActionResult() { Status = invokeResult.Status, Message = invokeResult.Message }); + httpResponse.FromJson(jsonString).SetStatus("422"); + break; + } + } + + using (ByteBlock byteBlock = new ByteBlock()) + { + httpResponse.Build(byteBlock); + client.DefaultSend(byteBlock); + } + + if (!e.Context.Request.KeepAlive) + { + client.TryShutdown(SocketShutdown.Both); + } + } + + base.OnGet(client, e); + } + + /// + /// + /// + /// + /// + protected override void OnPost(ITcpClientBase client, HttpContextEventArgs e) + { + if (m_actionMap.TryGetMethodInstance(e.Context.Request.RelativeURL.ToLower(), out MethodInstance methodInstance)) + { + e.Handled = true; + + var invokeResult = new InvokeResult(); + object[] ps = null; + var callContext = new WebApiCallContext() + { + Caller = client, + HttpContext = e.Context, + MethodInstance = methodInstance + }; + if (methodInstance.IsEnable) + { + try + { + int index; + ps = new object[methodInstance.Parameters.Length]; + int i = 0; + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + ps[i] = callContext; + i++; + index = methodInstance.Parameters.Length - 2; + } + else + { + index = methodInstance.Parameters.Length - 1; + } + if (e.Context.Request.Query == null) + { + for (; i < methodInstance.Parameters.Length - 1; i++) + { + ps[i] = methodInstance.ParameterTypes[i].GetDefault(); + } + } + else + { + for (; i < methodInstance.Parameters.Length - 1; i++) + { + string value = e.Context.Request.Query.Get(methodInstance.ParameterNames[i]); + if (!value.IsNullOrEmpty()) + { + ps[i] = m_converter.ConvertFrom(value, methodInstance.ParameterTypes[i]); + } + else + { + ps[i] = methodInstance.ParameterTypes[i].GetDefault(); + } + } + } + + if (index >= 0) + { + string str = e.Context.Request.GetBody(); + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + index++; + } + ps[index] = m_converter.ConvertFrom(str, methodInstance.ParameterTypes[index]); + } + } + catch (Exception ex) + { + invokeResult.Status = InvokeStatus.Exception; + invokeResult.Message = ex.Message; + } + } + else + { + invokeResult.Status = InvokeStatus.UnEnable; + } + if (invokeResult.Status == InvokeStatus.Ready) + { + IRpcServer rpcServer = methodInstance.ServerFactory.Create(callContext, ps); + if (rpcServer is ITransientRpcServer transientRpcServer) + { + transientRpcServer.CallContext = callContext; + } + invokeResult = m_rpcStore.Execute(rpcServer, ps, callContext); + } + + if (e.Context.Response.Responsed) + { + return; + } + HttpResponse httpResponse = e.Context.Response; + switch (invokeResult.Status) + { + case InvokeStatus.Success: + { + httpResponse.FromJson(m_converter.ConvertTo(invokeResult.Result)).SetStatus(); + break; + } + case InvokeStatus.UnFound: + { + string jsonString = m_converter.ConvertTo(new ActionResult() { Status = invokeResult.Status, Message = invokeResult.Message }); + httpResponse.FromJson(jsonString).SetStatus("404", invokeResult.Status.ToString()); + break; + } + case InvokeStatus.UnEnable: + { + string jsonString = m_converter.ConvertTo(new ActionResult() { Status = invokeResult.Status, Message = invokeResult.Message }); + httpResponse.FromJson(jsonString).SetStatus("405", invokeResult.Status.ToString()); + break; + } + case InvokeStatus.InvocationException: + case InvokeStatus.Exception: + { + string jsonString = m_converter.ConvertTo(new ActionResult() { Status = invokeResult.Status, Message = invokeResult.Message }); + httpResponse.FromJson(jsonString).SetStatus("422", invokeResult.Status.ToString()); + break; + } + } + + using (ByteBlock byteBlock = new ByteBlock()) + { + httpResponse.Build(byteBlock); + client.DefaultSend(byteBlock); + } + + if (!e.Context.Request.KeepAlive) + { + client.TryShutdown(SocketShutdown.Both); + } + } + + base.OnPost(client, e); + } + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is WebApiAttribute attribute) + { + string[] actionUrls = attribute.GetRouteUrls(methodInstance); + if (actionUrls != null) + { + foreach (var item in actionUrls) + { + m_actionMap.Add(item, methodInstance); + } + } + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is WebApiAttribute attribute) + { + string[] actionUrls = attribute.GetRouteUrls(methodInstance); + if (actionUrls != null) + { + foreach (var item in actionUrls) + { + m_actionMap.Remove(item); + } + } + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcService) + { + m_rpcStore = rpcService; + } + + #endregion RPC解析器 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs.meta new file mode 100644 index 0000000..dc4c7fc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/WebApi/Plugins/WebApiParserPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e73990a50a5bce24c9875556a14830ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc.meta new file mode 100644 index 0000000..ba534e0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a3944f96b2539254d82fbc70f1f56247 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute.meta new file mode 100644 index 0000000..494546c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ca207cb23dd15154facafc860b017ec5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs new file mode 100644 index 0000000..a9e4a74 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Rpc.XmlRpc +{ + /// + /// 适用于XmlRpc的标记 + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class XmlRpcAttribute : RpcAttribute + { + /// + /// 适用于XmlRpc的标记. + /// 是否仅以函数名调用,当为True是,调用时仅需要传入方法名即可。 + /// + /// + public XmlRpcAttribute(bool methodInvoke = false) + { + MethodInvoke = methodInvoke; + } + + /// + /// 适用于XmlRpc的标记. + /// + /// + public XmlRpcAttribute(string invokenKey) + { + InvokeKey = invokenKey; + } + + + /// + /// + /// + /// + public override Type[] GetGenericConstraintTypes() + { + return new Type[] { typeof(IXmlRpcClient) }; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs.meta new file mode 100644 index 0000000..8ab25f6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Attribute/XmlRpcAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e6625202407fcfa4bae354fd959d08a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common.meta new file mode 100644 index 0000000..f79318c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d4d9a2acc3965344c9de570baa9be5d7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs new file mode 100644 index 0000000..60d0327 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs @@ -0,0 +1,259 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections; +using System.Reflection; +using System.Text; +using System.Xml; +using TouchSocket.Core; +using TouchSocket.Http; + +namespace TouchSocket.Rpc.XmlRpc +{ + internal static class XmlDataTool + { + public static object GetValue(XmlNode valueNode, Type type) + { + if (valueNode == null) + { + return type.GetDefault(); + } + switch (valueNode.Name) + { + case "boolean": + { + return bool.Parse(valueNode.InnerText); + } + case "i4": + case "int": + { + return int.Parse(valueNode.InnerText); + } + case "double": + { + return double.Parse(valueNode.InnerText); + } + case "dateTime.iso8601": + { + return DateTime.Parse(valueNode.InnerText); + } + case "base64": + { + return valueNode.InnerText; + } + case "struct": + { + object instance = Activator.CreateInstance(type); + foreach (XmlNode memberNode in valueNode.ChildNodes) + { + string name = memberNode.SelectSingleNode("name").InnerText; + PropertyInfo property = type.GetProperty(name); + property.SetValue(instance, GetValue(memberNode.SelectSingleNode("value").FirstChild, property.PropertyType)); + } + return instance; + } + case "arrays": + case "array": + { + if (type.GetElementType() != null) + { + XmlNode dataNode = valueNode.SelectSingleNode("data"); + Array array = Array.CreateInstance(type.GetElementType(), dataNode.ChildNodes.Count); + + int index = 0; + foreach (XmlNode arrayValueNode in dataNode.ChildNodes) + { + array.SetValue(GetValue(arrayValueNode.FirstChild, type.GetElementType()), index); + index++; + } + return array; + } + else if (type.GetGenericArguments().Length == 1) + { + XmlNode dataNode = valueNode.SelectSingleNode("data"); + IList array = (IList)Activator.CreateInstance(type); + + foreach (XmlNode arrayValueNode in dataNode.ChildNodes) + { + array.Add(GetValue(arrayValueNode.FirstChild, type.GetGenericArguments()[0])); + } + return array; + } + return type.GetDefault(); + } + default: + case "string": + { + return valueNode.InnerText; + } + } + } + + public static HttpRequest CreateRequest(string host, string url, string method, object[] parameters) + { + XmlDocument xml = new XmlDocument(); + + XmlDeclaration xmlDecl = xml.CreateXmlDeclaration("1.0", string.Empty, string.Empty); + xml.AppendChild(xmlDecl); + + XmlElement xmlElement = xml.CreateElement("methodCall"); + xml.AppendChild(xmlElement); + + XmlElement methodNameElement = xml.CreateElement("methodName"); + methodNameElement.InnerText = method; + xmlElement.AppendChild(methodNameElement); + + XmlElement paramsElement = xml.CreateElement("params"); + xmlElement.AppendChild(paramsElement); + + if (parameters != null) + { + foreach (var param in parameters) + { + XmlElement paramElement = xml.CreateElement("param"); + paramsElement.AppendChild(paramElement); + + XmlElement valueElement = xml.CreateElement("value"); + paramElement.AppendChild(valueElement); + + CreateParam(xml, valueElement, param); + } + } + + HttpRequest request = new HttpRequest(); + request.FromXML(xml.OuterXml) + .InitHeaders() + .SetUrl(url) + .SetHost(host) + .AsPost(); + return request; + } + + public static void CreateParam(XmlDocument xml, XmlNode xmlNode, object value) + { + if (value == null) + { + return; + } + if (value is int) + { + XmlElement valueElement = xml.CreateElement("i4"); + valueElement.InnerText = value.ToString(); + xmlNode.AppendChild(valueElement); + } + else if (value is bool) + { + XmlElement valueElement = xml.CreateElement("boolean"); + valueElement.InnerText = (value).ToString(); + xmlNode.AppendChild(valueElement); + } + else if (value is double) + { + XmlElement valueElement = xml.CreateElement("double"); + valueElement.InnerText = ((double)value).ToString(); + xmlNode.AppendChild(valueElement); + } + else if (value is string) + { + XmlElement valueElement = xml.CreateElement("string"); + valueElement.InnerText = value.ToString(); + xmlNode.AppendChild(valueElement); + } + else if (value is DateTime) + { + XmlElement valueElement = xml.CreateElement("dateTime.iso8601"); + valueElement.InnerText = ((DateTime)value).ToString(); + xmlNode.AppendChild(valueElement); + } + else if (value is byte[]) + { + XmlElement valueElement = xml.CreateElement("base64"); + string str = Convert.ToBase64String((byte[])value); + valueElement.InnerText = str; + xmlNode.AppendChild(valueElement); + } + else if (typeof(IList).IsAssignableFrom(value.GetType())) + { + IList array = (IList)value; + XmlElement arrayElement; + + arrayElement = xml.CreateElement("array"); + + xmlNode.AppendChild(arrayElement); + + XmlElement dataElememt = xml.CreateElement("data"); + arrayElement.AppendChild(dataElememt); + + foreach (var item in array) + { + XmlElement valueElement = xml.CreateElement("value"); + dataElememt.AppendChild(valueElement); + CreateParam(xml, valueElement, item); + } + } + else + { + XmlElement valueElement = xml.CreateElement("struct"); + xmlNode.AppendChild(valueElement); + + PropertyInfo[] propertyInfos = value.GetType().GetProperties(); + foreach (var propertyInfo in propertyInfos) + { + XmlElement memberElement = xml.CreateElement("member"); + valueElement.AppendChild(memberElement); + + XmlElement nameElement = xml.CreateElement("name"); + nameElement.InnerText = propertyInfo.Name; + memberElement.AppendChild(nameElement); + + XmlElement oValueElement = xml.CreateElement("value"); + memberElement.AppendChild(oValueElement); + + object oValue = propertyInfo.GetValue(value); + CreateParam(xml, oValueElement, oValue); + } + } + } + + public static void CreatResponse(HttpResponse httpResponse, object value) + { + XmlDocument xml = new XmlDocument(); + + XmlDeclaration xmlDecl = xml.CreateXmlDeclaration("1.0", string.Empty, string.Empty); + xml.AppendChild(xmlDecl); + + XmlElement xmlElement = xml.CreateElement("methodResponse"); + + xml.AppendChild(xmlElement); + + XmlElement paramsElement = xml.CreateElement("params"); + xmlElement.AppendChild(paramsElement); + + XmlElement paramElement = xml.CreateElement("param"); + paramsElement.AppendChild(paramElement); + + XmlElement valueElement = xml.CreateElement("value"); + paramElement.AppendChild(valueElement); + + CreateParam(xml, valueElement, value); + + ByteBlock xmlBlock = new ByteBlock(); + xml.Save(xmlBlock); + + string xmlString = Encoding.UTF8.GetString(xmlBlock.Buffer, 0, xmlBlock.Len); + + httpResponse.FromXML(xmlString); + xmlBlock.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs.meta new file mode 100644 index 0000000..9412d68 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlDataTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8633a76576a23054baa190960ed01685 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs new file mode 100644 index 0000000..0c53566 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading; +using TouchSocket.Http; + +namespace TouchSocket.Rpc.XmlRpc +{ + internal class XmlRpcCallContext : IXmlRpcCallContext + { + private CancellationTokenSource m_tokenSource; + + public object Caller { get; internal set; } + + public MethodInstance MethodInstance { get; internal set; } + + public CancellationTokenSource TokenSource + { + get + { + if (m_tokenSource == null) + { + m_tokenSource = new CancellationTokenSource(); + } + return m_tokenSource; + } + } + + /// + /// + /// + public HttpContext HttpContext { get; internal set; } + + public string XmlString { get; internal set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs.meta new file mode 100644 index 0000000..21bc787 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Common/XmlRpcCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dbbfb563c8c0c3c41a6a342e3d550e5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components.meta new file mode 100644 index 0000000..a77e4ff --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 115bdd8cbe1f36f429f7465f98332016 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs new file mode 100644 index 0000000..f5b275e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs @@ -0,0 +1,183 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using System.Xml; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Rpc.TouchRpc; + +namespace TouchSocket.Rpc.XmlRpc +{ + /// + /// XmlRpc客户端 + /// + public class XmlRpcClient : HttpClientBase, IXmlRpcClient + { + private readonly object m_invokeLocker = new object(); + + /// + /// + /// + public Func TryCanInvoke { get; set; } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + /// + public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + lock (m_invokeLocker) + { + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + using (ByteBlock byteBlock = new ByteBlock(BufferLength)) + { + HttpRequest request = XmlDataTool.CreateRequest(RemoteIPHost.Host, RemoteIPHost.GetUrlPath(), method, parameters); + + HttpResponse response = RequestContent(request, invokeOption.FeedbackType == FeedbackType.OnlySend, invokeOption.Timeout, invokeOption.Token); + if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) + { + return default; + } + + if (response.StatusCode != "200") + { + throw new Exception(response.StatusMessage); + } + else + { + XmlDocument xml = new XmlDocument(); + xml.LoadXml(response.GetBody()); + XmlNode paramNode = xml.SelectSingleNode("methodResponse/params/param"); + if (paramNode != null) + { + return (T)XmlDataTool.GetValue(paramNode.FirstChild.FirstChild, typeof(T)); + } + return default; + } + } + } + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) + { + lock (m_invokeLocker) + { + if (invokeOption == default) + { + invokeOption = InvokeOption.WaitInvoke; + } + + using (ByteBlock byteBlock = new ByteBlock(BufferLength)) + { + HttpRequest request = XmlDataTool.CreateRequest(RemoteIPHost.Host, RemoteIPHost.GetUrlPath(), method, parameters); + var response = RequestContent(request, invokeOption.FeedbackType == FeedbackType.OnlySend, invokeOption.Timeout, invokeOption.Token); + if (invokeOption.FeedbackType != FeedbackType.WaitInvoke) + { + return; + } + if (response.StatusCode != "200") + { + throw new Exception(response.StatusMessage); + } + } + } + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + Invoke(method, invokeOption, ref parameters, null); + } + + /// + /// Rpc调用 + /// + /// 方法名 + /// 调用配置 + /// 参数 + /// + /// + /// + /// + public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) + { + return Invoke(method, invokeOption, ref parameters, null); + } + + /// + /// 函数式调用 + /// + /// 函数名 + /// 参数 + /// Rpc调用设置 + /// + /// + /// + /// + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + Invoke(method, invokeOption, parameters); + }); + } + + /// + /// 函数式调用 + /// + /// 方法名 + /// 参数 + /// Rpc调用设置 + /// 调用超时 + /// 序列化异常 + /// Rpc异常 + /// 其他异常 + /// 服务器返回结果 + public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) + { + return EasyTask.Run(() => + { + return Invoke(method, invokeOption, parameters); + }); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs.meta new file mode 100644 index 0000000..4affa5d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Components/XmlRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e65cf017dc6bcdd4d99d3e1f3e34e495 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config.meta new file mode 100644 index 0000000..cdc116c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a647201a6f6183b43b1d95829e6ce2f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs new file mode 100644 index 0000000..617b39a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; +using TouchSocket.Rpc.XmlRpc; + +namespace TouchSocket.Sockets +{ + /// + /// XmlRpcConfigExtensions + /// + public static class XmlRpcConfigExtensions + { + /// + /// 构建XmlRpcClient类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithXmlRpcClient(this TouchSocketConfig config) where TClient : IXmlRpcClient + { + TClient client = config.Container.Resolve(); + client.Setup(config); + client.Connect(); + return client; + } + + /// + /// 构建XmlRpcClient类客户端,并连接 + /// + /// + /// + public static XmlRpcClient BuildWithXmlRpcClient(this TouchSocketConfig config) + { + return BuildWithXmlRpcClient(config); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs.meta new file mode 100644 index 0000000..dc23f52 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Config/XmlRpcConfigExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ff65427d6e3c5d47bede3fb1631e67d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions.meta new file mode 100644 index 0000000..59343d2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1712d4ee2dee03c4ea4c81e11f3045b8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs new file mode 100644 index 0000000..2db2803 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs @@ -0,0 +1,32 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Rpc.XmlRpc; + +namespace TouchSocket.Core +{ + /// + /// XmlRpcPluginsManagerExtension + /// + public static class XmlRpcPluginsManagerExtension + { + /// + /// 使用XmlRpc的插件。仅服务器可用。 + /// + /// + /// + public static XmlRpcParserPlugin UseXmlRpc(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs.meta new file mode 100644 index 0000000..31bf02d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Extensions/XmlRpcPluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c62cadd4c24dd04693700a9b1ec1782 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface.meta new file mode 100644 index 0000000..632bd95 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 54bd78bf6f0fd284bbc272edd086752d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs new file mode 100644 index 0000000..957ef42 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Rpc.WebApi; + +namespace TouchSocket.Rpc.XmlRpc +{ + /// + /// IXmlRpcCallContext + /// + public interface IXmlRpcCallContext : IHttpCallContext + { + /// + /// XmlRpc的调用字符串。 + /// + string XmlString { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs.meta new file mode 100644 index 0000000..efd3118 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcCallContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c5c6b205ef828645a751e68d5aa764e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs new file mode 100644 index 0000000..50e9e6b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Http; + +namespace TouchSocket.Rpc.XmlRpc +{ + /// + /// IWebApiClient + /// + public interface IXmlRpcClient : IRpcClient, IHttpClient + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs.meta new file mode 100644 index 0000000..37771d9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Interface/IXmlRpcClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 51eb0c64bc8693f428bbcad199dc530a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins.meta new file mode 100644 index 0000000..da32994 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5ca9df22a3c052e40867f400b4ad3c50 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs new file mode 100644 index 0000000..f09ca59 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs @@ -0,0 +1,217 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Sockets; +using System.Xml; +using TouchSocket.Core; +using TouchSocket.Http; +using TouchSocket.Sockets; + +namespace TouchSocket.Rpc.XmlRpc +{ + /// + /// XmlRpc解析器 + /// + public class XmlRpcParserPlugin : HttpPluginBase, IRpcParser + { + private readonly ActionMap m_actionMap; + private RpcStore m_rpcStore; + private string m_xmlRpcUrl = "/xmlrpc"; + + /// + /// 构造函数 + /// + public XmlRpcParserPlugin([DependencyParamterInject(true)] RpcStore rpcStore) + { + m_actionMap = new ActionMap(); + rpcStore?.AddRpcParser(GetType().Name, this); + } + + /// + /// XmlRpc调用 + /// + public ActionMap ActionMap => m_actionMap; + + /// + /// 所属服务器 + /// + public RpcStore RpcStore => m_rpcStore; + + /// + /// 当挂载在时,匹配Url然后响应。当设置为null或空时,会全部响应。 + /// + public string XmlRpcUrl + { + get => m_xmlRpcUrl; + set => m_xmlRpcUrl = string.IsNullOrEmpty(value) ? "/" : value; + } + + #region RPC解析器 + + void IRpcParser.OnRegisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is XmlRpcAttribute attribute) + { + m_actionMap.Add(attribute.GetInvokenKey(methodInstance), methodInstance); + } + } + } + + void IRpcParser.OnUnregisterServer(MethodInstance[] methodInstances) + { + foreach (var methodInstance in methodInstances) + { + if (methodInstance.GetAttribute() is XmlRpcAttribute attribute) + { + m_actionMap.Remove(attribute.GetInvokenKey(methodInstance)); + } + } + } + + void IRpcParser.SetRpcStore(RpcStore rpcService) + { + m_rpcStore = rpcService; + } + + #endregion RPC解析器 + + /// + /// 当挂载在时,匹配Url然后响应。当设置为null或空时,会全部响应。 + /// + /// + /// + public XmlRpcParserPlugin SetXmlRpcUrl(string xmlRpcUrl) + { + XmlRpcUrl = xmlRpcUrl; + return this; + } + + /// + /// + /// + /// + /// + protected override void OnPost(ITcpClientBase client, HttpContextEventArgs e) + { + if (m_xmlRpcUrl == "/" || e.Context.Request.UrlEquals(m_xmlRpcUrl)) + { + e.Handled = true; + + XmlDocument xml = new XmlDocument(); + string xmlstring = e.Context.Request.GetBody(); + xml.LoadXml(xmlstring); + XmlNode methodName = xml.SelectSingleNode("methodCall/methodName"); + string actionKey = methodName.InnerText; + + object[] ps = null; + InvokeResult invokeResult = new InvokeResult(); + XmlRpcCallContext callContext = null; + + if (m_actionMap.TryGetMethodInstance(actionKey, out MethodInstance methodInstance)) + { + if (methodInstance.IsEnable) + { + try + { + callContext = new XmlRpcCallContext() + { + Caller = client, + HttpContext = e.Context, + MethodInstance = methodInstance, + XmlString = xmlstring + }; + ps = new object[methodInstance.ParameterNames.Length]; + XmlNode paramsNode = xml.SelectSingleNode("methodCall/params"); + if (methodInstance.MethodFlags.HasFlag(MethodFlags.IncludeCallContext)) + { + ps[0] = callContext; + int index = 1; + foreach (XmlNode paramNode in paramsNode.ChildNodes) + { + XmlNode valueNode = paramNode.FirstChild.FirstChild; + ps[index] = (XmlDataTool.GetValue(valueNode, methodInstance.ParameterTypes[index])); + index++; + } + } + else + { + int index = 0; + foreach (XmlNode paramNode in paramsNode.ChildNodes) + { + XmlNode valueNode = paramNode.FirstChild.FirstChild; + ps[index] = (XmlDataTool.GetValue(valueNode, methodInstance.ParameterTypes[index])); + index++; + } + } + } + catch (Exception ex) + { + invokeResult.Status = InvokeStatus.Exception; + invokeResult.Message = ex.Message; + } + } + else + { + invokeResult.Status = InvokeStatus.UnEnable; + invokeResult.Message = "服务不可用"; + } + } + else + { + invokeResult.Status = InvokeStatus.UnFound; + invokeResult.Message = "没有找到这个服务。"; + } + + if (invokeResult.Status == InvokeStatus.Ready) + { + IRpcServer rpcServer = methodInstance.ServerFactory.Create(callContext, ps); + if (rpcServer is ITransientRpcServer transientRpcServer) + { + transientRpcServer.CallContext = callContext; + } + invokeResult = m_rpcStore.Execute(rpcServer, ps, callContext); + } + + HttpResponse httpResponse = e.Context.Response; + + ByteBlock byteBlock = new ByteBlock(); + + if (invokeResult.Status == InvokeStatus.Success) + { + XmlDataTool.CreatResponse(httpResponse, invokeResult.Result); + } + else + { + httpResponse.StatusCode = "201"; + httpResponse.StatusMessage = invokeResult.Message; + } + try + { + httpResponse.Answer(); + } + finally + { + byteBlock.Dispose(); + } + + if (!e.Context.Request.KeepAlive) + { + client.TryShutdown(SocketShutdown.Both); + } + } + base.OnPost(client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs.meta new file mode 100644 index 0000000..128a9de --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Rpc/XmlRpc/Plugins/XmlRpcParserPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa1bd8324979ff240a6ad9b7ea148bcd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets.meta new file mode 100644 index 0000000..c043588 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e2706eaf3ebf5044a3e78ef2b48593b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs new file mode 100644 index 0000000..e47fcd3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs @@ -0,0 +1,58 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 通讯基类 + /// + public abstract class BaseSocket : DependencyObject, ISocket + { + /// + /// 通讯基类 + /// + public BaseSocket() + { + SyncRoot = new object(); + } + + private int m_bufferLength; + + /// + /// 数据交互缓存池限制,min=1024 byte + /// + public virtual int BufferLength + { + get => m_bufferLength; + set + { + if (value < 1024) + { + value = 1024; + } + m_bufferLength = value; + } + } + + /// + /// 同步根。 + /// + protected object SyncRoot; + + /// + /// 日志记录器 + /// + public ILog Logger { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs.meta new file mode 100644 index 0000000..ed63f17 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/BaseSocket.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 83d64550728a9a74091f539940c8a295 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common.meta new file mode 100644 index 0000000..b8ff696 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e069f67caa6fbc64797abd669b7d8301 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs new file mode 100644 index 0000000..ec9989d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs @@ -0,0 +1,204 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Sockets; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 延迟发送器 + /// + public sealed class DelaySender : DisposableObject + { + private readonly ReaderWriterLockSlim m_lockSlim; + private readonly Action m_onError; + private readonly IntelligentDataQueue m_queueDatas; + private readonly Socket m_socket; + private readonly Timer m_timer; + private volatile bool m_sending; + + /// + /// 延迟发送器 + /// + /// + /// + /// + public DelaySender(Socket socket, int queueLength, Action onError) + { + m_socket = socket; + m_onError = onError; + m_queueDatas = new IntelligentDataQueue(queueLength); + m_lockSlim = new ReaderWriterLockSlim(); + m_timer = new Timer(TimerRun, null, 10, 10); + } + + /// + /// 延迟包最大尺寸,默认1024*512字节。 + /// + public int DelayLength { get; set; } = 1024 * 512; + + /// + /// 是否处于发送状态 + /// + public bool Sending + { + get + { + using (new ReadLock(m_lockSlim)) + { + return m_sending; + } + } + + private set + { + using (new WriteLock(m_lockSlim)) + { + m_sending = value; + } + } + } + + /// + /// 发送 + /// + public void Send(QueueDataBytes dataBytes) + { + m_queueDatas.Enqueue(dataBytes); + if (SwitchToRun()) + { + ThreadPool.QueueUserWorkItem(BeginSend); + } + } + + /// + /// 释放 + /// + /// + protected override void Dispose(bool disposing) + { + m_timer.SafeDispose(); + m_queueDatas.Clear(); + base.Dispose(disposing); + } + + private void BeginSend(object o) + { + try + { + byte[] buffer = BytePool.Default.GetByteCore(DelayLength); + while (!DisposedValue) + { + try + { + if (TryGet(buffer, out QueueDataBytes asyncByte)) + { + m_socket.AbsoluteSend(asyncByte.Buffer, asyncByte.Offset, asyncByte.Length); + } + else + { + break; + } + } + catch (Exception ex) + { + m_onError?.Invoke(ex); + break; + } + } + BytePool.Default.Recycle(buffer); + Sending = false; + } + catch + { + } + } + + private bool SwitchToRun() + { + using (new WriteLock(m_lockSlim)) + { + if (m_sending) + { + return false; + } + else + { + m_sending = true; + return true; + } + } + } + + private void TimerRun(object state) + { + if (SwitchToRun()) + { + BeginSend(null); + } + } + + private bool TryGet(byte[] buffer, out QueueDataBytes asyncByteDe) + { + int len = 0; + int surLen = buffer.Length; + while (true) + { + if (m_queueDatas.TryPeek(out QueueDataBytes asyncB)) + { + if (surLen > asyncB.Length) + { + if (m_queueDatas.TryDequeue(out QueueDataBytes asyncByte)) + { + Array.Copy(asyncByte.Buffer, asyncByte.Offset, buffer, len, asyncByte.Length); + len += asyncByte.Length; + surLen -= asyncByte.Length; + } + } + else if (asyncB.Length > buffer.Length) + { + if (len > 0) + { + break; + } + else + { + asyncByteDe = asyncB; + return true; + } + } + else + { + break; + } + } + else + { + if (len > 0) + { + break; + } + else + { + asyncByteDe = default; + return false; + } + } + } + asyncByteDe = new QueueDataBytes(buffer, 0, len); + return true; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs.meta new file mode 100644 index 0000000..5bdfd36 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/DelaySender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1da8f640da410ca49831fe82e593a2cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs new file mode 100644 index 0000000..57d6793 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs @@ -0,0 +1,214 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; + +namespace TouchSocket.Sockets +{ + /// + /// IP解析映射 + /// + /// 支持端口,ip,域名等。具体格式如下: + /// + /// 端口:直接按入参,该操作一般在监听时使用。 + /// ip:按127.0.0.1:7789入参。 + /// 域名:按tcp://127.0.0.1:7789、或者http://baidu.com入参。 + /// + /// + /// + public class IPHost + { + /// + /// IP解析映射 + /// + /// 支持端口,ip,域名等。具体格式如下: + /// + /// 端口:直接按入参,该操作一般在监听时使用。 + /// ip:按127.0.0.1:7789入参。 + /// 域名:按tcp://127.0.0.1:7789、或者http://baidu.com入参。 + /// + /// + /// + /// + public IPHost(string host) + { + if (TouchSocketUtility.IsURL(host)) + { + IsUri = true; + Uri = new Uri(host); + if (Uri.Port > 0) + { + Host = $"{Uri.Host}:{Uri.Port}"; + } + else + { + Host = Uri.Host; + } + if (TouchSocketUtility.IsIPv4(Uri.Host) || TouchSocketUtility.IsIPV6(Uri.Host)) + { + Analysis(Uri.Host, Uri.Port.ToString()); + } + else + { + if (HostNameToIP(Uri.Host, out IPAddress[] addresses)) + { + Analysis(addresses[0].ToString(), Uri.Port.ToString()); + } + } + } + else + { + Host = host; + int r = host.LastIndexOf(":"); + string ip = host.Substring(0, r); + Analysis(ip, host.Substring(r + 1, host.Length - (r + 1))); + } + } + + /// + /// 从IPAddress和端口号 + /// + /// + /// + public IPHost(IPAddress iPAddress, int port) : this($"{iPAddress}:{port}") + { + } + + /// + /// 从端口号创建。 + /// + /// + public IPHost(int port) : this($"0.0.0.0:{port}") + { + } + + /// + /// 寻址方案 + /// + public AddressFamily AddressFamily { get; private set; } + + /// + /// 终结点 + /// + public IPEndPoint EndPoint { get; private set; } + + /// + /// 具有端口信息的host + /// + public string Host { get; private set; } + + /// + /// IP + /// + public string IP { get; private set; } + + /// + /// 是否为Uri + /// + public bool IsUri { get; private set; } + + /// + /// 端口号 + /// + public int Port { get; private set; } + + /// + /// 统一资源标识 + /// + public Uri Uri { get; private set; } + + /// + /// 解析一个组的地址。 + /// + /// + /// + public static IPHost[] ParseIPHosts(string[] strs) + { + List iPs = new List(); + foreach (var item in strs) + { + iPs.Add(new IPHost(item)); + } + return iPs.ToArray(); + } + + /// + /// 获取Url全路径 + /// + /// + public string GetUrlPath() + { + if (IsUri) + { + return Uri.PathAndQuery; + } + return default; + } + + /// + /// 返回EndPoint字符串 + /// + /// + public override string ToString() + { + return EndPoint == null ? null : EndPoint.ToString(); + } + + private static bool HostNameToIP(string hostname, out IPAddress[] address) + { + try + { + IPHostEntry hostInfo = Dns.GetHostEntry(hostname); + address = hostInfo.AddressList; + if (address.Length > 0) + { + return true; + } + + return false; + } + catch + { + address = null; + return false; + } + } + + private void Analysis(string ip, string port) + { + try + { + int portNum = int.Parse(port); + IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), portNum); + if (ip.Contains(":")) + { + AddressFamily = AddressFamily.InterNetworkV6; + } + else + { + AddressFamily = AddressFamily.InterNetwork; + } + EndPoint = endPoint; + IP = ip; + Port = portNum; + } + catch (Exception ex) + { + throw new Exception($"IPHost初始化失败,信息:{ex.Message}", ex); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs.meta new file mode 100644 index 0000000..2a3c930 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/IPHost.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7dc6e0d46cb54514793cb2ad4f2cc7b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs new file mode 100644 index 0000000..98bfb6d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Runtime.InteropServices; + +namespace TouchSocket.Sockets +{ + /// + /// 保活机制 + /// + public class KeepAliveValue + { + /// + /// 保活机制 + /// + public byte[] KeepAliveTime + { + get + { + uint dummy = 0; + byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3]; + BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0); + BitConverter.GetBytes(Interval).CopyTo(inOptionValues, Marshal.SizeOf(dummy)); + BitConverter.GetBytes(AckInterval).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2); + return inOptionValues; + } + } + + /// + /// 是否启用保活。默认为True。 + /// + public bool Enable { get; set; } = true; + + /// + /// 发送间隔,默认20*1000ms + /// + public uint Interval { get; set; } = 20 * 1000; + + /// + /// 确认间隔,默认2*1000ms + /// + public uint AckInterval { get; set; } = 2 * 1000; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs.meta new file mode 100644 index 0000000..f3f1428 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/KeepAliveValue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d2eb85661e08e374a8b9d05996f28fcd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs new file mode 100644 index 0000000..71424da --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Sockets; + +namespace TouchSocket.Sockets +{ + /// + /// 网络监听器 + /// + public class NetworkMonitor + { + /// + /// 构造函数 + /// + /// + /// + public NetworkMonitor(IPHost iPHost, Socket socket) + { + this.iPHost = iPHost; + this.socket = socket ?? throw new ArgumentNullException(nameof(socket)); + } + + private readonly IPHost iPHost; + + /// + /// 监听地址组 + /// + public IPHost IPHost => iPHost; + + private readonly Socket socket; + + /// + /// Socket组件 + /// + public Socket Socket => socket; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs.meta new file mode 100644 index 0000000..2e5d257 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/NetworkMonitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4550e40a442a38044b3477ae7187eb80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options.meta new file mode 100644 index 0000000..f302549 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d71e13ce09fdcfe47ac02314de3d4a3f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs new file mode 100644 index 0000000..600b758 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs @@ -0,0 +1,49 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Security.Cryptography.X509Certificates; + +namespace TouchSocket.Sockets +{ + /// + /// 客户端Ssl验证 + /// + public class ClientSslOption : SslOption + { + /// + /// 构造函数 + /// + public ClientSslOption() + { + X509Store store = new X509Store(StoreName.Root); + store.Open(OpenFlags.ReadWrite); + ClientCertificates = store.Certificates; + store.Close(); + } + + private string targetHost; + + /// + /// 目标Host + /// + public string TargetHost + { + get => targetHost; + set => targetHost = value; + } + + /// + /// 验证组合 + /// + public X509CertificateCollection ClientCertificates { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs.meta new file mode 100644 index 0000000..e5ae31b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ClientSslOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ded7ee0a1378ebd40b58fd1752547439 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs new file mode 100644 index 0000000..e266b16 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Sockets +{ + /// + /// DelaySenderOption + /// + public class DelaySenderOption + { + /// + /// 延迟队列最大尺寸,默认1024*1024*10字节。 + /// + public int QueueLength { get; set; } = 1024 * 1024 * 10; + + /// + /// 延迟包最大尺寸,默认1024*512字节。 + /// + public int DelayLength { get; set; } = 1024 * 512; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs.meta new file mode 100644 index 0000000..6a87190 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/DelaySenderOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 329336b80bcf0834fa72b67979b99495 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs new file mode 100644 index 0000000..3e75ddb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Security.Cryptography.X509Certificates; + +namespace TouchSocket.Sockets +{ + /// + /// 服务器Ssl设置 + /// + public class ServiceSslOption : SslOption + { + private X509Certificate certificate; + + /// + /// 证书 + /// + public X509Certificate Certificate + { + get => certificate; + set => certificate = value; + } + + private bool clientCertificateRequired; + + /// + /// 该值指定是否向客户端请求证书用于进行身份验证。 请注意,这只是一个请求 - 如果没有提供任何证书,服务器仍然可接受连接请求 + /// + public bool ClientCertificateRequired + { + get => clientCertificateRequired; + set => clientCertificateRequired = value; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs.meta new file mode 100644 index 0000000..ed21d7f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/ServiceSslOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d82cef0b078e1d640918629be2eaa24c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs new file mode 100644 index 0000000..cfed151 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Security; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; + +namespace TouchSocket.Sockets +{ + /// + /// Ssl配置 + /// + public abstract class SslOption + { + /// + /// Ssl配置 + /// + public SslOption() + { + CertificateValidationCallback = this.OnCertificateValidationCallback; + } + + private bool OnCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + return true; + } + + /// + /// 协议版本 + /// + public SslProtocols SslProtocols { get; set; } = SslProtocols.Tls12 | SslProtocols.Ssl2 | SslProtocols.Ssl3 | SslProtocols.Default | + SslProtocols.Tls | SslProtocols.Tls11; + + /// + /// 该值指定身份验证期间是否检查证书吊销列表 + /// + public bool CheckCertificateRevocation { get; set; } = false; + + /// + /// SSL验证回调。 + /// + public RemoteCertificateValidationCallback CertificateValidationCallback { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs.meta new file mode 100644 index 0000000..b74bafd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Options/SslOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 41649bf53ac44464789eb617dd8a0971 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs new file mode 100644 index 0000000..09e1739 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs @@ -0,0 +1,132 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; + +namespace TouchSocket.Sockets +{ + /// + /// 协议类 + /// + public struct Protocol + { + /// + /// 值 + /// + private readonly string value; + + /// + /// 表示无协议 + /// + public static readonly Protocol None = new Protocol(); + + /// + /// 获取http协议 + /// + public static readonly Protocol Http = new Protocol("http"); + + /// + /// TCP协议 + /// + public static readonly Protocol TCP = new Protocol("tcp"); + + /// + /// UDP协议 + /// + public static readonly Protocol UDP = new Protocol("udp"); + + /// + /// 获取WebSocket协议 + /// + public static readonly Protocol WebSocket = new Protocol("ws"); + + /// + /// 表示 + /// + /// 值 + public Protocol(string value) + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentNullException(); + } + this.value = value; + } + + /// + /// 转换为字符串 + /// + /// + public override string ToString() + { + if (string.IsNullOrEmpty(value)) + { + return "None"; + } + return value; + } + + /// + /// 获取哈希码 + /// + /// + public override int GetHashCode() + { + if (value == null) + { + return string.Empty.GetHashCode(); + } + return value.ToLower().GetHashCode(); + } + + /// + /// 比较是否和目标相等 + /// + /// 目标 + /// + public override bool Equals(object obj) + { + if (obj is Protocol) + { + return GetHashCode() == obj.GetHashCode(); + } + return false; + } + + /// + /// 等于 + /// + /// + /// + /// + public static bool operator ==(Protocol a, Protocol b) + { + if (string.IsNullOrEmpty(a.value) && string.IsNullOrEmpty(b.value)) + { + return true; + } + return string.Equals(a.value, b.value, StringComparison.OrdinalIgnoreCase); + } + + /// + /// 不等于 + /// + /// + /// + /// + public static bool operator !=(Protocol a, Protocol b) + { + var state = a == b; + return !state; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs.meta new file mode 100644 index 0000000..ce4c310 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/Protocol.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fbd805bb60836994db39cb903d11e58b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs new file mode 100644 index 0000000..e16d942 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs @@ -0,0 +1,156 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; + +namespace TouchSocket.Sockets +{ + /// + /// 客户端集合 + /// + [DebuggerDisplay("Count={Count}")] + public sealed class SocketClientCollection + { + private readonly ConcurrentDictionary m_tokenDic = new ConcurrentDictionary(); + + /// + /// 数量 + /// + public int Count => m_tokenDic.Count; + + /// + /// 获取SocketClient + /// + /// + /// + public ISocketClient this[string id] + { + get + { + TryGetSocketClient(id, out ISocketClient t); + return t; + } + } + + /// + /// 获取所有的客户端 + /// + /// + public IEnumerable GetClients() + { + return m_tokenDic.Values; + } + + /// + /// 获取ID集合 + /// + /// + public IEnumerable GetIDs() + { + return m_tokenDic.Keys; + } + + /// + /// 根据ID判断SocketClient是否存在 + /// + /// + /// + public bool SocketClientExist(string id) + { + if (string.IsNullOrEmpty(id)) + { + return false; + } + + if (m_tokenDic.ContainsKey(id)) + { + return true; + } + return false; + } + + /// + /// 尝试获取实例 + /// + /// + /// + /// + public bool TryGetSocketClient(string id, out ISocketClient socketClient) + { + if (string.IsNullOrEmpty(id)) + { + socketClient = null; + return false; + } + + return m_tokenDic.TryGetValue(id, out socketClient); + } + + /// + /// 尝试获取实例 + /// + /// + /// + /// + /// + public bool TryGetSocketClient(string id, out TClient socketClient) where TClient : ISocketClient + { + if (string.IsNullOrEmpty(id)) + { + socketClient = default; + return false; + } + + if (m_tokenDic.TryGetValue(id, out ISocketClient client)) + { + socketClient = (TClient)client; + return true; + } + socketClient = default; + return false; + } + + internal bool TryAdd(ISocketClient socketClient) + { + return m_tokenDic.TryAdd(socketClient.ID, socketClient); + } + + internal bool TryRemove(string id, out ISocketClient socketClient) + { + if (string.IsNullOrEmpty(id)) + { + socketClient = null; + return false; + } + return m_tokenDic.TryRemove(id, out socketClient); + } + + internal bool TryRemove(string id, out TClient socketClient) where TClient : ISocketClient + { + if (string.IsNullOrEmpty(id)) + { + socketClient = default; + return false; + } + + if (m_tokenDic.TryRemove(id, out ISocketClient client)) + { + socketClient = (TClient)client; + return true; + } + socketClient = default; + return false; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs.meta new file mode 100644 index 0000000..d37d185 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/SocketCliectCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5bcaec31497d8c54ba5361d32d6bf349 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs new file mode 100644 index 0000000..63e581a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Text.RegularExpressions; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// TouchSocketUtility + /// + public class TouchSocketUtility + { + /// + /// 判断输入的字符串是否是一个超链接 + /// + /// + /// + public static bool IsURL(string input) + { + string pattern = @"^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$?"; + Regex regex = new Regex(pattern); + return regex.IsMatch(input); + } + + /// + /// 判断输入的字符串是否是表示一个IP地址 + /// + /// 被比较的字符串 + /// 是IP地址则为True + public static bool IsIPv4(string input) + { + try + { + string[] IPs = input.Split('.'); + Regex regex = new Regex(@"^\d+$"); + for (int i = 0; i < IPs.Length; i++) + { + if (!regex.IsMatch(IPs[i])) + { + return false; + } + if (Convert.ToUInt16(IPs[i]) > 255) + { + return false; + } + } + return true; + } + catch + { + return false; + } + } + + /// + /// 判断输入的字符串是否是合法的IPV6 地址 + /// + /// + /// + public static bool IsIPV6(string input) + { + string pattern = ""; + string temp = input; + string[] strs = temp.Split(':'); + if (strs.Length > 8) + { + return false; + } + int count = StringExtension.HitStringCount(input, "::"); + if (count > 1) + { + return false; + } + else if (count == 0) + { + pattern = @"^([\da-f]{1,4}:){7}[\da-f]{1,4}$"; + + Regex regex = new Regex(pattern); + return regex.IsMatch(input); + } + else + { + pattern = @"^([\da-f]{1,4}:){0,5}::([\da-f]{1,4}:){0,5}[\da-f]{1,4}$"; + Regex regex1 = new Regex(pattern); + return regex1.IsMatch(input); + } + } + + /// + /// 大数据边界 + /// + public const int BigDataBoundary = 1024 * 64; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs.meta new file mode 100644 index 0000000..957db3f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Common/TouchSocketUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eec440befdeae4e4391de7000c370b3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components.meta new file mode 100644 index 0000000..f042966 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd413a54f7dc6fa42aba2447486f4bc3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory.meta new file mode 100644 index 0000000..f6f1eeb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e5f187683bdb9b46970cf58c3efc9a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs new file mode 100644 index 0000000..68b5ef5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs @@ -0,0 +1,182 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// Client工厂 + /// + public abstract class ClientFactory : DisposableObject where TClient : IClient + { + /// + /// Client工厂 + /// + public ClientFactory() + { + this.MainConfig = new TouchSocketConfig(); + } + + /// + /// 已创建的客户端安全列表,一般不要直接操作。 + /// + public ConcurrentList CreatedClients { get; } = new ConcurrentList(); + + /// + /// 空闲客户端的安全队列,一般不要直接操作。 + /// + public ConcurrentQueue FreeClients { get; } = new ConcurrentQueue(); + + /// + /// 主通信客户端。 + /// + public abstract TClient MainClient { get; } + + /// + /// 主客户端配置 + /// + /// + public virtual TouchSocketConfig MainConfig { get; } + + /// + /// 最大客户端数量。默认10。 + /// + public int MaxCount { get; set; } = 10; + + /// + /// 池中维护的最小客户端数量。默认0。 + /// + public int MinCount { get; set; } + + /// + /// 检验主通信状态。最好在每次操作时都调用。 + /// + /// 如果状态异常,是否进行再次初始化 + /// + public abstract Result CheckStatus(bool tryInit = true); + + /// + /// 检验主通信状态。最好在每次操作时都调用。 + /// + /// 如果状态异常,是否进行再次初始化 + /// + public virtual Task CheckStatusAsync(bool tryInit = true) + { + return Task.Run(() => + { + return this.CheckStatus(tryInit); + }); + } + + /// + /// 清理池中的所有客户端。 + /// + /// + public virtual Task ClearAsync() + { + return Task.Run(() => + { + return this.Clear(); + }); + } + /// + /// 清理池中的所有客户端。 + /// + /// + public virtual int Clear() + { + int count = 0; + foreach (var item in this.CreatedClients) + { + count++; + DisposeClient(item); + } + FreeClients.Clear(); + return count; + } + + /// + /// 释放客户端最后的调用。 + /// + /// + public abstract void DisposeClient(TClient client); + + /// + /// 释放客户端最后的调用。 + /// + /// + /// + public virtual Task DisposeClientAsync(TClient client) + { + return Task.Run(() => + { + this.DisposeClient(client); + }); + } + + /// + /// 获取空闲可用的客户端数量。 + /// + public abstract int GetAvailableCount(); + + /// + /// 获取用于传输的客户端。在此处返回的结果,必须完成基本初始化,例如连接等。 + /// + /// + /// + public abstract TClient GetTransferClient(TimeSpan waitTime); + + /// + /// 判断客户端是不是存活状态。 + /// + /// + /// + public abstract bool IsAlive(TClient client); + + /// + /// 释放使用完成的客户端 + /// + /// + public abstract void ReleaseTransferClient(TClient client); + + /// + /// 释放使用完成的客户端 + /// + /// + /// + public virtual Task ReleaseTransferClientAsync(TClient client) + { + return Task.Run(() => + { + this.ReleaseTransferClient(client); + }); + } + + /// + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + DisposeClient(MainClient); + this.Clear(); + } + + /// + /// 获取用于传输的客户端配置 + /// + /// + protected abstract TouchSocketConfig GetTransferConfig(); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs.meta new file mode 100644 index 0000000..ffde6cc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/ClientFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ef319485d2dba5468a199c0898ecf77 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs new file mode 100644 index 0000000..1158c46 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs @@ -0,0 +1,273 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 适用于Tcp客户端的连接工厂。 + /// + /// + public class TcpClientFactory : ClientFactory where TClient : ITcpClient, new() + { + private readonly TClient m_mainClient = new TClient(); + + private readonly SingleTimer m_singleTimer; + + private bool first = true; + + /// + /// 适用于Tcp客户端的连接工厂。 + /// + public TcpClientFactory() + { + m_singleTimer = new SingleTimer(1000, () => + { + List list = new List(); + foreach (var item in this.CreatedClients) + { + if (!this.IsAlive(item)) + { + list.Add(item); + } + } + + foreach (var item in list) + { + this.DisposeClient(item); + } + + if (IsAlive(this.MainClient)) + { + if (this.CreatedClients.Count < this.MinCount) + { + try + { + this.CreateTransferClient(); + } + catch + { + } + } + } + }); + } + + /// + /// 连接超时设定 + /// + public TimeSpan ConnectTimeout { get; set; } = TimeSpan.FromSeconds(5); + + /// + public override TClient MainClient { get => m_mainClient; } + + /// + /// 获取传输的客户端配置 + /// + public Func OnGetTransferConfig { get; set; } + + /// + public override Result CheckStatus(bool tryInit = true) + { + lock (this.m_singleTimer) + { + try + { + if (!IsAlive(m_mainClient)) + { + if (!tryInit) + { + return Result.UnknownFail; + } + if (first) + { + OnMainClientSetuping(); + MainClient.Setup(this.MainConfig); + first = false; + } + MainClient.Close(); + MainClient.Connect((int)this.ConnectTimeout.TotalMilliseconds); + } + return Result.Success; + } + catch (Exception ex) + { + return new Result(ex); + } + } + } + + /// + /// 在主客户端加载配置之前 + /// + protected virtual void OnMainClientSetuping() + { + + } + + /// + public override void DisposeClient(TClient client) + { + client.TryShutdown(); + client.SafeDispose(); + this.CreatedClients.Remove(client); + } + + /// + /// 获取可以使用的客户端数量。 + /// + /// 注意:该值不一定是的长度,当已创建数量小于设定的最大值时,也会累加未创建的值。 + /// + /// + /// + public override int GetAvailableCount() + { + return Math.Max(0, this.MaxCount - this.CreatedClients.Count) + this.FreeClients.Count; + } + + /// + /// 获取一个空闲的连接对象,如果等待超出设定的时间,则会创建新的连接。 + /// + /// 指定毫秒数 + /// + /// + /// + public TClient GetTransferClient(int waitTime) + { + return this.GetTransferClient(TimeSpan.FromMilliseconds(waitTime)); + } + + /// + /// 获取一个空闲的连接对象,如果等待超出1秒的时间,则会创建新的连接。 + /// + /// + /// + /// + public TClient GetTransferClient() + { + return this.GetTransferClient(TimeSpan.FromSeconds(1)); + } + + /// + /// 获取一个空闲的连接对象,如果等待超出设定的时间,则会创建新的连接。 + /// + /// + /// + /// + /// + public override TClient GetTransferClient(TimeSpan waitTime) + { + while (FreeClients.TryDequeue(out var client)) + { + if (IsAlive(client)) + { + return client; + } + else + { + DisposeClient(client); + } + } + + if (this.CreatedClients.Count > MaxCount) + { + if (SpinWait.SpinUntil(Wait, waitTime)) + { + return GetTransferClient(waitTime); + } + } + + var clientRes = CreateTransferClient(); + return clientRes; + } + + /// + public override bool IsAlive(TClient client) + { + return client.Online; + } + + /// + /// 归还使用完的连接。 + /// + /// 首先内部会判定存活状态,如果不再活动状态,会直接调用。 + /// 其次会计算是否可以进入缓存队列,如果队列数量超出,也会直接调用 + /// + /// + /// + public override void ReleaseTransferClient(TClient client) + { + if ((object)client == (object)MainClient) + { + return; + } + if (!IsAlive(client)) + { + DisposeClient(client); + return; + } + if (FreeClients.Count < MaxCount) + { + FreeClients.Enqueue(client); + } + else + { + DisposeClient(client); + } + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + this.m_singleTimer.SafeDispose(); + base.Dispose(disposing); + } + + /// + protected override TouchSocketConfig GetTransferConfig() + { + return OnGetTransferConfig?.Invoke(); + } + + private TClient CreateTransferClient() + { + TClient client = new TClient(); + client.Setup(this.GetTransferConfig()); + client.Connect((int)ConnectTimeout.TotalMilliseconds); + this.CreatedClients.Add(client); + return client; + } + + private bool Wait() + { + if (FreeClients.Count > 0) + { + return true; + } + return false; + } + } + + /// + /// 适用于基于的连接工厂。 + /// + public class TcpClientFactory : TcpClientFactory + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs.meta new file mode 100644 index 0000000..9cf4f4b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/Factory/TcpClientFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f6d210b1ca8ad74f8d7b281e9442dfc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT.meta new file mode 100644 index 0000000..fa7483d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a737a23ee3440ed4c9fd2002d9eedce3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs new file mode 100644 index 0000000..96606ca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs @@ -0,0 +1,84 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// TCP端口转发服务器 + /// + public class NATService : TcpService + { + /// + /// + /// + /// + protected override NATSocketClient GetClientInstence() + { + var client = base.GetClientInstence(); + client.m_internalDis = OnTargetClientDisconnected; + client.m_internalTargetClientRev = OnTargetClientReceived; + return client; + } + + /// + /// 在NAT服务器收到数据时。 + /// + /// + /// + /// + /// 需要转发的数据。 + protected virtual byte[] OnNATReceived(NATSocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo) + { + return byteBlock?.ToArray(); + } + + /// + /// + /// + /// + /// + /// + protected override sealed void OnReceived(NATSocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo) + { + var data = OnNATReceived(socketClient, byteBlock, requestInfo); + if (data != null) + { + socketClient.SendToTargetClient(data, 0, data.Length); + } + } + + /// + /// 当目标客户端断开。 + /// + /// + /// + /// + protected virtual void OnTargetClientDisconnected(NATSocketClient socketClient, ITcpClient tcpClient, DisconnectEventArgs e) + { + } + + /// + /// 在目标客户端收到数据时。 + /// + /// + /// + /// + /// + /// + protected virtual byte[] OnTargetClientReceived(NATSocketClient socketClient, ITcpClient tcpClient, ByteBlock byteBlock, IRequestInfo requestInfo) + { + return byteBlock?.ToArray(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs.meta new file mode 100644 index 0000000..444f41d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c81e83bbe61461d4387c71cb97bf8688 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs new file mode 100644 index 0000000..274716d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs @@ -0,0 +1,134 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 端口转发辅助 + /// + public class NATSocketClient : SocketClient + { + internal Action m_internalDis; + internal Func m_internalTargetClientRev; + private readonly ConcurrentList m_targetClients = new ConcurrentList(); + + /// + /// 添加转发客户端。 + /// + /// 配置文件 + /// 当完成配置,但是还未连接时回调。 + /// + public ITcpClient AddTargetClient(TouchSocketConfig config, Action setupAction = default) + { + TcpClient tcpClient = new TcpClient(); + tcpClient.Disconnected += TcpClient_Disconnected; + tcpClient.Received += TcpClient_Received; + tcpClient.Setup(config); + setupAction?.Invoke(tcpClient); + tcpClient.Connect(); + + m_targetClients.Add(tcpClient); + return tcpClient; + } + + /// + /// 添加转发客户端。 + /// + /// 配置文件 + /// 当完成配置,但是还未连接时回调。 + /// + public Task AddTargetClientAsync(TouchSocketConfig config, Action setupAction = default) + { + return EasyTask.Run(() => + { + return AddTargetClient(config, setupAction); + }); + } + + /// + /// 获取所有目标客户端 + /// + /// + public ITcpClient[] GetTargetClients() + { + return m_targetClients.ToArray(); + } + + /// + /// 发送数据到全部转发端。 + /// + /// + /// + /// + public void SendToTargetClient(byte[] buffer, int offset, int length) + { + foreach (var socket in m_targetClients) + { + try + { + socket.Send(buffer, offset, length); + } + catch + { + } + } + } + + /// + /// + /// + /// + protected override void OnDisconnected(DisconnectEventArgs e) + { + foreach (var client in m_targetClients) + { + client.TryShutdown(); + client.SafeDispose(); + } + base.OnDisconnected(e); + } + + private void TcpClient_Disconnected(ITcpClientBase client, DisconnectEventArgs e) + { + client.Dispose(); + m_targetClients.Remove((ITcpClient)client); + m_internalDis?.Invoke(this, (ITcpClient)client, e); + } + + private void TcpClient_Received(TcpClient client, ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (DisposedValue) + { + return; + } + + try + { + var data = m_internalTargetClientRev?.Invoke(this, client, byteBlock, requestInfo); + if (data != null) + { + if (Online) + { + this.Send(data); + } + } + } + catch + { + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs.meta new file mode 100644 index 0000000..dc7b41f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/NAT/NATSocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 75c63fb8bfedba948b1f2e6eb75b3a80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP.meta new file mode 100644 index 0000000..636308e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 78eb8e241c6ab974c9ec3d697b766dac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs new file mode 100644 index 0000000..1a1c592 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs @@ -0,0 +1,964 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net.Security; +using System.Net.Sockets; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Sockets +{ + /// + /// 服务器辅助类 + /// + [DebuggerDisplay("ID={ID},IPAdress={IP}:{Port}")] + public class SocketClient : BaseSocket, ISocketClient + { + /// + /// 构造函数 + /// + public SocketClient() + { + Protocol = Protocol.TCP; + } + + #region 变量 + + internal string m_id; + internal ReceiveType m_receiveType; + internal TcpServiceBase m_service; + internal bool m_usePlugin; + private DataHandlingAdapter m_adapter; + private DelaySender m_delaySender; + private Socket m_mainSocket; + + //private int m_maxPackageSize; + private bool m_online; + + private bool m_useDelaySender; + private Stream m_workStream; + + #endregion 变量 + + #region 属性 + + /// + public bool IsClient => false; + + /// + /// + /// + public bool CanSend => m_online; + + /// + /// + /// + public virtual bool CanSetDataHandlingAdapter => true; + + /// + /// + /// + public TouchSocketConfig Config { get; internal set; } + + /// + /// + /// + public IContainer Container => Config?.Container; + + /// + /// + /// + public DataHandlingAdapter DataHandlingAdapter => m_adapter; + + /// + /// 用于索引的ID + /// + public string ID => m_id; + + /// + /// + /// + public string IP { get; private set; } + + /// + /// + /// + public Socket MainSocket => m_mainSocket; + + /// + /// + /// + public bool Online => m_online; + + /// + /// + /// + public IPluginsManager PluginsManager => Config?.PluginsManager; + + /// + /// + /// + public int Port { get; private set; } + + /// + /// + /// + public Protocol Protocol { get; set; } + + /// + /// + /// + public ReceiveType ReceiveType => m_receiveType; + + /// + /// + /// + public TcpServiceBase Service => m_service; + + /// + /// + /// + public bool UsePlugin => m_usePlugin; + + /// + /// + /// + public bool UseSsl { get; private set; } + + #endregion 属性 + + #region 事件&委托 + + /// + /// + /// + public DisconnectEventHandler Disconnected { get; set; } + + /// + /// + /// + public DisconnectEventHandler Disconnecting { get; set; } + + + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + /// + protected virtual void OnDisconnecting(DisconnectEventArgs e) + { + try + { + Disconnecting?.Invoke(this, e); + } + catch (Exception ex) + { + Logger.Log(LogType.Error, this, $"在事件{nameof(Disconnecting)}中发生错误。", ex); + } + } + /// + /// 当客户端完整建立TCP连接,如果覆盖父类方法,则不会触发插件。 + /// + /// + protected virtual void OnConnected(TouchSocketEventArgs e) + { + m_service.OnInternalConnected(this, e); + } + + /// + /// 客户端正在连接,如果覆盖父类方法,则不会触发插件。 + /// + protected virtual void OnConnecting(OperationEventArgs e) + { + m_service.OnInternalConnecting(this, e); + } + + /// + /// 在延迟发生错误 + /// + /// + protected virtual void OnDelaySenderError(Exception ex) + { + Logger.Log(LogType.Error, this, "发送错误", ex); + } + + /// + /// 客户端已断开连接,如果从Connecting中拒绝连接,则不会触发。如果覆盖父类方法,则不会触发插件。 + /// + /// + protected virtual void OnDisconnected(DisconnectEventArgs e) + { + Disconnected?.Invoke(this, e); + } + + /// + /// 当初始化完成时,执行在之前。 + /// + protected virtual void OnInitialized() + { + } + + private void PrivateOnDisconnected(DisconnectEventArgs e) + { + if (m_usePlugin && PluginsManager.Raise(nameof(IDisconnectedPlguin.OnDisconnected), this, e)) + { + return; + } + OnDisconnected(e); + if (!e.Handled) + { + m_service.OnInternalDisconnected(this, e); + } + } + + private void PrivateOnDisconnecting(DisconnectEventArgs e) + { + if (m_usePlugin && PluginsManager.Raise(nameof(IDisconnectingPlugin.OnDisconnecting), this, e)) + { + return; + } + OnDisconnecting(e); + if (!e.Handled) + { + m_service.OnInternalDisconnecting(this, e); + } + } + #endregion 事件&委托 + + /// + /// + /// + public DateTime LastReceivedTime { get; private set; } + + /// + /// + /// + public DateTime LastSendTime { get; private set; } + + /// + /// + /// + public Func OnHandleRawBuffer { get; set; } + + /// + /// + /// + public Func OnHandleReceivedData { get; set; } + + /// + /// + /// + public string ServiceIP { get; private set; } + + /// + /// + /// + public int ServicePort { get; private set; } + + /// + public virtual void Close() + { + Close($"主动调用{nameof(Close)}"); + } + + /// + public virtual void Close(string msg) + { + if (this.m_online) + { + var args = new DisconnectEventArgs(true, msg) + { + IsPermitOperation = true + }; + PrivateOnDisconnecting(args); + if (this.DisposedValue || args.IsPermitOperation) + { + BreakOut(msg, true); + } + } + } + + /// + /// + /// + /// + public Stream GetStream() + { + if (m_workStream == null) + { + m_workStream = new NetworkStream(m_mainSocket, true); + } + return m_workStream; + } + + /// + /// 直接重置内部ID。 + /// + /// + protected void DirectResetID(string newId) + { + if (string.IsNullOrEmpty(newId)) + { + throw new ArgumentException($"“{nameof(newId)}”不能为 null 或空。", nameof(newId)); + } + + if (m_id == newId) + { + return; + } + string oldId = m_id; + if (Service.SocketClients.TryRemove(m_id, out SocketClient socketClient)) + { + socketClient.m_id = newId; + if (Service.SocketClients.TryAdd(socketClient)) + { + if (m_usePlugin) + { + IDChangedEventArgs e = new IDChangedEventArgs(oldId, newId); + PluginsManager.Raise(nameof(ITcpPlugin.OnIDChanged), socketClient, e); + } + return; + } + else + { + socketClient.m_id = oldId; + if (Service.SocketClients.TryAdd(socketClient)) + { + throw new Exception("ID重复"); + } + else + { + socketClient.Close("修改新ID时操作失败,且回退旧ID时也失败。"); + } + } + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(oldId)); + } + } + + /// + /// + /// + /// + /// + /// + /// + public virtual void ResetID(string newId) + { + DirectResetID(newId); + } + + /// + /// + /// + /// + public virtual void SetDataHandlingAdapter(DataHandlingAdapter adapter) + { + if (!CanSetDataHandlingAdapter) + { + throw new Exception($"不允许自由调用{nameof(SetDataHandlingAdapter)}进行赋值。"); + } + + SetAdapter(adapter); + } + + internal void BeginReceive(ReceiveType receiveType) + { + try + { + if (receiveType == ReceiveType.Auto) + { + SocketAsyncEventArgs eventArgs = new SocketAsyncEventArgs(); + eventArgs.Completed += EventArgs_Completed; + ByteBlock byteBlock = BytePool.Default.GetByteBlock(BufferLength); + eventArgs.UserToken = byteBlock; + eventArgs.SetBuffer(byteBlock.Buffer, 0, byteBlock.Capacity); + if (!m_mainSocket.ReceiveAsync(eventArgs)) + { + ProcessReceived(eventArgs); + } + } + } + catch (Exception ex) + { + BreakOut(ex.Message, false); + } + } + + internal void BeginReceiveSsl(ReceiveType receiveType, ServiceSslOption sslOption) + { + SslStream sslStream = (sslOption.CertificateValidationCallback != null) ? new SslStream(new NetworkStream(m_mainSocket, false), false, sslOption.CertificateValidationCallback) : new SslStream(new NetworkStream(m_mainSocket, false), false); + sslStream.AuthenticateAsServer(sslOption.Certificate, sslOption.ClientCertificateRequired, sslOption.SslProtocols, sslOption.CheckCertificateRevocation); + m_workStream = sslStream; + UseSsl = true; + if (receiveType == ReceiveType.Auto) + { + BeginSsl(); + } + } + + internal void InternalConnected(TouchSocketEventArgs e) + { + m_online = true; + + if (Config.GetValue(TouchSocketConfigExtension.DelaySenderProperty) is DelaySenderOption senderOption) + { + m_useDelaySender = true; + m_delaySender.SafeDispose(); + m_delaySender = new DelaySender(m_mainSocket, senderOption.QueueLength, OnDelaySenderError) + { + DelayLength = senderOption.DelayLength + }; + } + + if (m_usePlugin && PluginsManager.Raise(nameof(IConnectedPlugin.OnConnected), this, e)) + { + return; + } + + OnConnected(e); + } + + internal void InternalConnecting(OperationEventArgs e) + { + if (m_usePlugin && PluginsManager.Raise(nameof(IConnectingPlugin.OnConnecting), this, e)) + { + return; + } + OnConnecting(e); + } + + internal void InternalInitialized() + { + LastReceivedTime = DateTime.Now; + LastSendTime = DateTime.Now; + OnInitialized(); + } + + internal void SetSocket(Socket mainSocket) + { + m_mainSocket = mainSocket ?? throw new ArgumentNullException(nameof(mainSocket)); + IP = mainSocket.RemoteEndPoint.GetIP(); + Port = mainSocket.RemoteEndPoint.GetPort(); + ServiceIP = mainSocket.LocalEndPoint.GetIP(); + ServicePort = mainSocket.LocalEndPoint.GetPort(); + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (this.m_online) + { + var args = new DisconnectEventArgs(true, $"{nameof(Dispose)}主动断开"); + PrivateOnDisconnecting(args); + } + m_adapter.SafeDispose(); + m_adapter = default; + BreakOut($"{nameof(Dispose)}主动断开", true); + base.Dispose(disposing); + } + + /// + /// 处理已接收到的数据。 + /// 根据不同的数据处理适配器,会传递不同的数据 + /// + /// 以二进制流形式传递 + /// 以解析的数据对象传递 + protected virtual void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + } + + /// + /// 当即将发送时,如果覆盖父类方法,则不会触发插件。 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 返回值表示是否允许发送 + protected virtual bool HandleSendingData(byte[] buffer, int offset, int length) + { + if (m_usePlugin) + { + SendingEventArgs args = new SendingEventArgs(buffer, offset, length); + PluginsManager.Raise(nameof(ITcpPlugin.OnSendingData), this, args); + if (args.IsPermitOperation) + { + return true; + } + return false; + } + return true; + } + + + /// + /// 设置适配器,该方法不会检验的值。 + /// + /// + protected void SetAdapter(DataHandlingAdapter adapter) + { + if (adapter is null) + { + throw new ArgumentNullException(nameof(adapter)); + } + + if (Config != null) + { + if (Config.GetValue(TouchSocketConfigExtension.MaxPackageSizeProperty) is int v1) + { + adapter.MaxPackageSize = v1; + } + if (Config.GetValue(TouchSocketConfigExtension.CacheTimeoutProperty) != TimeSpan.Zero) + { + adapter.CacheTimeout = Config.GetValue(TouchSocketConfigExtension.CacheTimeoutProperty); + } + if (Config.GetValue(TouchSocketConfigExtension.CacheTimeoutEnableProperty) is bool v2) + { + adapter.CacheTimeoutEnable = v2; + } + if (Config.GetValue(TouchSocketConfigExtension.UpdateCacheTimeWhenRevProperty) is bool v3) + { + adapter.UpdateCacheTimeWhenRev = v3; + } + } + + adapter.OnLoaded(this); + adapter.ReceivedCallBack = PrivateHandleReceivedData; + adapter.SendCallBack = DefaultSend; + m_adapter = adapter; + } + + private void BeginSsl() + { + if (!DisposedValue) + { + ByteBlock byteBlock = new ByteBlock(BufferLength); + try + { + m_workStream.BeginRead(byteBlock.Buffer, 0, byteBlock.Capacity, EndSsl, byteBlock); + } + catch (System.Exception ex) + { + byteBlock.Dispose(); + BreakOut(ex.Message, false); + } + } + } + + private void BreakOut(string msg, bool manual) + { + lock (this.SyncRoot) + { + if (m_online) + { + m_online = false; + this.TryShutdown(); + m_mainSocket.SafeDispose(); + m_delaySender.SafeDispose(); + m_adapter.SafeDispose(); + m_service?.SocketClients.TryRemove(m_id, out _); + PrivateOnDisconnected(new DisconnectEventArgs(manual, msg)); + Disconnected = null; + } + base.Dispose(true); + } + } + + private void EndSsl(IAsyncResult result) + { + ByteBlock byteBlock = (ByteBlock)result.AsyncState; + try + { + int r = m_workStream.EndRead(result); + if (r == 0) + { + BreakOut("远程终端主动关闭", false); + } + byteBlock.SetLength(r); + + HandleBuffer(byteBlock); + BeginSsl(); + } + catch (Exception ex) + { + byteBlock.Dispose(); + BreakOut(ex.Message, false); + } + } + + private void EventArgs_Completed(object sender, SocketAsyncEventArgs e) + { + try + { + ProcessReceived(e); + } + catch (Exception ex) + { + e.SafeDispose(); + BreakOut(ex.Message, false); + } + } + + private void HandleBuffer(ByteBlock byteBlock) + { + try + { + LastReceivedTime = DateTime.Now; + if (OnHandleRawBuffer?.Invoke(byteBlock) == false) + { + return; + } + if (UsePlugin && PluginsManager.Raise(nameof(ITcpPlugin.OnReceivingData), this, new ByteBlockEventArgs(byteBlock))) + { + return; + } + if (DisposedValue) + { + return; + } + if (m_adapter == null) + { + Logger.Error(this, TouchSocketStatus.NullDataAdapter.GetDescription()); + return; + } + m_adapter.ReceivedInput(byteBlock); + } + catch (System.Exception ex) + { + Logger.Log(LogType.Error, this, "在处理数据时发生错误", ex); + } + finally + { + byteBlock.Dispose(); + } + } + + private void PrivateHandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (OnHandleReceivedData?.Invoke(byteBlock, requestInfo) == false) + { + return; + } + + if (m_usePlugin) + { + ReceivedDataEventArgs args = new ReceivedDataEventArgs(byteBlock, requestInfo); + PluginsManager.Raise(nameof(ITcpPlugin.OnReceivedData), this, args); + if (args.Handled) + { + return; + } + } + + HandleReceivedData(byteBlock, requestInfo); + + m_service.OnInternalReceivedData(this, byteBlock, requestInfo); + } + + + private void ProcessReceived(SocketAsyncEventArgs e) + { + if (DisposedValue) + { + e.SafeDispose(); + } + else + { + if (e.SocketError == SocketError.Success && e.BytesTransferred > 0) + { + ByteBlock byteBlock = (ByteBlock)e.UserToken; + byteBlock.SetLength(e.BytesTransferred); + HandleBuffer(byteBlock); + try + { + ByteBlock newByteBlock = new ByteBlock(BufferLength); + e.UserToken = newByteBlock; + e.SetBuffer(newByteBlock.Buffer, 0, newByteBlock.Capacity); + + if (!m_mainSocket.ReceiveAsync(e)) + { + ProcessReceived(e); + } + } + catch (Exception ex) + { + BreakOut(ex.Message, false); + } + } + else + { + e.SafeDispose(); + BreakOut("远程主机主动断开连接", false); + } + } + } + + #region 发送 + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void DefaultSend(byte[] buffer, int offset, int length) + { + if (!m_online) + { + throw new NotConnectedException(TouchSocketStatus.NotConnected.GetDescription()); + } + if (HandleSendingData(buffer, offset, length)) + { + if (UseSsl) + { + m_workStream.Write(buffer, offset, length); + } + else + { + if (m_useDelaySender && length < TouchSocketUtility.BigDataBoundary) + { + m_delaySender.Send(new QueueDataBytes(buffer, offset, length)); + } + else + { + m_mainSocket.AbsoluteSend(buffer, offset, length); + } + } + LastSendTime = DateTime.Now; + } + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public Task DefaultSendAsync(byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + DefaultSend(buffer, offset, length); + }); + } + + #region 同步发送 + + /// + /// + /// + /// + /// + /// + /// + public virtual void Send(IRequestInfo requestInfo) + { + if (DisposedValue) + { + return; + } + if (m_adapter == null) + { + throw new ArgumentNullException(nameof(DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + if (!m_adapter.CanSendRequestInfo) + { + throw new NotSupportedException($"当前适配器不支持对象发送。"); + } + m_adapter.SendInput(requestInfo); + } + + /// + /// 发送字节流 + /// + /// + /// + /// + /// + /// + /// + public virtual void Send(byte[] buffer, int offset, int length) + { + if (DisposedValue) + { + return; + } + if (m_adapter == null) + { + throw new ArgumentNullException(nameof(DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + m_adapter.SendInput(buffer, offset, length); + } + + /// + /// + /// + /// + public virtual void Send(IList> transferBytes) + { + if (DisposedValue) + { + return; + } + if (m_adapter == null) + { + throw new ArgumentNullException(nameof(DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + if (m_adapter.CanSplicingSend) + { + m_adapter.SendInput(transferBytes); + } + else + { + ByteBlock byteBlock = new ByteBlock(BufferLength); + try + { + foreach (var item in transferBytes) + { + byteBlock.Write(item.Array, item.Offset, item.Count); + } + m_adapter.SendInput(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + } + + #endregion 同步发送 + + #region 异步发送 + + /// + /// IOCP发送 + /// + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + Send(buffer, offset, length); + }); + } + + /// + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(IRequestInfo requestInfo) + { + return EasyTask.Run(() => + { + Send(requestInfo); + }); + } + + /// + /// + /// + /// + public virtual Task SendAsync(IList> transferBytes) + { + return EasyTask.Run(() => + { + Send(transferBytes); + }); + } + + #endregion 异步发送 + + #region ID发送 + + /// + /// 发送字节流 + /// + /// 用于检索TcpSocketClient + /// + /// + /// + /// + /// + /// + /// + public void Send(string id, byte[] buffer, int offset, int length) + { + m_service.Send(id, buffer, offset, length); + } + + /// + /// + /// + /// + /// + public void Send(string id, IRequestInfo requestInfo) + { + m_service.Send(id, requestInfo); + } + + /// + /// 发送字节流 + /// + /// 用于检索TcpSocketClient + /// + /// + /// + /// + /// + /// + /// + public Task SendAsync(string id, byte[] buffer, int offset, int length) + { + return m_service.SendAsync(id, buffer, offset, length); + } + + /// + /// + /// + /// + /// + public Task SendAsync(string id, IRequestInfo requestInfo) + { + return m_service.SendAsync(id, requestInfo); + } + + #endregion ID发送 + + #endregion 发送 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs.meta new file mode 100644 index 0000000..909c26a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/SocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76333d2b0a2df074490a593131b7c6e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs new file mode 100644 index 0000000..f81af45 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs @@ -0,0 +1,1086 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Security; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Sockets +{ + /// + /// 简单TCP客户端 + /// + public class TcpClient : TcpClientBase + { + /// + /// 接收到数据 + /// + public ReceivedEventHandler Received { get; set; } + + /// + /// 接收数据 + /// + /// + /// + protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + this.Received?.Invoke(this, byteBlock, requestInfo); + base.HandleReceivedData(byteBlock, requestInfo); + } + } + + /// + /// TCP客户端 + /// + [System.Diagnostics.DebuggerDisplay("{IP}:{Port}")] + public class TcpClientBase : BaseSocket, ITcpClient + { + /// + /// 构造函数 + /// + public TcpClientBase() + { + this.Protocol = Protocol.TCP; + } + + #region 变量 + + private DelaySender m_delaySender; + private bool m_useDelaySender; + private Stream m_workStream; + + #endregion 变量 + + #region 事件 + + /// + /// 成功连接到服务器 + /// + public MessageEventHandler Connected { get; set; } + + /// + /// 准备连接的时候,此时已初始化Socket,但是并未建立Tcp连接 + /// + public ConnectingEventHandler Connecting { get; set; } + + /// + /// 断开连接。在客户端未设置连接状态时,不会触发 + /// + public DisconnectEventHandler Disconnected { get; set; } + + /// + /// + /// + public DisconnectEventHandler Disconnecting { get; set; } + + private void PrivateOnConnected(MsgEventArgs e) + { + if (this.UsePlugin) + { + this.PluginsManager.Raise(nameof(IConnectedPlugin.OnConnected), this, e); + if (e.Handled) + { + return; + } + } + this.OnConnected(e); + } + + /// + /// 已经建立Tcp连接 + /// + /// + protected virtual void OnConnected(MsgEventArgs e) + { + try + { + this.Connected?.Invoke(this, e); + } + catch (System.Exception ex) + { + this.Logger.Log(LogType.Error, this, $"在事件{nameof(this.Connected)}中发生错误。", ex); + } + } + + private void PrivateOnConnecting(ConnectingEventArgs e) + { + this.LastReceivedTime = DateTime.Now; + this.LastSendTime = DateTime.Now; + if (this.CanSetDataHandlingAdapter) + { + this.SetDataHandlingAdapter(this.Config.GetValue>(TouchSocketConfigExtension.DataHandlingAdapterProperty).Invoke()); + } + if (this.UsePlugin) + { + this.PluginsManager.Raise(nameof(IConnectingPlugin.OnConnecting), this, e); + if (e.Handled) + { + return; + } + } + this.OnConnecting(e); + } + + /// + /// 准备连接的时候,此时已初始化Socket,但是并未建立Tcp连接 + /// + /// + protected virtual void OnConnecting(ConnectingEventArgs e) + { + try + { + this.Connecting?.Invoke(this, e); + } + catch (Exception ex) + { + this.Logger.Log(LogType.Error, this, $"在事件{nameof(this.OnConnecting)}中发生错误。", ex); + } + } + + private void PrivateOnDisconnected(DisconnectEventArgs e) + { + if (this.UsePlugin && this.PluginsManager.Raise(nameof(IDisconnectedPlguin.OnDisconnected), this, e)) + { + return; + } + this.OnDisconnected(e); + } + + /// + /// 断开连接。在客户端未设置连接状态时,不会触发 + /// + /// + protected virtual void OnDisconnected(DisconnectEventArgs e) + { + try + { + this.Disconnected?.Invoke(this, e); + } + catch (Exception ex) + { + this.Logger.Log(LogType.Error, this, $"在事件{nameof(this.Disconnected)}中发生错误。", ex); + } + } + + private void PrivateOnDisconnecting(DisconnectEventArgs e) + { + if (this.UsePlugin && this.PluginsManager.Raise(nameof(IDisconnectingPlugin.OnDisconnecting), this, e)) + { + return; + } + this.OnDisconnecting(e); + } + + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + /// + protected virtual void OnDisconnecting(DisconnectEventArgs e) + { + try + { + this.Disconnecting?.Invoke(this, e); + } + catch (Exception ex) + { + this.Logger.Log(LogType.Error, this, $"在事件{nameof(this.Disconnecting)}中发生错误。", ex); + } + } + + #endregion 事件 + + #region 属性 + + /// + /// + /// + public DateTime LastReceivedTime { get; private set; } + + /// + /// + /// + public DateTime LastSendTime { get; private set; } + + /// + /// 处理未经过适配器的数据。返回值表示是否继续向下传递。 + /// + public Func OnHandleRawBuffer { get; set; } + + /// + /// 处理经过适配器后的数据。返回值表示是否继续向下传递。 + /// + public Func OnHandleReceivedData { get; set; } + + /// + /// + /// + public IContainer Container => this.Config?.Container; + + /// + /// + /// + public virtual bool CanSetDataHandlingAdapter => true; + + /// + /// 客户端配置 + /// + public TouchSocketConfig Config { get; private set; } + + /// + /// 数据处理适配器 + /// + public DataHandlingAdapter DataHandlingAdapter { get; private set; } + + /// + /// IP地址 + /// + public string IP { get; private set; } + + /// + /// 主通信器 + /// + public Socket MainSocket { get; private set; } + + /// + /// + /// + public bool CanSend { get; private set; } + + /// + /// + /// + public bool Online => this.CanSend; + + /// + /// + /// + public IPluginsManager PluginsManager { get; private set; } + + /// + /// 端口号 + /// + public int Port { get; private set; } + + /// + /// + /// + public ReceiveType ReceiveType { get; private set; } + + /// + /// 是否已启用插件 + /// + public bool UsePlugin { get; private set; } + + /// + /// + /// + public bool UseSsl { get; private set; } + + /// + /// + /// + public Protocol Protocol { get; set; } + + /// + /// + /// + public IPHost RemoteIPHost { get; private set; } + + /// + public bool IsClient => true; + + #endregion 属性 + + #region 断开操作 + + /// + /// + /// + public virtual void Close() + { + this.Close($"{nameof(Close)}主动断开"); + } + + /// + /// 中断终端,传递中断消息。 + /// + /// + public virtual void Close(string msg) + { + if (this.CanSend) + { + var args = new DisconnectEventArgs(true, msg) + { + IsPermitOperation = true + }; + this.PrivateOnDisconnecting(args); + if (this.DisposedValue || args.IsPermitOperation) + { + this.BreakOut(msg, true); + } + } + } + + private void BreakOut(string msg, bool manual) + { + lock (this.SyncRoot) + { + if (this.CanSend) + { + this.CanSend = false; + this.TryShutdown(); + this.MainSocket.SafeDispose(); + this.m_delaySender.SafeDispose(); + this.m_workStream.SafeDispose(); + this.DataHandlingAdapter.SafeDispose(); + this.PrivateOnDisconnected(new DisconnectEventArgs(manual, msg)); + } + } + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (this.CanSend) + { + var args = new DisconnectEventArgs(true, $"{nameof(Dispose)}主动断开"); + this.PrivateOnDisconnecting(args); + } + this.PluginsManager?.Clear(); + this.Config = default; + this.DataHandlingAdapter.SafeDispose(); + this.DataHandlingAdapter = default; + this.BreakOut($"{nameof(Dispose)}主动断开", true); + base.Dispose(disposing); + } + + #endregion 断开操作 + + /// + /// 建立Tcp的连接。 + /// + /// + /// + /// + /// + /// + protected void TcpConnect(int timeout) + { + lock (this.SyncRoot) + { + if (this.CanSend) + { + return; + } + if (this.DisposedValue) + { + throw new ObjectDisposedException(this.GetType().FullName); + } + if (this.Config == null) + { + throw new ArgumentNullException("配置文件不能为空。"); + } + IPHost iPHost = this.Config.GetValue(TouchSocketConfigExtension.RemoteIPHostProperty); + if (iPHost == null) + { + throw new ArgumentNullException("iPHost不能为空。"); + } + if (this.MainSocket != null) + { + this.MainSocket.Dispose(); + } + this.MainSocket = this.CreateSocket(iPHost); + + ConnectingEventArgs args = new ConnectingEventArgs(this.MainSocket); + this.PrivateOnConnecting(args); + if (timeout == 5000) + { + this.MainSocket.Connect(iPHost.EndPoint); + this.CanSend = true; + this.LoadSocketAndReadIpPort(); + + if (this.Config.GetValue(TouchSocketConfigExtension.DelaySenderProperty) is DelaySenderOption senderOption) + { + this.m_useDelaySender = true; + this.m_delaySender.SafeDispose(); + this.m_delaySender = new DelaySender(this.MainSocket, senderOption.QueueLength, this.OnDelaySenderError) + { + DelayLength = senderOption.DelayLength + }; + } + + this.BeginReceive(); + this.PrivateOnConnected(new MsgEventArgs("连接成功")); + } + else + { + var result = this.MainSocket.BeginConnect(iPHost.EndPoint, null, null); + if (result.AsyncWaitHandle.WaitOne(timeout)) + { + if (this.MainSocket.Connected) + { + this.MainSocket.EndConnect(result); + this.CanSend = true; + this.LoadSocketAndReadIpPort(); + + if (this.Config.GetValue(TouchSocketConfigExtension.DelaySenderProperty) is DelaySenderOption senderOption) + { + this.m_useDelaySender = true; + this.m_delaySender.SafeDispose(); + this.m_delaySender = new DelaySender(this.MainSocket, senderOption.QueueLength, this.OnDelaySenderError) + { + DelayLength = senderOption.DelayLength + }; + } + + this.BeginReceive(); + this.PrivateOnConnected(new MsgEventArgs("连接成功")); + return; + } + else + { + this.MainSocket.SafeDispose(); + throw new Exception("异步已完成,但是socket并未在连接状态,可能发生了绑定端口占用的错误。"); + } + } + this.MainSocket.SafeDispose(); + throw new TimeoutException(); + } + } + } + + /// + /// 请求连接到服务器。 + /// + public virtual ITcpClient Connect(int timeout = 5000) + { + this.TcpConnect(timeout); + return this; + } + + /// + /// 异步连接服务器 + /// + public Task ConnectAsync(int timeout = 5000) + { + return EasyTask.Run(() => + { + return this.Connect(timeout); + }); + } + + /// + /// + /// + /// + public Stream GetStream() + { + if (this.m_workStream == null) + { + this.m_workStream = new NetworkStream(this.MainSocket, true); + } + return this.m_workStream; + } + + /// + /// 设置数据处理适配器 + /// + /// + public virtual void SetDataHandlingAdapter(DataHandlingAdapter adapter) + { + if (!this.CanSetDataHandlingAdapter) + { + throw new Exception($"不允许自由调用{nameof(SetDataHandlingAdapter)}进行赋值。"); + } + + this.SetAdapter(adapter); + } + + /// + /// + /// + /// + /// + public ITcpClient Setup(string ipHost) + { + TouchSocketConfig config = new TouchSocketConfig(); + config.SetRemoteIPHost(new IPHost(ipHost)); + return this.Setup(config); + } + + /// + /// 配置服务器 + /// + /// + /// + public ITcpClient Setup(TouchSocketConfig config) + { + this.Config = config; + this.PluginsManager = config.PluginsManager; + + if (config.IsUsePlugin) + { + this.PluginsManager.Raise(nameof(IConfigPlugin.OnLoadingConfig), this, new ConfigEventArgs(config)); + } + this.LoadConfig(this.Config); + if (this.UsePlugin) + { + this.PluginsManager.Raise(nameof(IConfigPlugin.OnLoadedConfig), this, new ConfigEventArgs(config)); + } + return this; + } + + private void PrivateHandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (this.OnHandleReceivedData?.Invoke(byteBlock, requestInfo) == false) + { + return; + } + if (this.UsePlugin) + { + ReceivedDataEventArgs args = new ReceivedDataEventArgs(byteBlock, requestInfo); + this.PluginsManager.Raise(nameof(ITcpPlugin.OnReceivedData), this, args); + if (args.Handled) + { + return; + } + } + + this.HandleReceivedData(byteBlock, requestInfo); + } + + /// + /// 处理已接收到的数据。 + /// + /// 以二进制流形式传递 + /// 以解析的数据对象传递 + protected virtual void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + } + + /// + /// 当即将发送时,如果覆盖父类方法,则不会触发插件。 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 返回值表示是否允许发送 + protected virtual bool HandleSendingData(byte[] buffer, int offset, int length) + { + if (this.UsePlugin) + { + SendingEventArgs args = new SendingEventArgs(buffer, offset, length); + this.PluginsManager.Raise(nameof(ITcpPlugin.OnSendingData), this, args); + if (args.IsPermitOperation) + { + return true; + } + return false; + } + return true; + } + + /// + /// 加载配置 + /// + /// + protected virtual void LoadConfig(TouchSocketConfig config) + { + if (config == null) + { + throw new Exception("配置文件为空"); + } + this.RemoteIPHost = config.GetValue(TouchSocketConfigExtension.RemoteIPHostProperty); + this.BufferLength = config.GetValue(TouchSocketConfigExtension.BufferLengthProperty); + this.ReceiveType = config.GetValue(TouchSocketConfigExtension.ReceiveTypeProperty); + this.UsePlugin = config.IsUsePlugin; + this.Logger = this.Container.Resolve(); + + if (config.GetValue(TouchSocketConfigExtension.SslOptionProperty) != null) + { + this.UseSsl = true; + } + } + + /// + /// 在延迟发生错误 + /// + /// + protected virtual void OnDelaySenderError(Exception ex) + { + this.Logger.Log(LogType.Error, this, "发送错误", ex); + } + + /// + /// 设置适配器,该方法不会检验的值。 + /// + /// + protected void SetAdapter(DataHandlingAdapter adapter) + { + if (adapter is null) + { + throw new ArgumentNullException(nameof(adapter)); + } + + if (this.Config != null) + { + if (this.Config.GetValue(TouchSocketConfigExtension.MaxPackageSizeProperty) is int v1) + { + adapter.MaxPackageSize = v1; + } + if (this.Config.GetValue(TouchSocketConfigExtension.CacheTimeoutProperty) != TimeSpan.Zero) + { + adapter.CacheTimeout = this.Config.GetValue(TouchSocketConfigExtension.CacheTimeoutProperty); + } + if (this.Config.GetValue(TouchSocketConfigExtension.CacheTimeoutEnableProperty) is bool v2) + { + adapter.CacheTimeoutEnable = v2; + } + if (this.Config.GetValue(TouchSocketConfigExtension.UpdateCacheTimeWhenRevProperty) is bool v3) + { + adapter.UpdateCacheTimeWhenRev = v3; + } + } + + adapter.OnLoaded(this); + adapter.ReceivedCallBack = this.PrivateHandleReceivedData; + adapter.SendCallBack = this.DefaultSend; + this.DataHandlingAdapter = adapter; + } + + private void BeginReceive() + { + this.m_workStream.SafeDispose(); + if (this.UseSsl) + { + ClientSslOption sslOption = (ClientSslOption)this.Config.GetValue(TouchSocketConfigExtension.SslOptionProperty); + SslStream sslStream = (sslOption.CertificateValidationCallback != null) ? new SslStream(new NetworkStream(this.MainSocket, false), false, sslOption.CertificateValidationCallback) : new SslStream(new NetworkStream(this.MainSocket, false), false); + if (sslOption.ClientCertificates == null) + { + sslStream.AuthenticateAsClient(sslOption.TargetHost); + } + else + { + sslStream.AuthenticateAsClient(sslOption.TargetHost, sslOption.ClientCertificates, sslOption.SslProtocols, sslOption.CheckCertificateRevocation); + } + this.m_workStream = sslStream; + if (this.ReceiveType != ReceiveType.None) + { + this.BeginSsl(); + } + } + else + { + if (this.ReceiveType == ReceiveType.Auto) + { + SocketAsyncEventArgs eventArgs = new SocketAsyncEventArgs(); + eventArgs.Completed += this.EventArgs_Completed; + + ByteBlock byteBlock = BytePool.Default.GetByteBlock(this.BufferLength); + eventArgs.UserToken = byteBlock; + eventArgs.SetBuffer(byteBlock.Buffer, 0, byteBlock.Buffer.Length); + if (!this.MainSocket.ReceiveAsync(eventArgs)) + { + this.ProcessReceived(eventArgs); + } + } + } + } + + private void BeginSsl() + { + ByteBlock byteBlock = new ByteBlock(this.BufferLength); + try + { + this.m_workStream.BeginRead(byteBlock.Buffer, 0, byteBlock.Capacity, this.EndSsl, byteBlock); + } + catch (Exception ex) + { + byteBlock.Dispose(); + this.BreakOut(ex.Message, false); + } + } + + private void EndSsl(IAsyncResult result) + { + ByteBlock byteBlock = (ByteBlock)result.AsyncState; + try + { + int r = this.m_workStream.EndRead(result); + if (r == 0) + { + this.BreakOut("远程终端主动关闭", false); + } + byteBlock.SetLength(r); + this.HandleBuffer(byteBlock); + this.BeginSsl(); + } + catch (System.Exception ex) + { + byteBlock.Dispose(); + this.BreakOut(ex.Message, false); + } + } + + private Socket CreateSocket(IPHost iPHost) + { + Socket socket = new Socket(iPHost.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + socket.ReceiveBufferSize = this.BufferLength; + socket.SendBufferSize = this.BufferLength; +#if NET45_OR_GREATER + KeepAliveValue keepAliveValue = this.Config.GetValue(TouchSocketConfigExtension.KeepAliveValueProperty); + if (keepAliveValue.Enable) + { + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); + socket.IOControl(IOControlCode.KeepAliveValues, keepAliveValue.KeepAliveTime, null); + } +#else + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + KeepAliveValue keepAliveValue = Config.GetValue(TouchSocketConfigExtension.KeepAliveValueProperty); + if (keepAliveValue.Enable) + { + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); + socket.IOControl(IOControlCode.KeepAliveValues, keepAliveValue.KeepAliveTime, null); + } + } +#endif + socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, this.Config.GetValue(TouchSocketConfigExtension.NoDelayProperty)); + if (this.Config.GetValue(TouchSocketConfigExtension.BindIPHostProperty) != null) + { + if (this.Config.GetValue(TouchSocketConfigExtension.ReuseAddressProperty)) + { + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + } + socket.Bind(this.Config.GetValue(TouchSocketConfigExtension.BindIPHostProperty).EndPoint); + } + return socket; + } + + private void EventArgs_Completed(object sender, SocketAsyncEventArgs e) + { + try + { + this.ProcessReceived(e); + } + catch (System.Exception ex) + { + e.Dispose(); + this.BreakOut(ex.Message, false); + } + } + + /// + /// 处理数据 + /// + private void HandleBuffer(ByteBlock byteBlock) + { + try + { + this.LastReceivedTime = DateTime.Now; + if (this.OnHandleRawBuffer?.Invoke(byteBlock) == false) + { + return; + } + if (this.DisposedValue) + { + return; + } + if (this.UsePlugin && this.PluginsManager.Raise(nameof(ITcpPlugin.OnReceivingData), this, new ByteBlockEventArgs(byteBlock))) + { + return; + } + if (this.DataHandlingAdapter == null) + { + this.Logger.Error(this, TouchSocketStatus.NullDataAdapter.GetDescription()); + return; + } + this.DataHandlingAdapter.ReceivedInput(byteBlock); + } + catch (Exception ex) + { + this.Logger.Log(LogType.Error, this, "在处理数据时发生错误", ex); + } + finally + { + byteBlock.Dispose(); + } + } + + #region 发送 + + #region 同步发送 + + /// + /// + /// + /// + /// + /// + /// + public void Send(IRequestInfo requestInfo) + { + if (this.DisposedValue) + { + return; + } + if (this.DataHandlingAdapter == null) + { + throw new ArgumentNullException(nameof(this.DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + if (!this.DataHandlingAdapter.CanSendRequestInfo) + { + throw new NotSupportedException($"当前适配器不支持对象发送。"); + } + this.DataHandlingAdapter.SendInput(requestInfo); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public virtual void Send(byte[] buffer, int offset, int length) + { + if (this.DataHandlingAdapter == null) + { + throw new ArgumentNullException(nameof(this.DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + this.DataHandlingAdapter.SendInput(buffer, offset, length); + } + + /// + /// + /// + /// + /// + /// + /// + public virtual void Send(IList> transferBytes) + { + if (this.DataHandlingAdapter == null) + { + throw new ArgumentNullException(nameof(this.DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + + if (this.DataHandlingAdapter.CanSplicingSend) + { + this.DataHandlingAdapter.SendInput(transferBytes); + } + else + { + ByteBlock byteBlock = BytePool.Default.GetByteBlock(this.BufferLength); + try + { + foreach (var item in transferBytes) + { + byteBlock.Write(item.Array, item.Offset, item.Count); + } + this.DataHandlingAdapter.SendInput(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + } + + #endregion 同步发送 + + #region 异步发送 + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + this.Send(buffer, offset, length); + }); + } + + /// + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(IRequestInfo requestInfo) + { + return EasyTask.Run(() => + { + this.Send(requestInfo); + }); + } + + /// + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(IList> transferBytes) + { + return EasyTask.Run(() => + { + this.Send(transferBytes); + }); + } + + #endregion 异步发送 + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void DefaultSend(byte[] buffer, int offset, int length) + { + if (!this.CanSend) + { + throw new NotConnectedException(TouchSocketStatus.NotConnected.GetDescription()); + } + if (this.HandleSendingData(buffer, offset, length)) + { + if (this.UseSsl) + { + this.m_workStream.Write(buffer, offset, length); + } + else + { + if (this.m_useDelaySender && length < TouchSocketUtility.BigDataBoundary) + { + this.m_delaySender.Send(new QueueDataBytes(buffer, offset, length)); + } + else + { + this.MainSocket.AbsoluteSend(buffer, offset, length); + } + } + + this.LastSendTime = DateTime.Now; + } + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public Task DefaultSendAsync(byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + this.DefaultSend(buffer, offset, length); + }); + } + + #endregion 发送 + + private void LoadSocketAndReadIpPort() + { + if (this.MainSocket == null) + { + this.IP = null; + this.Port = -1; + return; + } + + string ipport; + if (this.MainSocket.Connected && this.MainSocket.RemoteEndPoint != null) + { + ipport = this.MainSocket.RemoteEndPoint.ToString(); + } + else if (this.MainSocket.IsBound && this.MainSocket.LocalEndPoint != null) + { + ipport = this.MainSocket.LocalEndPoint.ToString(); + } + else + { + return; + } + + int r = ipport.LastIndexOf(":"); + this.IP = ipport.Substring(0, r); + this.Port = Convert.ToInt32(ipport.Substring(r + 1, ipport.Length - (r + 1))); + } + + private void ProcessReceived(SocketAsyncEventArgs e) + { + if (!this.CanSend) + { + e.Dispose(); + return; + } + if (e.SocketError == SocketError.Success && e.BytesTransferred > 0) + { + ByteBlock byteBlock = (ByteBlock)e.UserToken; + byteBlock.SetLength(e.BytesTransferred); + this.HandleBuffer(byteBlock); + try + { + ByteBlock newByteBlock = BytePool.Default.GetByteBlock(this.BufferLength); + e.UserToken = newByteBlock; + e.SetBuffer(newByteBlock.Buffer, 0, newByteBlock.Buffer.Length); + + if (!this.MainSocket.ReceiveAsync(e)) + { + this.ProcessReceived(e); + } + } + catch (System.Exception ex) + { + e.Dispose(); + this.BreakOut(ex.Message, false); + } + } + else + { + e.Dispose(); + this.BreakOut("远程终端主动关闭", false); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs.meta new file mode 100644 index 0000000..2235118 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 966c63fd3fdb77c4f876509b295ba83e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs new file mode 100644 index 0000000..b68d656 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs @@ -0,0 +1,723 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Threading; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Sockets +{ + /// + /// TCP泛型服务器,由客户自己指定类型。 + /// + public class TcpService : TcpServiceBase, ITcpService where TClient : SocketClient + { + /// + /// 构造函数 + /// + public TcpService() + { + m_socketClients = new SocketClientCollection(); + m_getDefaultNewID = () => + { + return Interlocked.Increment(ref m_nextId).ToString(); + }; + } + + #region 变量 + + private readonly SocketClientCollection m_socketClients; + private int m_backlog; + private TouchSocketConfig m_config; + private Func m_getDefaultNewID; + private int m_maxCount; + private NetworkMonitor[] m_monitors; + private long m_nextId; + private ReceiveType m_receiveType; + private ServerState m_serverState; + private bool m_usePlugin; + private bool m_useSsl; + + #endregion 变量 + + #region 属性 + + /// + /// 获取服务器配置 + /// + public override TouchSocketConfig Config => m_config; + + /// + /// + /// + public override IContainer Container => Config?.Container; + + /// + /// + /// + public override Func GetDefaultNewID => m_getDefaultNewID; + + /// + /// + /// + public override int MaxCount => m_maxCount; + + /// + /// + /// + public override NetworkMonitor[] Monitors => m_monitors; + + /// + /// + /// + public override IPluginsManager PluginsManager => Config?.PluginsManager; + + /// + /// + /// + public override string ServerName => Config?.GetValue(TouchSocketConfigExtension.ServerNameProperty); + + /// + /// + /// + public override ServerState ServerState => m_serverState; + + /// + /// + /// + public override SocketClientCollection SocketClients => m_socketClients; + + /// + /// + /// + public override bool UsePlugin => m_usePlugin; + + /// + /// + /// + public override bool UseSsl => m_useSsl; + + #endregion 属性 + + #region 事件 + + /// + /// 用户连接完成 + /// + public TouchSocketEventHandler Connected { get; set; } + + /// + /// 有用户连接的时候 + /// + public OperationEventHandler Connecting { get; set; } + + /// + /// 有用户断开连接 + /// + public DisconnectEventHandler Disconnected { get; set; } + + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + public DisconnectEventHandler Disconnecting { get; set; } + + /// + /// 当客户端ID被修改时触发。 + /// + public IDChangedEventHandler IDChanged { get; set; } + + /// + /// + /// + /// + /// + protected override sealed void OnClientConnected(ISocketClient socketClient, TouchSocketEventArgs e) + { + OnConnected((TClient)socketClient, e); + } + + /// + /// + /// + /// + /// + protected override sealed void OnClientConnecting(ISocketClient socketClient, OperationEventArgs e) + { + OnConnecting((TClient)socketClient, e); + } + + /// + /// + /// + /// + /// + protected override sealed void OnClientDisconnected(ISocketClient socketClient, DisconnectEventArgs e) + { + OnDisconnected((TClient)socketClient, e); + } + + /// + /// + /// + /// + /// + protected override sealed void OnClientDisconnecting(ISocketClient socketClient, DisconnectEventArgs e) + { + OnDisconnecting((TClient)socketClient, e); + } + + /// + /// + /// + /// + /// + /// + protected override sealed void OnClientReceivedData(ISocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo) + { + OnReceived((TClient)socketClient, byteBlock, requestInfo); + } + + /// + /// 客户端连接完成,覆盖父类方法将不会触发事件。 + /// + /// + /// + protected virtual void OnConnected(TClient socketClient, TouchSocketEventArgs e) + { + Connected?.Invoke(socketClient, e); + } + + /// + /// 客户端请求连接,覆盖父类方法将不会触发事件。 + /// + /// + /// + protected virtual void OnConnecting(TClient socketClient, OperationEventArgs e) + { + Connecting?.Invoke(socketClient, e); + } + + /// + /// 客户端断开连接,覆盖父类方法将不会触发事件。 + /// + /// + /// + protected virtual void OnDisconnected(TClient socketClient, DisconnectEventArgs e) + { + Disconnected?.Invoke(socketClient, e); + } + + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + /// + /// + protected virtual void OnDisconnecting(TClient socketClient, DisconnectEventArgs e) + { + Disconnecting?.Invoke(socketClient, e); + } + + /// + /// 当收到适配器数据。 + /// + /// + /// + /// + protected virtual void OnReceived(TClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo) + { + } + + #endregion 事件 + + /// + /// + /// + public override void Clear() + { + string[] ids = GetIDs(); + foreach (var item in ids) + { + if (TryGetSocketClient(item, out TClient client)) + { + client.Dispose(); + } + } + } + + /// + /// 获取当前在线的所有客户端 + /// + /// + public TClient[] GetClients() + { + var clients = m_socketClients.GetClients().ToArray(); + + TClient[] clients1 = new TClient[clients.Length]; + for (int i = 0; i < clients.Length; i++) + { + clients1[i] = (TClient)clients[i]; + } + return clients1; + } + + /// + /// + /// + /// + /// + /// + /// + public override void ResetID(string oldID, string newID) + { + if (string.IsNullOrEmpty(oldID)) + { + throw new ArgumentException($"“{nameof(oldID)}”不能为 null 或空。", nameof(oldID)); + } + + if (string.IsNullOrEmpty(newID)) + { + throw new ArgumentException($"“{nameof(newID)}”不能为 null 或空。", nameof(newID)); + } + + if (oldID == newID) + { + return; + } + if (m_socketClients.TryGetSocketClient(oldID, out TClient socketClient)) + { + socketClient.ResetID(newID); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(oldID)); + } + } + + /// + /// + /// + /// + public override IService Setup(TouchSocketConfig config) + { + m_config = config; + if (config.IsUsePlugin) + { + PluginsManager.Raise(nameof(IConfigPlugin.OnLoadingConfig), this, new ConfigEventArgs(config)); + } + LoadConfig(m_config); + if (UsePlugin) + { + PluginsManager.Raise(nameof(IConfigPlugin.OnLoadedConfig), this, new ConfigEventArgs(config)); + } + Container.RegisterTransient(); + return this; + } + + /// + /// + /// + /// + public override IService Setup(int port) + { + TouchSocketConfig serviceConfig = new TouchSocketConfig(); + serviceConfig.SetListenIPHosts(new IPHost[] { new IPHost(port) }); + return Setup(serviceConfig); + } + + /// + /// + /// + /// + /// + public override bool SocketClientExist(string id) + { + return SocketClients.SocketClientExist(id); + } + + /// + /// + /// + /// + /// + /// + public override IService Start() + { + try + { + IPHost[] iPHosts = Config.GetValue(TouchSocketConfigExtension.ListenIPHostsProperty); + if (iPHosts == null || iPHosts.Length == 0) + { + throw new Exception("IPHosts为空,无法绑定"); + } + switch (m_serverState) + { + case ServerState.None: + { + BeginListen(iPHosts); + break; + } + case ServerState.Running: + { + return this; + } + case ServerState.Stopped: + { + BeginListen(iPHosts); + break; + } + case ServerState.Disposed: + { + throw new Exception("无法重新利用已释放对象"); + } + } + m_serverState = ServerState.Running; + + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStarted), this, new ServiceStateEventArgs(this.m_serverState, default)); + } + return this; + } + catch (Exception ex) + { + m_serverState = ServerState.Exception; + + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStarted), this, new ServiceStateEventArgs(this.m_serverState, ex) { Message=ex.Message }); + } + throw; + } + } + + /// + /// + /// + public override IService Stop() + { + if (m_monitors != null) + { + foreach (var item in m_monitors) + { + item.Socket?.Dispose(); + } + } + m_monitors = null; + + Clear(); + + m_serverState = ServerState.Stopped; + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStoped), this, new ServiceStateEventArgs(this.m_serverState, default)); + } + return this; + } + + /// + /// 尝试获取TClient + /// + /// ID + /// TClient + /// + public bool TryGetSocketClient(string id, out TClient socketClient) + { + return m_socketClients.TryGetSocketClient(id, out socketClient); + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (!DisposedValue) + { + if (disposing) + { + if (m_monitors != null) + { + foreach (var item in m_monitors) + { + item.Socket?.Dispose(); + } + m_monitors = null; + } + Clear(); + m_serverState = ServerState.Disposed; + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStoped), this, new ServiceStateEventArgs(this.m_serverState, default)); + } + PluginsManager.Clear(); + } + } + + base.Dispose(disposing); + } + + /// + /// 初始化客户端实例,默认实现为 + /// + /// + protected virtual TClient GetClientInstence() + { + return Container.Resolve(); + } + + /// + /// 加载配置 + /// + /// + protected virtual void LoadConfig(TouchSocketConfig config) + { + if (config == null) + { + throw new Exception("配置文件为空"); + } + if (config.GetValue(TouchSocketConfigExtension.GetDefaultNewIDProperty) is Func fun) + { + m_getDefaultNewID = fun; + } + m_usePlugin = config.IsUsePlugin; + m_maxCount = config.GetValue(TouchSocketConfigExtension.MaxCountProperty); + m_backlog = config.GetValue(TouchSocketConfigExtension.BacklogProperty); + BufferLength = config.GetValue(TouchSocketConfigExtension.BufferLengthProperty); + m_receiveType = config.GetValue(TouchSocketConfigExtension.ReceiveTypeProperty); + + Logger ??= Container.Resolve(); + if (config.GetValue(TouchSocketConfigExtension.SslOptionProperty) != null) + { + m_useSsl = true; + } + } + + /// + /// 在验证Ssl发送错误时。 + /// + /// + protected virtual void OnAuthenticatingError(System.Exception ex) + { + } + + /// + /// 在Socket初始化对象后,Bind之前调用。 + /// 可用于设置Socket参数。 + /// 父类方法可覆盖。 + /// + /// + protected virtual void PreviewBind(Socket socket) + { + } + + private void Args_Completed(object sender, SocketAsyncEventArgs e) + { + if (e.LastOperation == SocketAsyncOperation.Accept) + { + OnAccepted(e); + } + } + + private void BeginListen(IPHost[] iPHosts) + { + int threadCount = Config.GetValue(TouchSocketConfigExtension.ThreadCountProperty); + if (threadCount > 0) + { + while (!ThreadPool.SetMinThreads(threadCount, threadCount)) + { + if (--threadCount <= 10) + { + break; + } + } + } + + List networkMonitors = new List(); + foreach (var iPHost in iPHosts) + { + Socket socket = new Socket(iPHost.AddressFamily, SocketType.Stream, ProtocolType.Tcp) + { + ReceiveBufferSize = BufferLength, + SendBufferSize = BufferLength + }; + if (m_config.GetValue(TouchSocketConfigExtension.ReuseAddressProperty)) + { + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + } + PreviewBind(socket); + socket.Bind(iPHost.EndPoint); + socket.Listen(m_backlog); + + networkMonitors.Add(new NetworkMonitor(iPHost, socket)); + } + + m_monitors = networkMonitors.ToArray(); + foreach (var networkMonitor in m_monitors) + { + SocketAsyncEventArgs e = new SocketAsyncEventArgs + { + UserToken = networkMonitor.Socket + }; + e.Completed += Args_Completed; + if (!networkMonitor.Socket.AcceptAsync(e)) + { + OnAccepted(e); + } + } + } + + private void OnAccepted(SocketAsyncEventArgs e) + { + if (!DisposedValue) + { + if (e.SocketError == SocketError.Success && e.AcceptSocket != null) + { + Socket socket = e.AcceptSocket; + socket.ReceiveBufferSize = BufferLength; + socket.SendBufferSize = BufferLength; + if (SocketClients.Count < m_maxCount) + { + SocketInit(socket); + } + else + { + socket.SafeDispose(); + Logger.Warning(this, "连接客户端数量已达到设定最大值"); + } + } + e.AcceptSocket = null; + + try + { + if (!((Socket)e.UserToken).AcceptAsync(e)) + { + OnAccepted(e); + } + } + catch + { + e.Dispose(); + return; + } + } + } + + private void SetClientConfiguration(SocketClient client) + { + client.m_usePlugin = m_usePlugin; + client.Config = m_config; + client.m_service = this; + client.Logger = Container.Resolve(); + client.m_receiveType = m_receiveType; + client.BufferLength = BufferLength; + if (client.CanSetDataHandlingAdapter) + { + client.SetDataHandlingAdapter(Config.GetValue(TouchSocketConfigExtension.DataHandlingAdapterProperty).Invoke()); + } + } + + private void SocketInit(Socket socket) + { + try + { + if (Config.GetValue(TouchSocketConfigExtension.NoDelayProperty)) + { + socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); + } + TClient client = GetClientInstence(); + SetClientConfiguration(client); + client.SetSocket(socket); + client.InternalInitialized(); + + OperationEventArgs args = new OperationEventArgs + { + ID = GetDefaultNewID() + }; + client.InternalConnecting(args);//Connecting + if (args.IsPermitOperation) + { + client.m_id = args.ID; + if (SocketClients.TryAdd(client)) + { + client.InternalConnected(new MsgEventArgs("客户端成功连接")); + if (!client.MainSocket.Connected) + { + return; + } + if (m_useSsl) + { + try + { + client.BeginReceiveSsl(m_receiveType, (ServiceSslOption)m_config.GetValue(TouchSocketConfigExtension.SslOptionProperty)); + } + catch (System.Exception ex) + { + OnAuthenticatingError(ex); + return; + } + } + else + { + client.BeginReceive(m_receiveType); + } + } + else + { + throw new Exception($"ID={client.m_id}重复"); + } + } + else + { + socket.SafeDispose(); + } + } + catch (Exception ex) + { + socket.SafeDispose(); + Logger.Log(LogType.Error, this, "接收新连接错误", ex); + } + } + } + + /// + /// TCP服务器 + /// + public class TcpService : TcpService + { + /// + /// 处理数据 + /// + public ReceivedEventHandler Received { get; set; } + + /// + /// + /// + /// + /// + /// + protected override void OnReceived(SocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo) + { + Received?.Invoke(socketClient, byteBlock, requestInfo); + base.OnReceived(socketClient, byteBlock, requestInfo); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs.meta new file mode 100644 index 0000000..4d7a05f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1e7854394672eb746bd0ee1faa5b97a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs new file mode 100644 index 0000000..c0c79dd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs @@ -0,0 +1,289 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Sockets +{ + /// + /// Tcp服务器基类 + /// + public abstract class TcpServiceBase : BaseSocket, ITcpService + { + /// + /// + /// + public abstract TouchSocketConfig Config { get; } + + /// + /// + /// + public abstract IContainer Container { get; } + + /// + /// + /// + public int Count => SocketClients.Count; + + /// + /// + /// + public abstract NetworkMonitor[] Monitors { get; } + + /// + /// 插件管理器 + /// + public abstract IPluginsManager PluginsManager { get; } + + /// + /// + /// + public abstract string ServerName { get; } + + /// + /// + /// + public abstract ServerState ServerState { get; } + + /// + /// + /// + public abstract SocketClientCollection SocketClients { get; } + + /// + /// + /// + public abstract bool UseSsl { get; } + + /// + /// + /// + public abstract Func GetDefaultNewID { get; } + + /// + /// + /// + public abstract int MaxCount { get; } + + /// + /// + /// + public abstract bool UsePlugin { get; } + + /// + /// + /// + public abstract void Clear(); + + /// + /// + /// + /// + public string[] GetIDs() + { + return SocketClients.GetIDs().ToArray(); + } + + /// + /// + /// + /// + /// + public abstract void ResetID(string oldID, string newID); + + /// + /// + /// + /// + /// + public abstract IService Setup(TouchSocketConfig serverConfig); + + /// + /// + /// + /// + /// + public abstract IService Setup(int port); + + /// + /// + /// + /// + public abstract IService Start(); + + /// + /// + /// + /// + public abstract IService Stop(); + + internal void OnInternalConnected(ISocketClient socketClient, TouchSocketEventArgs e) + { + OnClientConnected(socketClient, e); + } + + internal void OnInternalConnecting(ISocketClient socketClient, OperationEventArgs e) + { + OnClientConnecting(socketClient, e); + } + + internal void OnInternalDisconnected(ISocketClient socketClient, DisconnectEventArgs e) + { + OnClientDisconnected(socketClient, e); + } + + internal void OnInternalDisconnecting(ISocketClient socketClient, DisconnectEventArgs e) + { + OnClientDisconnecting(socketClient, e); + } + + internal void OnInternalReceivedData(ISocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo) + { + OnClientReceivedData(socketClient, byteBlock, requestInfo); + } + + /// + /// 客户端连接完成 + /// + /// + /// + protected abstract void OnClientConnected(ISocketClient socketClient, TouchSocketEventArgs e); + + /// + /// 客户端请求连接 + /// + /// + /// + protected abstract void OnClientConnecting(ISocketClient socketClient, OperationEventArgs e); + + /// + /// 客户端断开连接 + /// + /// + /// + protected abstract void OnClientDisconnected(ISocketClient socketClient, DisconnectEventArgs e); + + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + /// + /// + protected abstract void OnClientDisconnecting(ISocketClient socketClient, DisconnectEventArgs e); + + /// + /// 收到数据时 + /// + /// + /// + /// + protected abstract void OnClientReceivedData(ISocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo); + + #region ID发送 + + /// + /// 发送字节流 + /// + /// 用于检索TcpSocketClient + /// + /// + /// + /// + /// + /// + /// + public void Send(string id, byte[] buffer, int offset, int length) + { + if (SocketClients.TryGetSocketClient(id, out ISocketClient client)) + { + client.Send(buffer, offset, length); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(id)); + } + } + + /// + /// + /// + /// + /// + public void Send(string id, IRequestInfo requestInfo) + { + if (SocketClients.TryGetSocketClient(id, out ISocketClient client)) + { + client.Send(requestInfo); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(id)); + } + } + + /// + /// 发送字节流 + /// + /// 用于检索TcpSocketClient + /// + /// + /// + /// + /// + /// + /// + public Task SendAsync(string id, byte[] buffer, int offset, int length) + { + if (SocketClients.TryGetSocketClient(id, out ISocketClient client)) + { + return client.SendAsync(buffer, offset, length); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(id)); + } + } + + /// + /// + /// + /// + /// + public Task SendAsync(string id, IRequestInfo requestInfo) + { + if (SocketClients.TryGetSocketClient(id, out ISocketClient client)) + { + return client.SendAsync(requestInfo); + } + else + { + throw new ClientNotFindException(TouchSocketStatus.ClientNotFind.GetDescription(id)); + } + } + + /// + /// + /// + /// + /// + public abstract bool SocketClientExist(string id); + + #endregion ID发送 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs.meta new file mode 100644 index 0000000..384e555 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/TCP/TcpServiceBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7183a489ef8b39d42b46b92c7ab2c413 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP.meta new file mode 100644 index 0000000..99c38f3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1716cb3d62b54df4bb1ebc6a218f7eb5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs new file mode 100644 index 0000000..4e7d600 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs @@ -0,0 +1,885 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Sockets +{ + /// + /// 简单UDP会话。 + /// + public class UdpSession : UdpSessionBase + { + /// + /// 当收到数据时 + /// + public UdpReceivedEventHandler Received { get; set; } + + /// + /// + /// + /// + /// + /// + protected override void HandleReceivedData(EndPoint remoteEndPoint, ByteBlock byteBlock, IRequestInfo requestInfo) + { + Received?.Invoke(remoteEndPoint, byteBlock, requestInfo); + } + } + + /// + /// UDP基类服务器。 + /// + public class UdpSessionBase : BaseSocket, IUdpSession, IPluginObject + { + private readonly ConcurrentList m_socketAsyncs; + private TouchSocketConfig m_config; + private UdpDataHandlingAdapter m_adapter; + private NetworkMonitor m_monitor; + private IPHost m_remoteIPHost; + private ServerState m_serverState; + private bool m_usePlugin; + + /// + /// 构造函数 + /// + public UdpSessionBase() + { + m_socketAsyncs = new ConcurrentList(); + Protocol = Protocol.UDP; + Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + socket.ReceiveBufferSize = BufferLength; + socket.SendBufferSize = BufferLength; + m_monitor = new NetworkMonitor(null, socket); + } + + /// + /// 处理未经过适配器的数据。返回值表示是否继续向下传递。 + /// + public Func OnHandleRawBuffer { get; set; } + + /// + /// 处理经过适配器后的数据。返回值表示是否继续向下传递。 + /// + public Func OnHandleReceivedData { get; set; } + + /// + /// + /// + public bool CanSend => m_serverState == ServerState.Running; + + /// + /// + /// + public virtual bool CanSetDataHandlingAdapter => true; + + /// + /// 获取配置 + /// + public TouchSocketConfig Config => m_config; + + /// + /// + /// + public IContainer Container => m_config?.Container; + + /// + /// + /// + public DateTime LastReceivedTime { get; private set; } + + /// + /// + /// + public DateTime LastSendTime { get; private set; } + + /// + /// 数据处理适配器 + /// + public UdpDataHandlingAdapter DataHandlingAdapter => m_adapter; + + /// + /// 监听器 + /// + public NetworkMonitor Monitor => m_monitor; + + /// + /// + /// + public IPluginsManager PluginsManager => m_config?.PluginsManager; + + /// + /// + /// + public virtual Protocol Protocol { get; set; } + + /// + /// 默认远程节点 + /// + public IPHost RemoteIPHost => m_remoteIPHost; + + /// + /// 服务器名称 + /// + public string ServerName => Config?.GetValue(TouchSocketConfigExtension.ServerNameProperty); + + /// + /// 获取服务器状态 + /// + public ServerState ServerState => m_serverState; + + /// + /// 是否已启用插件 + /// + public bool UsePlugin => m_usePlugin; + + /// + /// 退出组播 + /// + /// + public void DropMulticastGroup(IPAddress multicastAddr) + { + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + + if (multicastAddr is null) + { + throw new ArgumentNullException(nameof(multicastAddr)); + } + + if (m_monitor.Socket.AddressFamily == AddressFamily.InterNetwork) + { + MulticastOption optionValue = new MulticastOption(multicastAddr); + m_monitor.Socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.DropMembership, optionValue); + } + else + { + IPv6MulticastOption optionValue2 = new IPv6MulticastOption(multicastAddr); + m_monitor.Socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.DropMembership, optionValue2); + } + } + + /// + /// 加入组播。 + /// 组播地址为 224.0.0.0 ~ 239.255.255.255,其中 224.0.0.0~224.255.255.255 不建议在用户程序中使用,因为它们一般都有特殊用途。 + /// + /// + public void JoinMulticastGroup(IPAddress multicastAddr) + { + if (multicastAddr is null) + { + throw new ArgumentNullException(nameof(multicastAddr)); + } + if (DisposedValue) + { + throw new ObjectDisposedException(GetType().FullName); + } + + if (m_monitor.Socket.AddressFamily == AddressFamily.InterNetwork) + { + MulticastOption optionValue = new MulticastOption(multicastAddr); + m_monitor.Socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, optionValue); + } + else + { + IPv6MulticastOption optionValue2 = new IPv6MulticastOption(multicastAddr); + m_monitor.Socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.AddMembership, optionValue2); + } + } + + /// + /// 设置数据处理适配器 + /// + /// + public virtual void SetDataHandlingAdapter(UdpDataHandlingAdapter adapter) + { + if (!CanSetDataHandlingAdapter) + { + throw new Exception($"不允许自由调用{nameof(SetDataHandlingAdapter)}进行赋值。"); + } + + SetAdapter(adapter); + } + + /// + /// + /// + /// + /// + public IService Setup(TouchSocketConfig config) + { + m_config = config; + if (config.IsUsePlugin) + { + PluginsManager.Raise(nameof(IConfigPlugin.OnLoadingConfig), this, new ConfigEventArgs(config)); + } + LoadConfig(m_config); + if (UsePlugin) + { + PluginsManager.Raise(nameof(IConfigPlugin.OnLoadedConfig), this, new ConfigEventArgs(config)); + } + return this; + } + + /// + /// 通过端口配置 + /// + /// + public IService Setup(int port) + { + TouchSocketConfig serverConfig = new TouchSocketConfig(); + serverConfig.SetBindIPHost(new IPHost(port)); + return Setup(serverConfig); + } + + /// + /// 启动服务 + /// + public IService Start() + { + try + { + if (m_serverState == ServerState.Disposed) + { + throw new Exception("无法重新利用已释放对象"); + } + + switch (m_serverState) + { + case ServerState.None: + { + if (m_config.GetValue(TouchSocketConfigExtension.BindIPHostProperty) is IPHost iPHost) + { + BeginReceive(iPHost); + } + + break; + } + case ServerState.Running: + return this; + + case ServerState.Stopped: + { + if (m_config.GetValue(TouchSocketConfigExtension.BindIPHostProperty) is IPHost iPHost) + { + BeginReceive(iPHost); + } + break; + } + case ServerState.Disposed: + { + throw new Exception("无法再次利用已释放对象"); + } + } + + m_serverState = ServerState.Running; + + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStarted), this, new ServiceStateEventArgs(this.m_serverState, default)); + } + return this; + } + catch (Exception ex) + { + m_serverState = ServerState.Exception; + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStarted), this, new ServiceStateEventArgs(this.m_serverState, ex) { Message = ex.Message }) ; + } + throw; + } + + } + + /// + /// 停止服务器 + /// + public IService Stop() + { + m_monitor?.Socket.Dispose(); + m_monitor = null; + m_serverState = ServerState.Stopped; + foreach (var item in m_socketAsyncs) + { + item.SafeDispose(); + } + m_socketAsyncs.Clear(); + + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStarted), this, new ServiceStateEventArgs(this.m_serverState, default)); + } + return this; + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + if (!this.DisposedValue) + { + if (disposing) + { + m_monitor?.Socket.Dispose(); + m_monitor = null; + m_serverState = ServerState.Disposed; + foreach (var item in m_socketAsyncs) + { + item.SafeDispose(); + } + m_socketAsyncs.Clear(); + + if (UsePlugin) + { + PluginsManager.Raise(nameof(IServicePlugin.OnStarted), this, new ServiceStateEventArgs(this.m_serverState, default)); + } + } + } + base.Dispose(disposing); + } + + /// + /// 处理已接收到的数据。 + /// + /// + /// 以二进制流形式传递 + /// 以解析的数据对象传递 + protected virtual void HandleReceivedData(EndPoint remoteEndPoint, ByteBlock byteBlock, IRequestInfo requestInfo) + { + } + + /// + /// 当即将发送时,如果覆盖父类方法,则不会触发插件。 + /// + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 返回值表示是否允许发送 + protected virtual bool HandleSendingData(EndPoint endPoint, byte[] buffer, int offset, int length) + { + return true; + } + + /// + /// 加载配置 + /// + /// + protected virtual void LoadConfig(TouchSocketConfig config) + { + if (config == null) + { + throw new Exception("配置文件为空"); + } + Logger = Container.Resolve(); + m_remoteIPHost = config.GetValue(TouchSocketConfigExtension.RemoteIPHostProperty); + BufferLength = config.GetValue(TouchSocketConfigExtension.BufferLengthProperty); + m_usePlugin = config.IsUsePlugin; + + if (CanSetDataHandlingAdapter) + { + SetDataHandlingAdapter(Config.GetValue(TouchSocketConfigExtension.UdpDataHandlingAdapterProperty).Invoke()); + } + } + + /// + /// 在Socket初始化对象后,Bind之前调用。 + /// 可用于设置Socket参数。 + /// 父类方法可覆盖。 + /// + /// + protected virtual void PreviewBind(Socket socket) + { + } + + /// + /// 设置适配器,该方法不会检验的值。 + /// + /// + protected void SetAdapter(UdpDataHandlingAdapter adapter) + { + if (adapter is null) + { + throw new ArgumentNullException(nameof(adapter)); + } + + if (adapter.m_owner != null) + { + throw new Exception("此适配器已被其他终端使用,请重新创建对象。"); + } + + if (Config != null) + { + if (Config.GetValue(TouchSocketConfigExtension.MaxPackageSizeProperty) is int v1) + { + adapter.MaxPackageSize = v1; + } + } + adapter.m_owner = this; + adapter.ReceivedCallBack = PrivateHandleReceivedData; + adapter.SendCallBack = DefaultSend; + m_adapter = adapter; + } + + private void BeginReceive(IPHost iPHost) + { + int threadCount = Config.GetValue(TouchSocketConfigExtension.ThreadCountProperty); + threadCount = threadCount < 0 ? 1 : threadCount; + Socket socket = new Socket(iPHost.AddressFamily, SocketType.Dgram, ProtocolType.Udp) + { + ReceiveBufferSize = BufferLength, + SendBufferSize = BufferLength, + EnableBroadcast = m_config.GetValue(TouchSocketConfigExtension.EnableBroadcastProperty) + }; + if (m_config.GetValue(TouchSocketConfigExtension.ReuseAddressProperty)) + { + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + } + PreviewBind(socket); + + #region Windows下UDP连接被重置错误10054 + +#if NET45_OR_GREATER + const int SIP_UDP_CONNRESET = -1744830452; + socket.IOControl(SIP_UDP_CONNRESET, new byte[] { 0, 0, 0, 0 }, null); +#else + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + const int SIP_UDP_CONNRESET = -1744830452; + socket.IOControl(SIP_UDP_CONNRESET, new byte[] { 0, 0, 0, 0 }, null); + } +#endif + + #endregion + + socket.Bind(iPHost.EndPoint); + + m_monitor = new NetworkMonitor(iPHost, socket); + + switch (m_config.GetValue(TouchSocketConfigExtension.ReceiveTypeProperty)) + { + case ReceiveType.Auto: + { +#if NET45_OR_GREATER||NET5_0_OR_GREATER + for (int i = 0; i < threadCount; i++) + { + SocketAsyncEventArgs eventArg = new SocketAsyncEventArgs(); + m_socketAsyncs.Add(eventArg); + eventArg.Completed += IO_Completed; + ByteBlock byteBlock = new ByteBlock(BufferLength); + eventArg.UserToken = byteBlock; + eventArg.SetBuffer(byteBlock.Buffer, 0, byteBlock.Capacity); + eventArg.RemoteEndPoint = iPHost.EndPoint; + if (!socket.ReceiveFromAsync(eventArg)) + { + ProcessReceive(socket, eventArg); + } + } +#else + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + for (int i = 0; i < threadCount; i++) + { + SocketAsyncEventArgs eventArg = new SocketAsyncEventArgs(); + m_socketAsyncs.Add(eventArg); + eventArg.Completed += IO_Completed; + ByteBlock byteBlock = new ByteBlock(BufferLength); + eventArg.UserToken = byteBlock; + eventArg.SetBuffer(byteBlock.Buffer, 0, byteBlock.Capacity); + eventArg.RemoteEndPoint = iPHost.EndPoint; + if (!socket.ReceiveFromAsync(eventArg)) + { + ProcessReceive(socket, eventArg); + } + } + } + else + { + Thread thread = new Thread(Received); + thread.IsBackground = true; + thread.Start(); + } +#endif + break; + } + default: + throw new Exception("UDP中只支持Auto模式"); + } + } + + private void Received() + { + while (true) + { + ByteBlock byteBlock = new ByteBlock(); + try + { + EndPoint endPoint = m_monitor.IPHost.EndPoint; + int r = m_monitor.Socket.ReceiveFrom(byteBlock.Buffer, ref endPoint); + byteBlock.SetLength(r); + HandleBuffer(endPoint, byteBlock); + } + catch (Exception ex) + { + byteBlock.Dispose(); + Logger.Log(LogType.Error, this, ex.Message, ex); + break; + } + } + } + + private void HandleBuffer(EndPoint endPoint, ByteBlock byteBlock) + { + try + { + LastReceivedTime = DateTime.Now; + if (OnHandleRawBuffer?.Invoke(byteBlock) == false) + { + return; + } + if (DisposedValue) + { + return; + } + if (m_adapter == null) + { + Logger.Error(this, TouchSocketStatus.NullDataAdapter.GetDescription()); + return; + } + m_adapter.ReceivedInput(endPoint, byteBlock); + } + catch (Exception ex) + { + Logger.Log(LogType.Error, this, "在处理数据时发生错误", ex); + } + finally + { + byteBlock.Dispose(); + } + } + + private void IO_Completed(object sender, SocketAsyncEventArgs e) + { + ProcessReceive((Socket)sender, e); + } + + private void PrivateHandleReceivedData(EndPoint remoteEndPoint, ByteBlock byteBlock, IRequestInfo requestInfo) + { + if (OnHandleReceivedData?.Invoke(byteBlock, requestInfo) == false) + { + return; + } + + if (m_usePlugin) + { + UdpReceivedDataEventArgs args = new UdpReceivedDataEventArgs(remoteEndPoint, byteBlock, requestInfo); + PluginsManager.Raise(nameof(IUdpSessionPlugin.OnReceivedData), this, args); + if (args.Handled) + { + return; + } + } + HandleReceivedData(remoteEndPoint, byteBlock, requestInfo); + } + + #region 向默认远程同步发送 + + /// + /// 向默认终结点发送 + /// + /// + /// + /// + public virtual void Send(byte[] buffer, int offset, int length) + { + if (m_remoteIPHost == null) + { + throw new Exception("默认终结点为空"); + } + Send(m_remoteIPHost.EndPoint, buffer, offset, length); + } + + /// + /// + /// + /// + /// + /// + public virtual void Send(IRequestInfo requestInfo) + { + if (DisposedValue) + { + return; + } + if (m_adapter == null) + { + throw new ArgumentNullException(nameof(DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + if (!m_adapter.CanSendRequestInfo) + { + throw new NotSupportedException($"当前适配器不支持对象发送。"); + } + m_adapter.SendInput(requestInfo); + } + + #endregion 向默认远程同步发送 + + #region 向默认远程异步发送 + + /// + /// IOCP发送 + /// + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + Send(buffer, offset, length); + }); + } + + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(IRequestInfo requestInfo) + { + return EasyTask.Run(() => + { + Send(requestInfo); + }); + } + + #endregion 向默认远程异步发送 + + #region 向设置的远程同步发送 + + /// + /// 向设置的远程同步发送 + /// + /// + /// + /// + /// + /// + /// + /// + public virtual void Send(EndPoint remoteEP, byte[] buffer, int offset, int length) + { + m_adapter.SendInput(remoteEP, buffer, offset, length); + } + + #endregion 向设置的远程同步发送 + + #region 向设置的远程异步发送 + + /// + /// 向设置的远程异步发送 + /// + /// + /// + /// + /// + /// + /// + /// + public virtual Task SendAsync(EndPoint remoteEP, byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + Send(remoteEP, buffer, offset, length); + }); + } + + #endregion 向设置的远程异步发送 + + private void ProcessReceive(Socket socket, SocketAsyncEventArgs e) + { + if (m_serverState == ServerState.Running && e.SocketError == SocketError.Success) + { + ByteBlock byteBlock = (ByteBlock)e.UserToken; + byteBlock.SetLength(e.BytesTransferred); + + HandleBuffer(e.RemoteEndPoint, byteBlock); + + ByteBlock newByteBlock = new ByteBlock(BufferLength); + e.UserToken = newByteBlock; + e.SetBuffer(newByteBlock.Buffer, 0, newByteBlock.Buffer.Length); + + try + { + if (!socket.ReceiveFromAsync(e)) + { + ProcessReceive(socket, e); + } + } + catch (System.Exception ex) + { + Logger.Log(LogType.Error, this, ex.Message, ex); + } + } + else + { + if (e.SocketError != SocketError.Success) + { + Logger?.Error(this, $"接收出现错误:{e.SocketError},错误代码:{(int)e.SocketError}"); + e.Dispose(); + } + } + } + + #region DefaultSend + + /// + /// + /// + /// + /// + /// + public void DefaultSend(byte[] buffer, int offset, int length) + { + DefaultSend(m_remoteIPHost.EndPoint, buffer, offset, length); + } + + /// + /// + /// + /// + /// + /// + /// + public void DefaultSend(EndPoint endPoint, byte[] buffer, int offset, int length) + { + if (HandleSendingData(endPoint, buffer, offset, length)) + { + if (CanSend) + { + m_monitor.Socket.SendTo(buffer, offset, length, SocketFlags.None, endPoint); + } + + LastSendTime = DateTime.Now; + } + } + + #endregion DefaultSend + + #region DefaultSendAsync + + /// + /// + /// + /// + /// + /// + public Task DefaultSendAsync(byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + DefaultSend(buffer, offset, length); + }); + } + + /// + /// + /// + /// + /// + /// + /// + public Task DefaultSendAsync(EndPoint endPoint, byte[] buffer, int offset, int length) + { + return EasyTask.Run(() => + { + DefaultSend(buffer, offset, length); + }); + } + + #endregion DefaultSendAsync + + #region 组合发送 + + /// + /// + /// + /// + public void Send(IList> transferBytes) + { + Send(m_remoteIPHost.EndPoint, transferBytes); + } + + /// + /// + /// + /// + /// + public void Send(EndPoint endPoint, IList> transferBytes) + { + if (m_adapter == null) + { + throw new ArgumentNullException(nameof(DataHandlingAdapter), TouchSocketStatus.NullDataAdapter.GetDescription()); + } + + if (!m_adapter.CanSplicingSend) + { + throw new NotSupportedException("该适配器不支持拼接发送"); + } + m_adapter.SendInput(endPoint, transferBytes); + } + + /// + /// + /// + /// + public Task SendAsync(IList> transferBytes) + { + return EasyTask.Run(() => + { + Send(transferBytes); + }); + } + + /// + /// + /// + /// + /// + public Task SendAsync(EndPoint endPoint, IList> transferBytes) + { + return EasyTask.Run(() => + { + Send(endPoint, transferBytes); + }); + } + + #endregion 组合发送 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs.meta new file mode 100644 index 0000000..5c7283a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Components/UDP/UdpSession.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a963cdb5d8f390c40b38232f94e31525 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config.meta new file mode 100644 index 0000000..1abc297 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9bd549a11ba28534a945fd2766222d0b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs new file mode 100644 index 0000000..31fafa4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs @@ -0,0 +1,623 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Security.Authentication; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// TouchSocketConfigBuilder配置扩展 + /// + public static class TouchSocketConfigExtension + { + #region 数据 + + /// + /// 接收缓存容量,默认1024*64,其作用有两个: + /// + /// 指示单次可接受的最大数据量 + /// 指示常规申请内存块的长度 + /// + /// 所需类型 + /// + public static readonly DependencyProperty BufferLengthProperty = + DependencyProperty.Register("BufferLength", typeof(TouchSocketConfigExtension), 1024 * 64); + + /// + /// 数据处理适配器,默认为获取 + /// 所需类型 + /// + public static readonly DependencyProperty> DataHandlingAdapterProperty = DependencyProperty>.Register("DataHandlingAdapter", typeof(TouchSocketConfigExtension), (Func)(() => { return new NormalDataHandlingAdapter(); })); + + /// + /// 接收类型,默认为 + /// 为自动接收数据,然后主动触发。 + /// 为不投递IO接收申请,用户可通过,获取到流以后,自己处理接收。注意:连接端不会感知主动断开 + /// 所需类型 + /// + public static readonly DependencyProperty ReceiveTypeProperty = DependencyProperty.Register("ReceiveType", typeof(TouchSocketConfigExtension), ReceiveType.Auto); + + /// + /// 数据处理适配器,默认为获取 + /// 所需类型 + /// + public static readonly DependencyProperty> UdpDataHandlingAdapterProperty = DependencyProperty>.Register("UdpDataHandlingAdapter", typeof(TouchSocketConfigExtension), (Func)(() => { return new NormalUdpDataHandlingAdapter(); })); + + /// + /// 接收缓存容量,默认1024*64,其作用有两个: + /// + /// 指示单次可接受的最大数据量 + /// 指示常规申请内存块的长度 + /// + /// + /// + /// + /// + public static TouchSocketConfig SetBufferLength(this TouchSocketConfig config, int value) + { + config.SetValue(BufferLengthProperty, value); + return config; + } + + /// + /// 设置(Tcp系)数据处理适配器。 + /// + /// + /// + /// + public static TouchSocketConfig SetDataHandlingAdapter(this TouchSocketConfig config, Func value) + { + config.SetValue(DataHandlingAdapterProperty, value); + return config; + } + + /// + /// 接收类型,默认为 + /// 为自动接收数据,然后主动触发。 + /// 为不投递IO接收申请,用户可通过,获取到流以后,自己处理接收。注意:连接端不会感知主动断开 + /// + /// + /// + /// + public static TouchSocketConfig SetReceiveType(this TouchSocketConfig config, ReceiveType value) + { + config.SetValue(ReceiveTypeProperty, value); + return config; + } + + /// + /// 设置(Udp系)数据处理适配器。 + /// + /// + /// + /// + public static TouchSocketConfig SetUdpDataHandlingAdapter(this TouchSocketConfig config, Func value) + { + config.SetValue(UdpDataHandlingAdapterProperty, value); + return config; + } + + #endregion 数据 + + #region ServiceBase + + /// + /// 服务名称,用于标识,无实际意义,所需类型 + /// + public static readonly DependencyProperty ServerNameProperty = DependencyProperty.Register("ServerName", typeof(TouchSocketConfigExtension), "TouchSocketServer"); + + /// + /// 多线程数量。默认-1缺省。 + /// TCP模式中,该值等效于 + /// UDP模式中,该值为重叠IO并发数 + /// 所需类型 + /// + public static readonly DependencyProperty ThreadCountProperty = DependencyProperty.Register("ThreadCount", typeof(TouchSocketConfigExtension), -1); + + /// + /// 服务名称,用于标识,无实际意义 + /// + /// + /// + /// + public static TouchSocketConfig SetServerName(this TouchSocketConfig config, string value) + { + config.SetValue(ServerNameProperty, value); + return config; + } + + /// + /// 多线程数量,默认为-1缺省,实际上在tcp中相当于值10,udp中相当于1。 + /// TCP模式中,该值等效于 + /// UDP模式中,该值为重叠IO并发数 + /// + /// + /// + /// + public static TouchSocketConfig SetThreadCount(this TouchSocketConfig config, int value) + { + config.SetValue(ThreadCountProperty, value); + return config; + } + + #endregion ServiceBase + + #region 适配器配置 + + /// + /// 适配器数据包缓存启用。默认为缺省(null),如果有正常值会在设置适配器时,直接作用于 + /// + public static readonly DependencyProperty CacheTimeoutEnableProperty = DependencyProperty.Register("CacheTimeoutEnable", typeof(TouchSocketConfigExtension), null); + + /// + /// 适配器数据包缓存启用。默认为缺省(null),如果有正常值会在设置适配器时,直接作用于 + /// + /// + /// + /// + public static TouchSocketConfig SetCacheTimeoutEnable(this TouchSocketConfig config, bool value) + { + config.SetValue(CacheTimeoutEnableProperty, value); + return config; + } + + /// + /// 适配器数据包缓存时长。默认为缺省()。当该值有效时会在设置适配器时,直接作用于 + /// + public static readonly DependencyProperty CacheTimeoutProperty = DependencyProperty.Register("CacheTimeout", typeof(TouchSocketConfigExtension), TimeSpan.Zero); + + /// + /// 适配器数据包缓存时长。默认为缺省()。当该值有效时会在设置适配器时,直接作用于 + /// + /// + /// + /// + public static TouchSocketConfig SetCacheTimeout(this TouchSocketConfig config, TimeSpan value) + { + config.SetValue(CacheTimeoutProperty, value); + return config; + } + + /// + /// 适配器数据包缓存策略。默认缺省(null),当该值有效时会在设置适配器时,直接作用于 + /// + public static readonly DependencyProperty UpdateCacheTimeWhenRevProperty = DependencyProperty.Register("UpdateCacheTimeWhenRev", typeof(TouchSocketConfigExtension), null); + + /// + /// 适配器数据包缓存策略。默认缺省(null),当该值有效时会在设置适配器时,直接作用于 + /// + /// + /// + /// + public static TouchSocketConfig SetUpdateCacheTimeWhenRev(this TouchSocketConfig config, bool value) + { + config.SetValue(UpdateCacheTimeWhenRevProperty, value); + return config; + } + + /// + /// 适配器数据包最大值。默认缺省(null),当该值有效时会在设置适配器时,直接作用于 + /// + public static readonly DependencyProperty MaxPackageSizeProperty = DependencyProperty.Register("MaxPackageSize", typeof(TouchSocketConfigExtension), null); + + /// + /// 适配器数据包最大值。默认缺省(null),当该值有效时会在设置适配器时,直接作用于 + /// + /// + /// + /// + public static TouchSocketConfig SetMaxPackageSize(this TouchSocketConfig config, int value) + { + config.SetValue(MaxPackageSizeProperty, value); + return config; + } + + #endregion 适配器配置 + + #region TcpClient + + /// + /// TCP固定端口绑定, + /// 所需类型 + /// + public static readonly DependencyProperty BindIPHostProperty = DependencyProperty.Register("BindIPHost", typeof(TouchSocketConfigExtension), null); + + /// + /// 在Socket配置KeepAlive属性,这个是操作tcp底层的,如果你对底层不了解,建议不要动。 + /// 所需类型 + /// + public static readonly DependencyProperty KeepAliveValueProperty = DependencyProperty.Register("KeepAliveValue", typeof(TouchSocketConfigExtension), new KeepAliveValue()); + + /// + /// 设置Socket不使用Delay算法, + /// 所需类型 + /// + public static readonly DependencyProperty NoDelayProperty = DependencyProperty.Register("NoDelay", typeof(TouchSocketConfigExtension), false); + + /// + /// 远程目标地址,所需类型 + /// + public static readonly DependencyProperty RemoteIPHostProperty = DependencyProperty.Register("RemoteIPHost", typeof(TouchSocketConfigExtension), null); + + /// + /// Ssl配置,为Null时则不启用 + /// 所需类型 + /// + public static readonly DependencyProperty SslOptionProperty = DependencyProperty.Register("SslOption", typeof(TouchSocketConfigExtension), null); + + /// + /// 是否使用延迟合并发送。默认null。不开启 + /// 所需类型 + /// + public static readonly DependencyProperty DelaySenderProperty = DependencyProperty.Register("DelaySender", typeof(TouchSocketConfigExtension), null); + + /// + /// 使用默认配置延迟合并发送。 + /// 所需类型 + /// + /// + /// + /// + public static TouchSocketConfig UseDelaySender(this TouchSocketConfig config, DelaySenderOption option = default) + { + if (option == default) + { + option = new DelaySenderOption(); + } + config.SetValue(DelaySenderProperty, option); + return config; + } + + /// + /// 固定端口绑定。 + /// 中表示本地监听地址 + /// 中表示固定客户端端口号。 + /// + /// + /// + /// + public static TouchSocketConfig SetBindIPHost(this TouchSocketConfig config, IPHost value) + { + config.SetValue(BindIPHostProperty, value); + return config; + } + + /// + /// 固定端口绑定。 + /// 中表示本地监听地址 + /// 中表示固定客户端端口号。 + /// + /// + /// + /// + public static TouchSocketConfig SetBindIPHost(this TouchSocketConfig config, int value) + { + config.SetValue(BindIPHostProperty, new IPHost(value)); + return config; + } + + /// + /// 固定端口绑定。 + /// 中表示本地监听地址 + /// 中表示固定客户端端口号。 + /// + /// + /// + /// + public static TouchSocketConfig SetBindIPHost(this TouchSocketConfig config, string value) + { + config.SetValue(BindIPHostProperty, new IPHost(value)); + return config; + } + + /// + /// 设置客户端Ssl配置,为Null时则不启用。 + /// + /// + /// + /// + public static TouchSocketConfig SetClientSslOption(this TouchSocketConfig config, ClientSslOption value) + { + config.SetValue(SslOptionProperty, value); + return config; + } + + /// + /// 在Socket的KeepAlive属性。 + /// 注意:这个是操作tcp底层的,如果你对底层不了解,建议不要动。 + /// + /// + /// + /// + public static TouchSocketConfig SetKeepAliveValue(this TouchSocketConfig config, KeepAliveValue value) + { + config.SetValue(KeepAliveValueProperty, value); + return config; + } + + /// + /// 设置远程目标地址。在中,表示默认发送时的目标地址。 + /// + /// + /// + /// + public static TouchSocketConfig SetRemoteIPHost(this TouchSocketConfig config, IPHost value) + { + config.SetValue(RemoteIPHostProperty, value); + if (value.IsUri) + { + if (value.Uri.Scheme.Equals("https", StringComparison.CurrentCultureIgnoreCase) + || value.Uri.Scheme.Equals("wss", StringComparison.CurrentCultureIgnoreCase) + || value.Uri.Scheme.Equals("ssl", StringComparison.CurrentCultureIgnoreCase) + || value.Uri.Scheme.Equals("tls", StringComparison.CurrentCultureIgnoreCase)) + { + config.SetClientSslOption(new ClientSslOption() + { + TargetHost = value.Host + }); + } + } + return config; + } + + /// + /// 设置远程目标地址。在中,表示默认发送时的目标地址。 + /// + /// + /// + /// + public static TouchSocketConfig SetRemoteIPHost(this TouchSocketConfig config, string value) + { + return SetRemoteIPHost(config, new IPHost(value)); + } + + /// + /// 设置Socket的NoDelay属性,默认false。 + /// + /// + /// + public static TouchSocketConfig UseNoDelay(this TouchSocketConfig config) + { + config.SetValue(NoDelayProperty, true); + return config; + } + + #endregion TcpClient + + #region TcpService + + /// + /// 挂起连接队列的最大长度,所需类型 + /// + public static readonly DependencyProperty BacklogProperty = DependencyProperty.Register("Backlog", typeof(TouchSocketConfigExtension), 100); + + /// + /// 设置默认ID的获取方式,所需类型 + /// + public static readonly DependencyProperty> GetDefaultNewIDProperty = DependencyProperty>.Register("GetDefaultNewID", typeof(TouchSocketConfigExtension), null); + + /// + /// 服务器负责监听的地址组。所需类型数组 + /// + public static readonly DependencyProperty ListenIPHostsProperty = DependencyProperty.Register("ListenIPHosts", typeof(TouchSocketConfigExtension), null); + + /// + /// 最大可连接数,默认为10000,所需类型 + /// + public static readonly DependencyProperty MaxCountProperty = DependencyProperty.Register("MaxCount", typeof(TouchSocketConfigExtension), 10000); + + /// + /// 端口复用,默认为false,所需类型 + /// + public static readonly DependencyProperty ReuseAddressProperty = DependencyProperty.Register("ReuseAddress", typeof(TouchSocketConfigExtension), false); + + /// + /// 启用端口复用。 + /// 该配置可在服务器、或客户端在监听端口时,运行监听同一个端口。可以一定程度缓解端口来不及释放的问题 + /// + /// + /// + public static TouchSocketConfig UseReuseAddress(this TouchSocketConfig config) + { + config.SetValue(ReuseAddressProperty, true); + return config; + } + + /// + /// 挂起连接队列的最大长度,默认100。 + /// + /// + /// + /// + public static TouchSocketConfig SetBacklog(this TouchSocketConfig config, int value) + { + config.SetValue(BacklogProperty, value); + return config; + } + + /// + /// 设置清理无数据交互的SocketClient,默认60*1000 ms。如果不想清除,可使用-1 + /// + /// + /// + /// + [Obsolete("该操作已被弃用,请使用CheckClearPlugin插件,或者在插件中,配置UseCheckClear。", true)] + public static TouchSocketConfig SetClearInterval(this TouchSocketConfig config, int value) + { + throw new NotImplementedException(); + } + + /// + /// 清理统计类型。 + /// 为在收到数据时,刷新统计,如果一直有数据接收,则不会被主动清理断开 + /// 为在发送数据时,刷新统计,如果一直有数据发送,则不会被主动清理断开 + /// 二者可叠加使用。 + /// + /// + /// + /// + [Obsolete("该操作已被弃用,请使用CheckClearPlugin插件,或者在插件中,配置UseCheckClear。", true)] + public static TouchSocketConfig SetClearType(this TouchSocketConfig config, CheckClearType value) + { + throw new NotImplementedException(); + } + + /// + /// 设置默认ID的获取方式。仅服务器生效。 + /// + /// + /// + /// + public static TouchSocketConfig SetGetDefaultNewID(this TouchSocketConfig config, Func value) + { + config.SetValue(GetDefaultNewIDProperty, value); + return config; + } + + /// + /// 服务器负责监听的地址组。 + /// + /// + /// + /// + public static TouchSocketConfig SetListenIPHosts(this TouchSocketConfig config, IPHost[] value) + { + config.SetValue(ListenIPHostsProperty, value); + return config; + } + + /// + /// 最大可连接数,默认为10000。 + /// + /// + /// + /// + public static TouchSocketConfig SetMaxCount(this TouchSocketConfig config, int value) + { + config.SetValue(MaxCountProperty, value); + return config; + } + + /// + /// 设置客户端Ssl配置,为Null时则不启用。 + /// + /// + /// + /// + public static TouchSocketConfig SetServiceSslOption(this TouchSocketConfig config, ServiceSslOption value) + { + config.SetValue(SslOptionProperty, value); + return config; + } + + #endregion TcpService + + #region UDP + + /// + /// 该值指定 System.Net.Sockets.Socket可以发送或接收广播数据包。 + /// + public static readonly DependencyProperty EnableBroadcastProperty = DependencyProperty.Register("EnableBroadcast", typeof(TouchSocketConfigExtension), false); + + /// + /// 该值指定 System.Net.Sockets.Socket可以发送或接收广播数据包。 + /// + /// + /// + public static TouchSocketConfig UseBroadcast(this TouchSocketConfig config) + { + config.SetValue(EnableBroadcastProperty, true); + return config; + } + + #endregion UDP + + #region 创建 + + /// + /// 构建Tcp类客户端,并连接 + /// + /// + /// + /// + public static TClient BuildWithTcpClient(this TouchSocketConfig config) where TClient : ITcpClient + { + TClient service = config.Container.Resolve(); + service.Setup(config); + service.Connect(); + return service; + } + + /// + /// 构建Tcp类客户端,并连接 + /// + /// + /// + public static TcpClient BuildWithTcpClient(this TouchSocketConfig config) + { + return BuildWithTcpClient(config); + } + + /// + /// 构建Tcp类服务器,并启动。 + /// + /// + /// + /// + public static TService BuildWithTcpService(this TouchSocketConfig config) where TService : ITcpService + { + TService service = config.Container.Resolve(); + service.Setup(config); + service.Start(); + return service; + } + + /// + /// 构建Tcp类服务器,并启动。 + /// + /// + /// + public static TcpService BuildWithTcpService(this TouchSocketConfig config) + { + return BuildWithTcpService(config); + } + + /// + /// 构建UDP类,并启动。 + /// + /// + /// + /// + public static TSession BuildWithUdpSession(this TouchSocketConfig config) where TSession : IUdpSession + { + TSession service = config.Container.Resolve(); + service.Setup(config); + service.Start(); + return service; + } + + /// + /// 构建UDP类,并启动。 + /// + /// + /// + public static UdpSession BuildWithUdpSession(this TouchSocketConfig config) + { + return BuildWithUdpSession(config); + } + + #endregion 创建 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs.meta new file mode 100644 index 0000000..3b6f646 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Config/TouchSocketConfigExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 51b1c0408ee3f1a45be445f1023576a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter.meta new file mode 100644 index 0000000..77ae1fa --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f0b939ea3e5496145823494929a2976a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs new file mode 100644 index 0000000..a4f3097 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// CacheDataHandlingAdapter + /// + public abstract class CacheDataHandlingAdapter : DataHandlingAdapter + { + /// + /// 缓存数据,如果需要手动释放,请先判断,然后到调用后,再置空; + /// + protected ByteBlock m_cacheByteBlock; + + /// + /// 将数据缓存起来 + /// + /// + /// + /// + protected void Cache(byte[] buffer, int offset, int length) + { + this.m_cacheByteBlock ??= new ByteBlock(length); + this.m_cacheByteBlock.Write(buffer, offset, length); + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + } + + /// + /// + /// + protected override void Reset() + { + this.m_cacheByteBlock.SafeDispose(); + this.m_cacheByteBlock = null; + base.Reset(); + } + + /// + /// 获取当前缓存, + /// 如果缓存超时,或者不存在,均会返回false。 + /// 如果获取成功,则会清空内部缓存。 + /// + /// + protected bool TryGetCache(out byte[] buffer) + { + if (this.m_cacheByteBlock == null) + { + buffer = null; + return false; + } + if (DateTime.Now - this.LastCacheTime > this.CacheTimeout) + { + this.m_cacheByteBlock.SafeDispose(); + this.m_cacheByteBlock = null; + buffer = null; + return false; + } + buffer = this.m_cacheByteBlock.ToArray(); + this.m_cacheByteBlock.SafeDispose(); + this.m_cacheByteBlock = null; + return true; + } + + /// + /// 获取缓存,注意:获取的ByteBlock需要手动释放。 + /// + /// + /// + protected bool TryGetCache(out ByteBlock byteBlock) + { + if (this.m_cacheByteBlock == null) + { + byteBlock = null; + return false; + } + if (DateTime.Now - this.LastCacheTime > this.CacheTimeout) + { + this.m_cacheByteBlock.SafeDispose(); + this.m_cacheByteBlock = null; + byteBlock = null; + return false; + } + byteBlock = this.m_cacheByteBlock; + return true; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..e1694a7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/CacheDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1223e146cbab3ff48971ce8cbe0eb847 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom.meta new file mode 100644 index 0000000..c77e5c8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 321acbfa9eb66eb4c8fc219587f0ec65 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs new file mode 100644 index 0000000..35cd5a1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs @@ -0,0 +1,172 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 区间数据包处理适配器,支持以任意字符、字节数组起始与结尾的数据包。 + /// + public abstract class CustomBetweenAndDataHandlingAdapter : CustomDataHandlingAdapter where TBetweenAndRequestInfo : class, IBetweenAndRequestInfo + { + /// + /// 起始字符,不可以为null,可以为0长度 + /// + public abstract byte[] StartCode { get; } + + /// + /// 即使找到了终止因子,也不会结束,默认0 + /// + public int MinSize { get; set; } + + /// + /// 结束字符,不可以为null,不可以为0长度,必须具有有效值。 + /// + public abstract byte[] EndCode { get; } + + /// + /// 筛选解析数据。实例化的TRequest会一直保存,直至解析成功,或手动清除。 + /// 当不满足解析条件时,请返回,此时会保存的数据 + /// 当数据部分异常时,请移动到指定位置,然后返回 + /// 当完全满足解析条件时,请返回最后将移至指定位置。 + /// + /// 字节块 + /// 是否为上次遗留对象,当该参数为True时,request也将是上次实例化的对象。 + /// 对象。 + /// 缓存容量。当需要首次缓存时,指示申请的ByteBlock的容量。合理的值可避免ByteBlock扩容带来的性能消耗。 + /// + protected override FilterResult Filter(ByteBlock byteBlock, bool beCached, ref TBetweenAndRequestInfo request, ref int tempCapacity) + { + if (beCached) + { + int len; + int pos = byteBlock.Pos; + while (true) + { + int indexEnd = byteBlock.Buffer.IndexOfFirst(byteBlock.Pos, byteBlock.CanReadLen, this.EndCode); + if (indexEnd == -1) + { + byteBlock.Pos = pos; + return FilterResult.Cache; + } + + len = indexEnd - this.EndCode.Length - pos + 1; + if (len >= this.MinSize) + { + break; + } + byteBlock.Pos += len + this.EndCode.Length; + } + + byteBlock.Pos = pos; + request.OnParsingBody(byteBlock.ToArray(pos, len)); + byteBlock.Pos += len; + + if (request.OnParsingEndCode(byteBlock.ToArray(byteBlock.Pos, this.EndCode.Length))) + { + byteBlock.Pos += this.EndCode.Length; + return FilterResult.Success; + } + else + { + byteBlock.Pos += this.EndCode.Length; + return FilterResult.GoOn; + } + } + else + { + TBetweenAndRequestInfo requestInfo = this.GetInstance(); + + int indexStart = byteBlock.Buffer.IndexOfFirst(byteBlock.Pos, byteBlock.CanReadLen, this.StartCode); + if (indexStart == -1) + { + return FilterResult.Cache; + } + if (!requestInfo.OnParsingStartCode(byteBlock.ToArray(byteBlock.Pos, this.StartCode.Length))) + { + byteBlock.Pos += this.StartCode.Length; + return FilterResult.GoOn; + } + byteBlock.Pos += this.StartCode.Length; + request = requestInfo; + + int len; + int pos = byteBlock.Pos; + while (true) + { + int indexEnd = byteBlock.Buffer.IndexOfFirst(byteBlock.Pos, byteBlock.CanReadLen, this.EndCode); + if (indexEnd == -1) + { + byteBlock.Pos = pos; + return FilterResult.Cache; + } + + len = indexEnd - this.EndCode.Length - pos + 1; + if (len >= this.MinSize) + { + break; + } + byteBlock.Pos += len + this.EndCode.Length; + } + + byteBlock.Pos = pos; + request.OnParsingBody(byteBlock.ToArray(pos, len)); + byteBlock.Pos += len; + + if (request.OnParsingEndCode(byteBlock.ToArray(byteBlock.Pos, this.EndCode.Length))) + { + byteBlock.Pos += this.EndCode.Length; + return FilterResult.Success; + } + else + { + byteBlock.Pos += this.EndCode.Length; + return FilterResult.GoOn; + } + } + } + + /// + /// 获取泛型实例。 + /// + /// + protected abstract TBetweenAndRequestInfo GetInstance(); + } + + /// + /// 区间类型的适配器数据模型接口。 + /// + public interface IBetweenAndRequestInfo : IRequestInfo + { + /// + /// 当解析到起始字符时。 + /// + /// + /// + bool OnParsingStartCode(byte[] startCode); + + /// + /// 当解析数据体。 + /// 在此方法中,您必须手动保存Body内容 + /// + /// + void OnParsingBody(byte[] body); + + /// + /// 当解析到起始字符时。 + /// + /// + /// + bool OnParsingEndCode(byte[] endCode); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..f2b6a18 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBetweenAndDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6f1ca1eab1dfd2644836f6b7102ec3d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs new file mode 100644 index 0000000..14cd22c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs @@ -0,0 +1,169 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 大数据用户自定义固定包头解析器,使用该适配器时,接收方收到的数据中,将为null,同时将实现为TFixedHeaderRequestInfo。 + /// + public abstract class CustomBigFixedHeaderDataHandlingAdapter : CustomDataHandlingAdapter + where TFixedHeaderRequestInfo : class, IBigFixedHeaderRequestInfo + { + /// + /// 固定包头的长度。 + /// + public abstract int HeaderLength { get; } + + /// + /// 筛选解析数据。实例化的TRequest会一直保存,直至解析成功,或手动清除。 + /// 当不满足解析条件时,请返回,此时会保存的数据 + /// 当数据部分异常时,请移动到指定位置,然后返回 + /// 当完全满足解析条件时,请返回最后将移至指定位置。 + /// + /// 字节块 + /// 是否为上次遗留对象,当该参数为True时,request也将是上次实例化的对象。 + /// 对象。 + /// 缓存容量。当需要首次缓存时,指示申请的ByteBlock的容量。合理的值可避免ByteBlock扩容带来的性能消耗。 + /// + protected override FilterResult Filter(ByteBlock byteBlock, bool beCached, ref TFixedHeaderRequestInfo request, ref int tempCapacity) + { + if (beCached) + { + while (this.m_surLen > 0 && byteBlock.CanRead) + { + int r = (int)Math.Min(this.m_surLen, byteBlock.CanReadLength); + try + { + request.OnAppendBody(byteBlock.Buffer, byteBlock.Pos, r); + this.m_surLen -= r; + byteBlock.Pos += r; + if (this.m_surLen == 0) + { + if (request.OnFinished()) + { + return FilterResult.Success; + } + request = null; + return FilterResult.GoOn; + } + } + catch (Exception ex) + { + this.OnError(ex.Message, false, true); + } + } + return FilterResult.GoOn; + } + else + { + if (this.HeaderLength > byteBlock.CanReadLen) + { + return FilterResult.Cache; + } + + TFixedHeaderRequestInfo requestInfo = this.GetInstance(); + byteBlock.Read(out byte[] header, this.HeaderLength); + if (requestInfo.OnParsingHeader(header)) + { + request = requestInfo; + if (requestInfo.BodyLength == 0) + { + if (requestInfo.OnFinished()) + { + return FilterResult.Success; + } + request = null; + return FilterResult.GoOn; + } + this.m_surLen = request.BodyLength; + + while (this.m_surLen > 0 && byteBlock.CanRead) + { + int r = (int)Math.Min(this.m_surLen, byteBlock.CanReadLength); + try + { + request.OnAppendBody(byteBlock.Buffer, byteBlock.Pos, r); + this.m_surLen -= r; + byteBlock.Pos += r; + if (this.m_surLen == 0) + { + if (request.OnFinished()) + { + return FilterResult.Success; + } + request = null; + return FilterResult.GoOn; + } + } + catch (Exception ex) + { + this.OnError(ex.Message, false, true); + } + } + return FilterResult.GoOn; + } + else + { + return FilterResult.GoOn; + } + } + } + + private long m_surLen; + + /// + /// 获取泛型实例。 + /// + /// + protected abstract TFixedHeaderRequestInfo GetInstance(); + } + + /// + /// 用户自定义固定包头请求 + /// + public interface IBigFixedHeaderRequestInfo : IRequestInfo + { + /// + /// 数据体长度 + /// + long BodyLength { get; } + + /// + /// 当收到数据,由框架封送固定协议头。 + /// 您需要在此函数中,解析自己的固定包头,并且对赋值后续数据的长度,然后返回True。 + /// 如果返回false,则意味着放弃本次解析 + /// + /// + /// + bool OnParsingHeader(byte[] header); + + /// + /// 当收到数据,由框架封送数据。 + /// 您需要将有效数据自行保存。该方法可能会多次调用。 + /// + /// + /// + /// + /// 是否成功有效 + void OnAppendBody(byte[] buffer, int offset, int length); + + /// + /// 当完成数据接收时调用。 + /// 当返回False时,将不会把该对象向Received传递。 + /// + /// 是否成功有效 + bool OnFinished(); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..7531522 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomBigFixedHeaderDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3172582b61311c4c9f42b6f64d1efd9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs new file mode 100644 index 0000000..1e33a56 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs @@ -0,0 +1,201 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 用户自定义数据处理适配器,使用该适配器时,接收方收到的数据中,将为null, + /// 同时将实现为TRequest,发送数据直接发送。 + /// 此处设计思路借鉴SuperSocket。 + /// + public abstract class CustomDataHandlingAdapter : DataHandlingAdapter where TRequest : class, IRequestInfo + { + /// + /// 缓存数据,如果需要手动释放,请先判断,然后到调用后,再置空; + /// + protected ByteBlock TempByteBlock; + + /// + /// 缓存对象。 + /// + protected TRequest TempRequest; + + private bool m_needReset; + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// 默认不支持拼接发送 + /// + public override bool CanSplicingSend => false; + + /// + /// 筛选解析数据。实例化的TRequest会一直保存,直至解析成功,或手动清除。 + /// 当不满足解析条件时,请返回,此时会保存的数据 + /// 当数据部分异常时,请移动到指定位置,然后返回 + /// 当完全满足解析条件时,请返回最后将移至指定位置。 + /// + /// 字节块 + /// 是否为上次遗留对象,当该参数为True时,request也将是上次实例化的对象。 + /// 对象。 + /// 缓存容量。当需要首次缓存时,指示申请的ByteBlock的容量。合理的值可避免ByteBlock扩容带来的性能消耗。 + /// + protected abstract FilterResult Filter(ByteBlock byteBlock, bool beCached, ref TRequest request, ref int tempCapacity); + + /// + /// 成功执行接收以后。 + /// + /// + protected virtual void OnReceivedSuccess(TRequest request) + { + } + + /// + /// 即将执行。 + /// + /// + /// 返回值标识是否继续执行 + protected virtual bool OnReceivingSuccess(TRequest request) + { + return true; + } + + /// + /// + /// + /// + protected override void PreviewReceived(ByteBlock byteBlock) + { + if (this.m_needReset || this.CacheTimeoutEnable && DateTime.Now - this.LastCacheTime > this.CacheTimeout) + { + this.Reset(); + this.m_needReset = false; + } + if (this.TempByteBlock == null) + { + this.Single(byteBlock, false); + } + else + { + this.TempByteBlock.Write(byteBlock.Buffer, 0, byteBlock.Len); + ByteBlock block = this.TempByteBlock; + this.TempByteBlock = null; + this.Single(block, true); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + } + + /// + /// + /// + /// 数据 + /// 偏移 + /// 长度 + protected override void PreviewSend(byte[] buffer, int offset, int length) + { + this.GoSend(buffer, offset, length); + } + + /// + /// + /// + /// + protected override void PreviewSend(IList> transferBytes) + { + throw new System.NotImplementedException();//因为设置了不支持拼接发送,所以该方法可以不实现。 + } + + /// + /// + /// + protected override void Reset() + { + this.TempByteBlock.SafeDispose(); + this.TempByteBlock = null; + this.TempRequest = default; + this.m_needReset = true; + base.Reset(); + } + + private void Single(ByteBlock byteBlock, bool temp) + { + byteBlock.Pos = 0; + while (byteBlock.Pos < byteBlock.Len) + { + if (this.m_needReset) + { + return; + } + int tempCapacity = 1024 * 64; + FilterResult filterResult = this.Filter(byteBlock, this.TempRequest != null, ref this.TempRequest, ref tempCapacity); + switch (filterResult) + { + case FilterResult.Success: + if (this.OnReceivingSuccess(this.TempRequest)) + { + this.GoReceived(null, this.TempRequest); + this.OnReceivedSuccess(this.TempRequest); + } + this.TempRequest = default; + break; + + case FilterResult.Cache: + if (byteBlock.CanReadLen > 0) + { + if (temp) + { + this.TempByteBlock = new ByteBlock(tempCapacity); + this.TempByteBlock.Write(byteBlock.Buffer, byteBlock.Pos, byteBlock.CanReadLen); + byteBlock.Dispose(); + } + else + { + this.TempByteBlock = new ByteBlock(tempCapacity); + this.TempByteBlock.Write(byteBlock.Buffer, byteBlock.Pos, byteBlock.CanReadLen); + } + + if (this.TempByteBlock.Len > this.MaxPackageSize) + { + this.OnError("缓存的数据长度大于设定值的情况下未收到解析信号"); + } + } + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + return; + + case FilterResult.GoOn: + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + break; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..6a58748 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c796b8b9396ee14fa432847950fe057 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs new file mode 100644 index 0000000..a9d8854 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs @@ -0,0 +1,127 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 用户自定义固定包头解析器,使用该适配器时,接收方收到的数据中,将为null,同时将实现为TFixedHeaderRequestInfo。 + /// + public abstract class CustomFixedHeaderDataHandlingAdapter : CustomDataHandlingAdapter where TFixedHeaderRequestInfo : class, IFixedHeaderRequestInfo + { + /// + /// 固定包头的长度。 + /// + public abstract int HeaderLength { get; } + + /// + /// 筛选解析数据。实例化的TRequest会一直保存,直至解析成功,或手动清除。 + /// 当不满足解析条件时,请返回,此时会保存的数据 + /// 当数据部分异常时,请移动到指定位置,然后返回 + /// 当完全满足解析条件时,请返回最后将移至指定位置。 + /// + /// 字节块 + /// 是否为上次遗留对象,当该参数为True时,request也将是上次实例化的对象。 + /// 对象。 + /// 缓存容量。当需要首次缓存时,指示申请的ByteBlock的容量。合理的值可避免ByteBlock扩容带来的性能消耗。 + /// + protected override FilterResult Filter(ByteBlock byteBlock, bool beCached, ref TFixedHeaderRequestInfo request, ref int tempCapacity) + { + if (beCached) + { + if (request.BodyLength > byteBlock.CanReadLen)//body不满足解析,开始缓存,然后保存对象 + { + return FilterResult.Cache; + } + + byteBlock.Read(out byte[] body, request.BodyLength); + if (request.OnParsingBody(body)) + { + return FilterResult.Success; + } + else + { + request = default;//放弃所有解析 + return FilterResult.GoOn; + } + } + else + { + if (this.HeaderLength > byteBlock.CanReadLen) + { + return FilterResult.Cache; + } + + TFixedHeaderRequestInfo requestInfo = this.GetInstance(); + byteBlock.Read(out byte[] header, this.HeaderLength); + if (requestInfo.OnParsingHeader(header)) + { + request = requestInfo; + if (requestInfo.BodyLength > byteBlock.CanReadLen)//body不满足解析,开始缓存,然后保存对象 + { + return FilterResult.Cache; + } + + byteBlock.Read(out byte[] body, requestInfo.BodyLength); + if (requestInfo.OnParsingBody(body)) + { + return FilterResult.Success; + } + else + { + request = default;//放弃所有解析 + return FilterResult.GoOn; + } + } + else + { + return FilterResult.GoOn; + } + } + } + + /// + /// 获取泛型实例。 + /// + /// + protected abstract TFixedHeaderRequestInfo GetInstance(); + } + + /// + /// 用户自定义固定包头请求 + /// + public interface IFixedHeaderRequestInfo : IRequestInfo + { + /// + /// 数据体长度 + /// + int BodyLength { get; } + + /// + /// 当收到数据,由框架封送固定协议头。 + /// 您需要在此函数中,解析自己的固定包头,并且对赋值后续数据的长度,然后返回True。 + /// 如果返回false,则意味着放弃本次解析 + /// + /// + /// + bool OnParsingHeader(byte[] header); + + /// + /// 当收到数据,由框架封送有效载荷数据。 + /// 如果返回false,意味着放弃本次解析的所有数据,包括已经解析完成的Header + /// + /// 载荷数据 + /// 是否成功有效 + bool OnParsingBody(byte[] body); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..60ee03d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomFixedHeaderDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9826cf00d7cd7a148aaab2997bf6b18d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs new file mode 100644 index 0000000..cae96a8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs @@ -0,0 +1,117 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 用户自定义固定包头解析器,使用该适配器时,接收方收到的数据中,将为null,同时将实现为TUnfixedHeaderRequestInfo。 + /// + public abstract class CustomUnfixedHeaderDataHandlingAdapter : CustomDataHandlingAdapter where TUnfixedHeaderRequestInfo : class, IUnfixedHeaderRequestInfo + { + /// + /// 筛选解析数据。实例化的TRequest会一直保存,直至解析成功,或手动清除。 + /// 当不满足解析条件时,请返回,此时会保存的数据 + /// 当数据部分异常时,请移动到指定位置,然后返回 + /// 当完全满足解析条件时,请返回最后将移至指定位置。 + /// + /// 字节块 + /// 是否为上次遗留对象,当该参数为True时,request也将是上次实例化的对象。 + /// 对象。 + /// 缓存容量。当需要首次缓存时,指示申请的ByteBlock的容量。合理的值可避免ByteBlock扩容带来的性能消耗。 + /// + protected override FilterResult Filter(ByteBlock byteBlock, bool beCached, ref TUnfixedHeaderRequestInfo request, ref int tempCapacity) + { + if (beCached) + { + if (request.BodyLength > byteBlock.CanReadLen)//body不满足解析,开始缓存,然后保存对象 + { + return FilterResult.Cache; + } + + byteBlock.Read(out byte[] body, request.BodyLength); + if (request.OnParsingBody(body)) + { + return FilterResult.Success; + } + else + { + request = default;//放弃所有解析 + return FilterResult.GoOn; + } + } + else + { + TUnfixedHeaderRequestInfo requestInfo = this.GetInstance(); + if (requestInfo.OnParsingHeader(byteBlock)) + { + request = requestInfo; + if (requestInfo.BodyLength > byteBlock.CanReadLen)//body不满足解析,开始缓存,然后保存对象 + { + return FilterResult.Cache; + } + + byteBlock.Read(out byte[] body, requestInfo.BodyLength); + if (requestInfo.OnParsingBody(body)) + { + return FilterResult.Success; + } + else + { + request = default;//放弃所有解析 + return FilterResult.GoOn; + } + } + else + { + return FilterResult.Cache; + } + } + } + + /// + /// 获取泛型实例。 + /// + /// + protected abstract TUnfixedHeaderRequestInfo GetInstance(); + } + + /// + /// 用户自定义不固定包头请求 + /// + public interface IUnfixedHeaderRequestInfo : IRequestInfo + { + /// + /// 数据体长度 + /// + int BodyLength { get; } + + /// + /// 当收到数据,由框架封送数据,您需要在此函数中,解析自己的数据包头。 + /// 如果满足包头的解析,请返回True,并且递增整个包头的长度到,然后赋值 + /// 如果返回false,意味着缓存剩余数据,此时如果仅仅是因为长度不足,则不必修改其他。 + /// 但是如果是因为数据错误,则需要修改到正确位置,如果都不正确,则设置等于 + /// + /// + /// 是否满足解析包头 + bool OnParsingHeader(ByteBlock byteBlock); + + /// + /// 当收到数据,由框架封送有效载荷数据。 + /// 如果返回false,意味着放弃本次解析的所有数据,包括已经解析完成的Header + /// + /// 载荷数据 + /// 是否成功有效 + bool OnParsingBody(byte[] body); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..b487085 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Custom/CustomUnfixedHeaderDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79d124d6c3904b44087851f82318724f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs new file mode 100644 index 0000000..96629cf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs @@ -0,0 +1,221 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 数据处理适配器 + /// + public abstract class DataHandlingAdapter : DisposableObject + { + + /// + /// 最后缓存的时间 + /// + protected DateTime LastCacheTime { get; set; } + + /// + /// 是否在收到数据时,即刷新缓存时间。默认true。 + /// + /// 当设为true时,将弱化的作用,只要一直有数据,则缓存不会过期。 + /// 当设为false时,则在的时效内。必须完成单个缓存的数据。 + /// + /// + public bool UpdateCacheTimeWhenRev { get; set; } = true; + + /// + /// 缓存超时时间。默认1秒。 + /// + public TimeSpan CacheTimeout { get; set; } = TimeSpan.FromSeconds(1); + + /// + /// 是否启用缓存超时。默认true。 + /// + public bool CacheTimeoutEnable { get; set; } = true; + + /// + /// 当插件在被第一次加载时调用。 + /// + /// + /// 此适配器已被其他终端使用,请重新创建对象。 + public virtual void OnLoaded(ITcpClientBase client) + { + if (this.Client != null) + { + throw new Exception("此适配器已被其他终端使用,请重新创建对象。"); + } + this.Client = client; + } + + /// + /// 拼接发送 + /// + public abstract bool CanSplicingSend { get; } + + /// + /// 是否允许发送对象。 + /// + public abstract bool CanSendRequestInfo { get; } + + /// + /// 获取或设置适配器能接收的最大数据包长度。 + /// + public int MaxPackageSize { get; set; } = 1024 * 1024 * 10; + + /// + /// 适配器拥有者。 + /// + public ITcpClientBase Client { get; private set; } + + /// + /// 当接收数据处理完成后,回调该函数执行接收 + /// + public Action ReceivedCallBack { get; set; } + + /// + /// 当接收数据处理完成后,回调该函数执行发送 + /// + public Action SendCallBack { get; set; } + + /// + /// 收到数据的切入点,该方法由框架自动调用。 + /// + /// + public void ReceivedInput(ByteBlock byteBlock) + { + try + { + this.PreviewReceived(byteBlock); + } + catch (Exception ex) + { + this.OnError(ex.Message); + } + } + + /// + /// 发送数据的切入点,该方法由框架自动调用。 + /// + /// + /// + /// + public void SendInput(byte[] buffer, int offset, int length) + { + this.PreviewSend(buffer, offset, length); + } + + /// + /// 发送数据的切入点,该方法由框架自动调用。 + /// + /// + public void SendInput(IList> transferBytes) + { + this.PreviewSend(transferBytes); + } + + /// + /// 发送数据的切入点,该方法由框架自动调用。 + /// + /// + public void SendInput(IRequestInfo requestInfo) + { + this.PreviewSend(requestInfo); + } + + /// + /// 处理已经经过预先处理后的数据 + /// + /// 以二进制形式传递 + /// 以解析实例传递 + protected void GoReceived(ByteBlock byteBlock, IRequestInfo requestInfo) + { + this.ReceivedCallBack.Invoke(byteBlock, requestInfo); + } + + /// + /// 发送已经经过预先处理后的数据 + /// + /// + /// + /// + protected void GoSend(byte[] buffer, int offset, int length) + { + this.SendCallBack.Invoke(buffer, offset, length); + } + + /// + /// 在解析时发生错误。 + /// + /// 错误异常 + /// 是否调用 + /// 是否记录日志 + protected virtual void OnError(string error, bool reset = true, bool log = true) + { + if (reset) + { + this.Reset(); + } + if (log && this.Client != null && this.Client.Logger != null) + { + this.Client.Logger.Error(error); + } + } + + /// + /// 当接收到数据后预先处理数据,然后调用处理数据 + /// + /// + protected abstract void PreviewReceived(ByteBlock byteBlock); + + /// + /// 当发送数据前预先处理数据 + /// + /// 数据 + /// 偏移 + /// 长度 + protected abstract void PreviewSend(byte[] buffer, int offset, int length); + + /// + /// 当发送数据前预先处理数据 + /// + /// + protected abstract void PreviewSend(IRequestInfo requestInfo); + + /// + /// 组合发送预处理数据, + /// 当属性SplicingSend实现为True时,系统才会调用该方法。 + /// + /// 代发送数据组合 + protected abstract void PreviewSend(IList> transferBytes); + + /// + /// 重置解析器到初始状态,一般在被触发时,由返回值指示是否调用。 + /// + protected virtual void Reset() + { + this.LastCacheTime = DateTime.Now; + } + + /// + /// 该方法被触发时,一般说明已经断开连接。 + /// + /// + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs.meta new file mode 100644 index 0000000..4d894a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/DataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f589c5c49535aa84cb93093864744bea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs new file mode 100644 index 0000000..7c64601 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs @@ -0,0 +1,154 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +//using TouchSocket.Core; +//using System.Collections.Generic; +//using System.Text; +//using System.Text.RegularExpressions; + +//namespace TouchSocket.Sockets +//{ +// /// +// /// Json字符串数据处理解析器(该解析器由网友"明月"提供) +// /// +// public class JsonStringDataHandlingAdapter : CustomDataHandlingAdapter +// { +// private ByteBlock Temp; + +// /// +// /// +// /// +// public override bool CanSplicingSend => false; + +// /// +// /// 预解析 +// /// +// /// +// protected override void PreviewReceived(ByteBlock byteBlock) +// { +// byte[] buffer = byteBlock.Buffer; +// int length = byteBlock.Len; + +// //Console.WriteLine("----------------接收的新数据-------------------"); +// if (Temp != null) +// { +// Temp.Write(byteBlock.Buffer, 0, length); +// buffer = Temp.Buffer; +// length = (int)Temp.Length; +// } + +// string msg = Encoding.UTF8.GetString(buffer, 0, length); +// if (msg.Contains("}{")) +// { +// //Console.WriteLine("----------------发生粘包-------------------"); +// string[] mes = Regex.Split(msg, "}{"); +// for (int i = 0; i < mes.Length; i++) +// { +// string str = mes[i]; +// if (i == 0) +// { +// str += "}"; +// } +// else if (i == mes.Length - 1) +// { +// str = "{" + str; +// int start = StringCount(str, "{"); +// int end = StringCount(str, "}"); +// if (start == end) +// { +// if (Temp != null) +// { +// Temp = null; +// } +// } +// else +// { +// byte[] surPlus = Encoding.UTF8.GetBytes(str); + +// if (Temp != null) +// { +// Temp = null; +// } +// //Temp = BytePool.GetByteBlock(1024*1024*10); +// Temp = BytePool.GetByteBlock(length); + +// Temp.Write(surPlus); +// //Console.WriteLine("----------------数据不完整-------------------"); +// break; +// } +// } +// else +// { +// str = "{" + str + "}"; +// } +// //Console.WriteLine(str); +// PreviewHandle(str); +// } +// } +// else if (msg[0] == '{' && msg[1] == '}') +// { +// Temp = null; +// PreviewHandle(msg); +// } +// else +// { +// if (Temp == null) +// { +// Temp = BytePool.GetByteBlock(length); +// Temp.Write(byteBlock.Buffer, 0, length); +// } + +// Temp.Write(byteBlock.Buffer, 0, length); +// } +// } + +// /// +// /// 预发送封装 +// /// +// /// +// /// +// /// +// /// +// protected override void PreviewSend(byte[] buffer, int offset, int length, bool isAsync) +// { +// this.GoSend(buffer, offset, length, isAsync); +// } + +// private int StringCount(string source, string match) +// { +// int count = 0; +// if (source.Contains(match)) +// { +// string temp = source.Replace(match, ""); +// count = (source.Length - temp.Length) / match.Length; +// } +// return count; +// } + +// private void PreviewHandle(string msg) +// { +// GoReceived(null, msg); +// } + +// protected override FilterResult Filter(ByteBlock byteBlock, bool beCached, ref JsonRequestInfo request, ref int tempCapacity) +// { +// } +// } + +// /// +// /// json解析 +// /// +// public class JsonRequestInfo:IRequestInfo +// { +// } +//} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..34c2f7b --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/JsonStringDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2655867fb505d6746bbc451266f3f771 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs new file mode 100644 index 0000000..c92fa18 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs @@ -0,0 +1,80 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 普通TCP数据处理器,该适配器不对数据做任何处理。 + /// + public class NormalDataHandlingAdapter : DataHandlingAdapter + { + /// + /// + /// + public override bool CanSplicingSend => false; + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// 当接收到数据时处理数据 + /// + /// 数据流 + protected override void PreviewReceived(ByteBlock byteBlock) + { + this.GoReceived(byteBlock, null); + } + + /// + /// + /// + /// 数据 + /// 偏移 + /// 长度 + protected override void PreviewSend(byte[] buffer, int offset, int length) + { + this.GoSend(buffer, offset, length); + } + + /// + /// + /// + /// + protected override void PreviewSend(IList> transferBytes) + { + throw new System.NotImplementedException();//因为设置了不支持拼接发送,所以该方法可以不实现。 + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + throw new System.NotImplementedException(); + } + + /// + /// + /// + protected override void Reset() + { + base.Reset(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..709dd69 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/NormalDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 478496cfb89d1f04697662e0d4de69c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package.meta new file mode 100644 index 0000000..530f380 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c684a47bdf38b534cb63ea4bf4b51824 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs new file mode 100644 index 0000000..d5334df --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs @@ -0,0 +1,348 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 固定包头数据包处理适配器,支持Byte、UShort、Int三种类型作为包头。使用大小端设置。 + /// + public class FixedHeaderPackageAdapter : DataHandlingAdapter + { + private byte[] m_agreementTempBytes; + private int m_surPlusLength = 0; + + //包剩余长度 + private ByteBlock m_tempByteBlock; + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// + /// + public override bool CanSplicingSend => true; + + /// + /// 设置包头类型,默认为int + /// + public FixedHeaderType FixedHeaderType { get; set; } = FixedHeaderType.Int; + + /// + /// 获取或设置包数据的最小值(默认为0) + /// + public int MinPackageSize { get; set; } = 0; + + /// + /// 当接收到数据时处理数据 + /// + /// 数据流 + protected override void PreviewReceived(ByteBlock byteBlock) + { + byte[] buffer = byteBlock.Buffer; + int r = byteBlock.Len; + + if (this.CacheTimeoutEnable && DateTime.Now - this.LastCacheTime > this.CacheTimeout) + { + this.Reset(); + } + + if (this.m_agreementTempBytes != null) + { + this.SeamPackage(buffer, r); + } + else if (this.m_tempByteBlock == null) + { + this.SplitPackage(buffer, 0, r); + } + else + { + if (this.m_surPlusLength == r) + { + this.m_tempByteBlock.Write(buffer, 0, this.m_surPlusLength); + this.PreviewHandle(this.m_tempByteBlock); + this.m_tempByteBlock = null; + this.m_surPlusLength = 0; + } + else if (this.m_surPlusLength < r) + { + this.m_tempByteBlock.Write(buffer, 0, this.m_surPlusLength); + this.PreviewHandle(this.m_tempByteBlock); + this.m_tempByteBlock = null; + this.SplitPackage(buffer, this.m_surPlusLength, r); + } + else + { + this.m_tempByteBlock.Write(buffer, 0, r); + this.m_surPlusLength -= r; + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + } + } + } + + /// + /// 当发送数据前处理数据 + /// + /// + /// + /// + protected override void PreviewSend(byte[] buffer, int offset, int length) + { + if (length < this.MinPackageSize) + { + throw new Exception("发送数据小于设定值,相同解析器可能无法收到有效数据,已终止发送"); + } + + if (length > this.MaxPackageSize) + { + throw new Exception("发送数据大于设定值,相同解析器可能无法收到有效数据,已终止发送"); + } + + ByteBlock byteBlock = null; + byte[] lenBytes = null; + + switch (this.FixedHeaderType) + { + case FixedHeaderType.Byte: + { + byte dataLen = (byte)(length - offset); + byteBlock = new ByteBlock(dataLen + 1); + lenBytes = new byte[] { dataLen }; + break; + } + case FixedHeaderType.Ushort: + { + ushort dataLen = (ushort)(length - offset); + byteBlock = new ByteBlock(dataLen + 2); + lenBytes = TouchSocketBitConverter.Default.GetBytes(dataLen); + break; + } + case FixedHeaderType.Int: + { + int dataLen = length - offset; + byteBlock = new ByteBlock(dataLen + 4); + lenBytes = TouchSocketBitConverter.Default.GetBytes(dataLen); + break; + } + } + + try + { + byteBlock.Write(lenBytes); + byteBlock.Write(buffer, offset, length); + this.GoSend(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IList> transferBytes) + { + if (transferBytes.Count == 0) + { + return; + } + + int length = 0; + foreach (ArraySegment item in transferBytes) + { + length += item.Count; + } + + if (length < this.MinPackageSize) + { + throw new Exception("发送数据小于设定值,相同解析器可能无法收到有效数据,已终止发送"); + } + + if (length > this.MaxPackageSize) + { + throw new Exception("发送数据大于设定值,相同解析器可能无法收到有效数据,已终止发送"); + } + + ByteBlock byteBlock = null; + byte[] lenBytes = null; + + switch (this.FixedHeaderType) + { + case FixedHeaderType.Byte: + { + byte dataLen = (byte)length; + byteBlock = new ByteBlock(dataLen + 1); + lenBytes = new byte[] { dataLen }; + break; + } + case FixedHeaderType.Ushort: + { + ushort dataLen = (ushort)length; + byteBlock = new ByteBlock(dataLen + 2); + lenBytes = TouchSocketBitConverter.Default.GetBytes(dataLen); + break; + } + case FixedHeaderType.Int: + { + byteBlock = new ByteBlock(length + 4); + lenBytes = TouchSocketBitConverter.Default.GetBytes(length); + break; + } + } + + try + { + byteBlock.Write(lenBytes); + foreach (ArraySegment item in transferBytes) + { + byteBlock.Write(item.Array, item.Offset, item.Count); + } + this.GoSend(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + throw new NotImplementedException(); + } + + /// + /// + /// + protected override void Reset() + { + this.m_agreementTempBytes = null; + this.m_surPlusLength = default; + this.m_tempByteBlock?.Dispose(); + this.m_tempByteBlock = null; + base.Reset(); + } + + private void PreviewHandle(ByteBlock byteBlock) + { + try + { + this.GoReceived(byteBlock, null); + } + finally + { + byteBlock.Dispose(); + } + } + + /// + /// 缝合包 + /// + /// + /// + private void SeamPackage(byte[] buffer, int r) + { + var byteBlock = new ByteBlock(r + this.m_agreementTempBytes.Length); + byteBlock.Write(this.m_agreementTempBytes); + byteBlock.Write(buffer, 0, r); + r += this.m_agreementTempBytes.Length; + this.m_agreementTempBytes = null; + this.SplitPackage(byteBlock.Buffer, 0, r); + byteBlock.Dispose(); + } + + /// + /// 分解包 + /// + /// + /// + /// + private void SplitPackage(byte[] dataBuffer, int index, int r) + { + while (index < r) + { + if (r - index <= (byte)this.FixedHeaderType) + { + this.m_agreementTempBytes = new byte[r - index]; + Array.Copy(dataBuffer, index, this.m_agreementTempBytes, 0, this.m_agreementTempBytes.Length); + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + return; + } + int length = 0; + + switch (this.FixedHeaderType) + { + case FixedHeaderType.Byte: + length = dataBuffer[index]; + break; + + case FixedHeaderType.Ushort: + length = TouchSocketBitConverter.Default.ToUInt16(dataBuffer, index); + break; + + case FixedHeaderType.Int: + length = TouchSocketBitConverter.Default.ToInt32(dataBuffer, index); + break; + } + + if (length < 0) + { + throw new Exception("接收数据长度错误,已放弃接收"); + } + else if (length < this.MinPackageSize) + { + throw new Exception("接收数据长度小于设定值,已放弃接收"); + } + else if (length > this.MaxPackageSize) + { + throw new Exception("接收数据长度大于设定值,已放弃接收"); + } + + int recedSurPlusLength = r - index - (byte)this.FixedHeaderType; + if (recedSurPlusLength >= length) + { + var byteBlock = new ByteBlock(length); + byteBlock.Write(dataBuffer, index + (byte)this.FixedHeaderType, length); + this.PreviewHandle(byteBlock); + this.m_surPlusLength = 0; + } + else//半包 + { + this.m_tempByteBlock = new ByteBlock(length); + this.m_surPlusLength = length - recedSurPlusLength; + this.m_tempByteBlock.Write(dataBuffer, index + (byte)this.FixedHeaderType, recedSurPlusLength); + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + } + index += (length + (byte)this.FixedHeaderType); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs.meta new file mode 100644 index 0000000..e214ccf --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedHeaderPackageAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee96ca7d188778b4fa5f12247a950abc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs new file mode 100644 index 0000000..7c9421c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs @@ -0,0 +1,225 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 固定长度数据包处理适配器。 + /// + public class FixedSizePackageAdapter : DataHandlingAdapter + { + /// + /// 包剩余长度 + /// + private int m_surPlusLength = 0; + + /// + /// 临时包 + /// + private ByteBlock m_tempByteBlock; + + /// + /// 构造函数 + /// + /// 数据包的长度 + public FixedSizePackageAdapter(int fixedSize) + { + this.FixedSize = fixedSize; + } + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// + /// + public override bool CanSplicingSend => true; + + /// + /// 获取已设置的数据包的长度 + /// + public int FixedSize { get; private set; } + + /// + /// 预处理 + /// + /// + protected override void PreviewReceived(ByteBlock byteBlock) + { + if (this.CacheTimeoutEnable && DateTime.Now - this.LastCacheTime > this.CacheTimeout) + { + this.Reset(); + } + byte[] buffer = byteBlock.Buffer; + int r = byteBlock.Len; + if (this.m_tempByteBlock == null) + { + this.SplitPackage(buffer, 0, r); + } + else + { + if (this.m_surPlusLength == r) + { + this.m_tempByteBlock.Write(buffer, 0, this.m_surPlusLength); + this.PreviewHandle(this.m_tempByteBlock); + this.m_tempByteBlock = null; + this.m_surPlusLength = 0; + } + else if (this.m_surPlusLength < r) + { + this.m_tempByteBlock.Write(buffer, 0, this.m_surPlusLength); + this.PreviewHandle(this.m_tempByteBlock); + this.m_tempByteBlock = null; + this.SplitPackage(buffer, this.m_surPlusLength, r); + } + else + { + this.m_tempByteBlock.Write(buffer, 0, r); + this.m_surPlusLength -= r; + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + } + } + } + + /// + /// 预处理 + /// + /// + /// + /// + protected override void PreviewSend(byte[] buffer, int offset, int length) + { + int dataLen = length - offset; + if (dataLen > this.FixedSize) + { + throw new OverlengthException("发送的数据包长度大于FixedSize"); + } + var byteBlock = new ByteBlock(this.FixedSize); + + byteBlock.Write(buffer, offset, length); + for (int i = (int)byteBlock.Position; i < this.FixedSize; i++) + { + byteBlock.Buffer[i] = 0; + } + byteBlock.SetLength(this.FixedSize); + try + { + this.GoSend(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IList> transferBytes) + { + int length = 0; + foreach (ArraySegment item in transferBytes) + { + length += item.Count; + } + + if (length > this.FixedSize) + { + throw new OverlengthException("发送的数据包长度大于FixedSize"); + } + var byteBlock = new ByteBlock(this.FixedSize); + + foreach (ArraySegment item in transferBytes) + { + byteBlock.Write(item.Array, item.Offset, item.Count); + } + + Array.Clear(byteBlock.Buffer, byteBlock.Pos, this.FixedSize); + byteBlock.SetLength(this.FixedSize); + try + { + this.GoSend(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + throw new NotImplementedException(); + } + + /// + /// + /// + protected override void Reset() + { + this.m_tempByteBlock.SafeDispose(); + this.m_tempByteBlock = null; + this.m_surPlusLength = 0; + base.Reset(); + } + + private void PreviewHandle(ByteBlock byteBlock) + { + try + { + this.GoReceived(byteBlock, null); + } + finally + { + byteBlock.Dispose(); + } + } + + private void SplitPackage(byte[] dataBuffer, int index, int r) + { + while (index < r) + { + if (r - index >= this.FixedSize) + { + var byteBlock = new ByteBlock(this.FixedSize); + byteBlock.Write(dataBuffer, index, this.FixedSize); + this.PreviewHandle(byteBlock); + this.m_surPlusLength = 0; + } + else//半包 + { + this.m_tempByteBlock = new ByteBlock(this.FixedSize); + this.m_surPlusLength = this.FixedSize - (r - index); + this.m_tempByteBlock.Write(dataBuffer, index, r - index); + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + } + index += this.FixedSize; + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs.meta new file mode 100644 index 0000000..c19e53f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/FixedSizePackageAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b2f9bdf1432f3a24e8df7ebac954e349 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs new file mode 100644 index 0000000..032fb54 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs @@ -0,0 +1,243 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Text; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 终止字符数据包处理适配器,支持以任意字符、字节数组结尾的数据包。 + /// + public class TerminatorPackageAdapter : DataHandlingAdapter + { + private ByteBlock m_tempByteBlock; + + private readonly byte[] m_terminatorCode; + + /// + /// 构造函数 + /// + /// + public TerminatorPackageAdapter(string terminator) : this(0, Encoding.UTF8.GetBytes(terminator)) + { + } + + /// + /// 构造函数 + /// + /// + /// + public TerminatorPackageAdapter(string terminator, Encoding encoding) + : this(0, encoding.GetBytes(terminator)) + { + } + + /// + /// 构造函数 + /// + /// + /// + public TerminatorPackageAdapter(int minSize, byte[] terminatorCode) + { + this.MinSize = minSize; + this.m_terminatorCode = terminatorCode; + } + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// + /// + public override bool CanSplicingSend => true; + + /// + /// 即使找到了终止因子,也不会结束,默认0 + /// + public int MinSize { get; set; } = 0; + + /// + /// 保留终止因子 + /// + public bool ReserveTerminatorCode { get; set; } + + /// + /// 预处理 + /// + /// + protected override void PreviewReceived(ByteBlock byteBlock) + { + if (this.CacheTimeoutEnable && DateTime.Now - this.LastCacheTime > this.CacheTimeout) + { + this.Reset(); + } + byte[] buffer = byteBlock.Buffer; + int r = byteBlock.Len; + if (this.m_tempByteBlock != null) + { + this.m_tempByteBlock.Write(buffer, 0, r); + buffer = this.m_tempByteBlock.Buffer; + r = (int)this.m_tempByteBlock.Position; + } + + List indexes = buffer.IndexOfInclude(0, r, this.m_terminatorCode); + if (indexes.Count == 0) + { + if (r > this.MaxPackageSize) + { + this.Reset(); + this.Client?.Logger.Error("在已接收数据大于设定值的情况下未找到终止因子,已放弃接收"); + } + else if (this.m_tempByteBlock == null) + { + this.m_tempByteBlock = new ByteBlock(r * 2); + this.m_tempByteBlock.Write(buffer, 0, r); + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + } + } + else + { + int startIndex = 0; + foreach (int lastIndex in indexes) + { + int length; + if (this.ReserveTerminatorCode) + { + length = lastIndex - startIndex + 1; + } + else + { + length = lastIndex - startIndex - this.m_terminatorCode.Length + 1; + } + + var packageByteBlock = new ByteBlock(length); + packageByteBlock.Write(buffer, startIndex, length); + + string mes = Encoding.UTF8.GetString(packageByteBlock.Buffer, 0, (int)packageByteBlock.Position); + + this.PreviewHandle(packageByteBlock); + startIndex = lastIndex + 1; + } + this.Reset(); + if (startIndex < r) + { + this.m_tempByteBlock = new ByteBlock((r - startIndex) * 2); + this.m_tempByteBlock.Write(buffer, startIndex, r - startIndex); + if (this.UpdateCacheTimeWhenRev) + { + this.LastCacheTime = DateTime.Now; + } + } + } + } + + /// + /// 预处理 + /// + /// + /// + /// + protected override void PreviewSend(byte[] buffer, int offset, int length) + { + if (length > this.MaxPackageSize) + { + throw new Exception("发送的数据长度大于适配器设定的最大值,接收方可能会抛弃。"); + } + int dataLen = length - offset + this.m_terminatorCode.Length; + var byteBlock = new ByteBlock(dataLen); + byteBlock.Write(buffer, offset, length); + byteBlock.Write(this.m_terminatorCode); + + try + { + this.GoSend(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IList> transferBytes) + { + int length = 0; + foreach (ArraySegment item in transferBytes) + { + length += item.Count; + } + if (length > this.MaxPackageSize) + { + throw new Exception("发送的数据长度大于适配器设定的最大值,接收方可能会抛弃。"); + } + int dataLen = length + this.m_terminatorCode.Length; + var byteBlock = new ByteBlock(dataLen); + foreach (ArraySegment item in transferBytes) + { + byteBlock.Write(item.Array, item.Offset, item.Count); + } + + byteBlock.Write(this.m_terminatorCode); + + try + { + this.GoSend(byteBlock.Buffer, 0, byteBlock.Len); + } + finally + { + byteBlock.Dispose(); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + throw new NotImplementedException(); + } + + /// + /// + /// + protected override void Reset() + { + this.m_tempByteBlock.SafeDispose(); + this.m_tempByteBlock = null; + base.Reset(); + } + + private void PreviewHandle(ByteBlock byteBlock) + { + try + { + this.GoReceived(byteBlock, null); + } + finally + { + byteBlock.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs.meta new file mode 100644 index 0000000..7585c3d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Package/TerminatorPackageAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b018dc8e682ea0849a1f09b4ad0fd8ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs new file mode 100644 index 0000000..c21f20e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs @@ -0,0 +1,159 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// Pipeline读取管道 + /// + public abstract class Pipeline : BlockReadStream, IRequestInfo + { + /// + /// Pipeline读取管道 + /// + /// + protected Pipeline(ITcpClientBase client) + { + this.Client = client; + } + + /// + /// 当前支持此管道的客户端。 + /// + public ITcpClientBase Client { get; set; } + } + + /// + /// 管道数据处理适配器。 + /// 使用该适配器后,将为. + /// + public class PipelineDataHandlingAdapter : NormalDataHandlingAdapter + { + private byte[] m_buffer; + private InternalPipeline m_pipeline; + + private Task m_task; + + /// + /// 管道数据处理适配器。 + /// 使用该适配器后,将为. + /// + public PipelineDataHandlingAdapter() + { + } + + /// + /// + /// + /// + protected override void Dispose(bool disposing) + { + this.m_pipeline.SafeDispose(); + base.Dispose(disposing); + } + + /// + /// + /// + /// + protected override void PreviewReceived(ByteBlock byteBlock) + { + if (this.m_pipeline == null || !this.m_pipeline.Enable) + { + this.m_task?.Wait(); + this.m_pipeline = new InternalPipeline(this.Client); + this.m_task = EasyTask.Run(() => + { + try + { + this.GoReceived(default, this.m_pipeline); + if (this.m_pipeline.CanReadLen > 0) + { + this.m_buffer = new byte[this.m_pipeline.CanReadLen]; + this.m_pipeline.Read(this.m_buffer, 0, this.m_buffer.Length); + } + } + catch + { + } + finally + { + this.m_pipeline.SafeDispose(); + } + }); + } + if (this.m_buffer != null) + { + this.m_pipeline.InternalInput(this.m_buffer, 0, this.m_buffer.Length); + this.m_buffer = null; + } + this.m_pipeline.InternalInput(byteBlock.Buffer, 0, byteBlock.Len); + } + } + + internal class InternalPipeline : Pipeline + { + private readonly object m_locker = new object(); + + private bool m_disposedValue; + + /// + /// Pipeline读取管道 + /// + /// + public InternalPipeline(ITcpClientBase client) : base(client) + { + this.ReadTimeout = 60 * 1000; + } + + public override bool CanRead => this.Enable; + + public override bool CanWrite => this.Client.CanSend; + + public bool Enable + { + get + { + lock (this.m_locker) + { + return !this.m_disposedValue; + } + } + } + + public override void Flush() + { + } + + public override void Write(byte[] buffer, int offset, int count) + { + this.Client.DefaultSend(buffer, offset, count); + } + + internal void InternalInput(byte[] buffer, int offset, int length) + { + this.Input(buffer, offset, length); + } + + protected override void Dispose(bool disposing) + { + lock (this.m_locker) + { + this.m_disposedValue = true; + base.Dispose(disposing); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..7af5ca9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/PipelineDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 284ab3e49b732b541a2bc0c24b451de8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test.meta new file mode 100644 index 0000000..b975092 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 428662bf5104b974b8718a90302f4208 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs new file mode 100644 index 0000000..6097c66 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs @@ -0,0 +1,368 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 数据处理适配器测试 + /// + public class DataAdapterTester : IDisposable + { + private readonly IntelligentDataQueue asyncBytes; + private readonly Thread sendThread; + private DataHandlingAdapter adapter; + private int bufferLength; + private int count; + private bool dispose; + private int expectedCount; + private Action receivedCallBack; + private Stopwatch stopwatch; + private int timeout; + + private DataAdapterTester() + { + this.asyncBytes = new IntelligentDataQueue(1024 * 1024 * 10); + this.sendThread = new Thread(this.BeginSend); + this.sendThread.IsBackground = true; + this.sendThread.Name = "DataAdapterTesterThread"; + this.sendThread.Start(); + } + + /// + /// 获取测试器 + /// + /// 待测试适配器 + /// 收到数据回调 + /// 缓存数据长度 + /// + public static DataAdapterTester CreateTester(DataHandlingAdapter adapter, int bufferLength = 1024, Action receivedCallBack = default) + { + var tester = new DataAdapterTester(); + tester.adapter = adapter; + tester.bufferLength = bufferLength; + adapter.SendCallBack = tester.SendCallback; + adapter.ReceivedCallBack = tester.OnReceived; + tester.receivedCallBack = receivedCallBack; + return tester; + } + + /// + /// 释放 + /// + public void Dispose() + { + this.dispose = true; + } + + /// + /// 模拟测试运行发送 + /// + /// + /// + /// + /// 测试次数 + /// 期待测试次数 + /// 超时 + /// + public TimeSpan Run(byte[] buffer, int offset, int length, int testCount, int expectedCount, int timeout) + { + this.count = 0; + this.expectedCount = expectedCount; + this.timeout = timeout; + this.stopwatch = new Stopwatch(); + this.stopwatch.Start(); + EasyTask.Run(() => + { + for (int i = 0; i < testCount; i++) + { + this.adapter.SendInput(buffer, offset, length); + } + }); + + if (SpinWait.SpinUntil(() => this.count == this.expectedCount, this.timeout)) + { + this.stopwatch.Stop(); + return this.stopwatch.Elapsed; + } + throw new TimeoutException(); + } + + /// + /// 模拟发送 + /// + /// + /// 测试次数 + /// 期待测试次数 + /// 超时 + public TimeSpan Run(byte[] buffer, int testCount, int expectedCount, int timeout) + { + return this.Run(buffer, 0, buffer.Length, testCount, expectedCount, timeout); + } + + private void BeginSend() + { + while (!this.dispose) + { + if (this.tryGet(out List byteBlocks)) + { + foreach (ByteBlock block in byteBlocks) + { + try + { + this.adapter.ReceivedInput(block); + } + finally + { + block.Dispose(); + } + } + } + else + { + Thread.Sleep(1); + } + } + } + + private void OnReceived(ByteBlock byteBlock, IRequestInfo requestInfo) + { + this.count++; + this.receivedCallBack?.Invoke(byteBlock, requestInfo); + } + + private void SendCallback(byte[] buffer, int offset, int length) + { + var asyncByte = new QueueDataBytes(new byte[length], 0, length); + Array.Copy(buffer, offset, asyncByte.Buffer, 0, length); + this.asyncBytes.Enqueue(asyncByte); + } + + private bool tryGet(out List byteBlocks) + { + byteBlocks = new List(); + ByteBlock block = null; + while (true) + { + if (this.asyncBytes.TryDequeue(out QueueDataBytes asyncByte)) + { + if (block == null) + { + block = BytePool.Default.GetByteBlock(this.bufferLength); + byteBlocks.Add(block); + } + int surLen = this.bufferLength - block.Pos; + if (surLen < asyncByte.Length)//不能完成写入 + { + block.Write(asyncByte.Buffer, asyncByte.Offset, surLen); + int offset = surLen; + while (offset < asyncByte.Length) + { + block = this.Write(asyncByte, ref offset); + byteBlocks.Add(block); + } + + if (byteBlocks.Count > 10) + { + break; + } + } + else//本次能完成写入 + { + block.Write(asyncByte.Buffer, asyncByte.Offset, asyncByte.Length); + if (byteBlocks.Count > 10) + { + break; + } + } + } + else + { + if (byteBlocks.Count > 0) + { + break; + } + else + { + return false; + } + } + } + return true; + } + + private ByteBlock Write(QueueDataBytes transferByte, ref int offset) + { + ByteBlock block = BytePool.Default.GetByteBlock(this.bufferLength, true); + int len = Math.Min(transferByte.Length - offset, this.bufferLength); + block.Write(transferByte.Buffer, offset, len); + offset += len; + + return block; + } + } + + /// + /// Udp数据处理适配器测试 + /// + public class UdpDataAdapterTester : IDisposable + { + private readonly IntelligentDataQueue asyncBytes; + private UdpDataHandlingAdapter adapter; + private int count; + private bool dispose; + private int expectedCount; + private Action receivedCallBack; + private Stopwatch stopwatch; + private int timeout; + + private UdpDataAdapterTester(int multiThread) + { + this.asyncBytes = new IntelligentDataQueue(1024 * 1024 * 10); + for (int i = 0; i < multiThread; i++) + { + EasyTask.Run(this.BeginSend); + } + } + + /// + /// 获取测试器 + /// + /// 待测试适配器 + /// 并发多线程数量 + /// 收到数据回调 + /// + public static UdpDataAdapterTester CreateTester(UdpDataHandlingAdapter adapter, int multiThread, Action receivedCallBack = default) + { + var tester = new UdpDataAdapterTester(multiThread); + tester.adapter = adapter; + adapter.SendCallBack = tester.SendCallback; + adapter.ReceivedCallBack = tester.OnReceived; + tester.receivedCallBack = receivedCallBack; + return tester; + } + + /// + /// 释放 + /// + public void Dispose() + { + this.dispose = true; + } + + /// + /// 模拟测试运行发送 + /// + /// + /// + /// + /// 测试次数 + /// 期待测试次数 + /// 超时 + /// + public TimeSpan Run(byte[] buffer, int offset, int length, int testCount, int expectedCount, int timeout) + { + this.count = 0; + this.expectedCount = expectedCount; + this.timeout = timeout; + this.stopwatch = new Stopwatch(); + this.stopwatch.Start(); + EasyTask.Run(() => + { + for (int i = 0; i < testCount; i++) + { + this.adapter.SendInput(null, buffer, offset, length); + } + }); + if (SpinWait.SpinUntil(() => this.count == this.expectedCount, this.timeout)) + { + this.stopwatch.Stop(); + return this.stopwatch.Elapsed; + } + + throw new TimeoutException(); + } + + /// + /// 模拟发送 + /// + /// + /// 测试次数 + /// 期待测试次数 + /// 超时 + public TimeSpan Run(byte[] buffer, int testCount, int expectedCount, int timeout) + { + return this.Run(buffer, 0, buffer.Length, testCount, expectedCount, timeout); + } + + private void BeginSend() + { + while (!this.dispose) + { + if (this.tryGet(out List byteBlocks)) + { + foreach (ByteBlock block in byteBlocks) + { + try + { + this.adapter.ReceivedInput(null, block); + } + finally + { + block.Dispose(); + } + } + } + else + { + Thread.Sleep(1); + } + } + } + + private void OnReceived(EndPoint endPoint, ByteBlock byteBlock, IRequestInfo requestInfo) + { + this.receivedCallBack?.Invoke(byteBlock, requestInfo); + Interlocked.Increment(ref this.count); + } + + private void SendCallback(EndPoint endPoint, byte[] buffer, int offset, int length) + { + var asyncByte = new QueueDataBytes(new byte[length], 0, length); + Array.Copy(buffer, offset, asyncByte.Buffer, 0, length); + this.asyncBytes.Enqueue(asyncByte); + } + + private bool tryGet(out List byteBlocks) + { + byteBlocks = new List(); + + while (this.asyncBytes.TryDequeue(out QueueDataBytes asyncByte)) + { + var block = new ByteBlock(asyncByte.Length); + block.Write(asyncByte.Buffer, asyncByte.Offset, asyncByte.Length); + byteBlocks.Add(block); + } + if (byteBlocks.Count > 0) + { + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs.meta new file mode 100644 index 0000000..117c3bb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Test/DataAdapterTester.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d6ff8aed32bf99a46a6a8e460b89b52c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp.meta new file mode 100644 index 0000000..0cdc929 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96bdd4cce26c57c4fb88da42f1e0c6bf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs new file mode 100644 index 0000000..767247f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 常规UDP数据处理适配器 + /// + public class NormalUdpDataHandlingAdapter : UdpDataHandlingAdapter + { + /// + /// + /// + public override bool CanSplicingSend => true; + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// + /// + /// + /// + protected override void PreviewReceived(EndPoint remoteEndPoint, ByteBlock byteBlock) + { + this.GoReceived(remoteEndPoint, byteBlock, null); + } + + /// + /// + /// + /// + /// + /// + /// + protected override void PreviewSend(EndPoint endPoint, byte[] buffer, int offset, int length) + { + this.GoSend(endPoint, buffer, offset, length); + } + + /// + /// + /// + /// + /// + protected override void PreviewSend(EndPoint endPoint, IList> transferBytes) + { + int length = 0; + foreach (ArraySegment item in transferBytes) + { + length += item.Count; + } + + if (length > this.MaxPackageSize) + { + throw new OverlengthException("发送数据大于设定值,相同解析器可能无法收到有效数据,已终止发送"); + } + + using (var byteBlock = new ByteBlock(length)) + { + foreach (ArraySegment item in transferBytes) + { + byteBlock.Write(item.Array, item.Offset, item.Count); + } + this.GoSend(endPoint, byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + throw new System.NotImplementedException(); + } + + /// + /// + /// + protected override void Reset() + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..be0fdf3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/NormalUdpDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 09a63a9de6a753040bf106525e9c6f6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs new file mode 100644 index 0000000..59e29d3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs @@ -0,0 +1,182 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Net; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// Udp数据处理适配器 + /// + public abstract class UdpDataHandlingAdapter + { + internal IUdpSession m_owner; + + /// + /// 是否允许发送对象。 + /// + public abstract bool CanSendRequestInfo { get; } + + /// + /// 拼接发送 + /// + public abstract bool CanSplicingSend { get; } + + /// + /// 获取或设置适配器能接收的最大数据包长度。默认1024*1024 Byte。 + /// + public int MaxPackageSize { get; set; } = 1024 * 1024; + + /// + /// 适配器拥有者。 + /// + public IUdpSession Owner => this.m_owner; + + /// + /// 当接收数据处理完成后,回调该函数执行接收 + /// + public Action ReceivedCallBack { get; set; } + + /// + /// 当接收数据处理完成后,回调该函数执行发送 + /// + public Action SendCallBack { get; set; } + + /// + /// 收到数据的切入点,该方法由框架自动调用。 + /// + /// + /// + public void ReceivedInput(EndPoint remoteEndPoint, ByteBlock byteBlock) + { + try + { + this.PreviewReceived(remoteEndPoint, byteBlock); + } + catch (Exception ex) + { + this.OnError(ex.Message); + } + } + + /// + /// 发送数据的切入点,该方法由框架自动调用。 + /// + /// + public void SendInput(IRequestInfo requestInfo) + { + this.PreviewSend(requestInfo); + } + + /// + /// 发送数据的切入点,该方法由框架自动调用。 + /// + /// + /// + /// + /// + public void SendInput(EndPoint endPoint, byte[] buffer, int offset, int length) + { + this.PreviewSend(endPoint, buffer, offset, length); + } + + /// + /// 发送数据的切入点,该方法由框架自动调用。 + /// + /// + /// + public void SendInput(EndPoint endPoint, IList> transferBytes) + { + this.PreviewSend(endPoint, transferBytes); + } + + /// + /// 处理已经经过预先处理后的数据 + /// + /// + /// 以二进制形式传递 + /// 以解析实例传递 + protected void GoReceived(EndPoint remoteEndPoint, ByteBlock byteBlock, IRequestInfo requestInfo) + { + this.ReceivedCallBack.Invoke(remoteEndPoint, byteBlock, requestInfo); + } + + /// + /// 发送已经经过预先处理后的数据 + /// + /// + /// + /// + /// + protected void GoSend(EndPoint endPoint, byte[] buffer, int offset, int length) + { + this.SendCallBack.Invoke(endPoint, buffer, offset, length); + } + + /// + /// 在解析时发生错误。 + /// + /// 错误异常 + /// 是否调用 + /// 是否记录日志 + protected virtual void OnError(string error, bool reset = true, bool log = true) + { + if (reset) + { + this.Reset(); + } + if (log && this.m_owner != null && this.m_owner.Logger != null) + { + this.m_owner.Logger.Error(error); + } + } + + /// + /// 当接收到数据后预先处理数据,然后调用处理数据 + /// + /// + /// + protected abstract void PreviewReceived(EndPoint remoteEndPoint, ByteBlock byteBlock); + + /// + /// 当发送数据前预先处理数据 + /// + /// + protected abstract void PreviewSend(IRequestInfo requestInfo); + + /// + /// 当发送数据前预先处理数据 + /// + /// + /// 数据 + /// 偏移 + /// 长度 + protected abstract void PreviewSend(EndPoint endPoint, byte[] buffer, int offset, int length); + + /// + /// 组合发送预处理数据, + /// 当属性SplicingSend实现为True时,系统才会调用该方法。 + /// + /// + /// 代发送数据组合 + protected abstract void PreviewSend(EndPoint endPoint, IList> transferBytes); + + /// + /// 重置解析器到初始状态,一般在被触发时,由返回值指示是否调用。 + /// + protected abstract void Reset(); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs.meta new file mode 100644 index 0000000..12c772d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpDataHandlingAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 843a8042cd65709489e70b0a169bf6d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs new file mode 100644 index 0000000..dc19651 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Net; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// UdpKcpPackageAdapter + /// + public class UdpKcpPackageAdapter : NormalUdpDataHandlingAdapter + { + /// + protected override void PreviewReceived(EndPoint remoteEndPoint, ByteBlock byteBlock) + { + base.PreviewReceived(remoteEndPoint, byteBlock); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs.meta new file mode 100644 index 0000000..e684b60 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpKcpPackageAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5dc1d4cfb2721bf4387865946fce87c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs new file mode 100644 index 0000000..c33fb6c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs @@ -0,0 +1,388 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Net; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// UDP数据帧 + /// + public struct UdpFrame + { + /// + /// Crc校验 + /// + public byte[] Crc { get; set; } + + /// + /// 数据 + /// + public byte[] Data { get; set; } + + /// + /// 是否为终结帧 + /// + public bool FIN { get; set; } + + /// + /// 数据ID + /// + public long ID { get; set; } + + /// + /// 帧序号 + /// + public ushort SN { get; set; } + + /// + /// 解析 + /// + /// + /// + /// + /// + public bool Parse(byte[] buffer, int offset, int length) + { + if (length > 11) + { + this.ID = TouchSocketBitConverter.Default.ToInt64(buffer, offset); + this.SN = TouchSocketBitConverter.Default.ToUInt16(buffer, 8 + offset); + this.FIN = buffer[10 + offset].GetBit(7) == 1; + if (this.FIN) + { + if (length > 13) + { + this.Data = new byte[length - 13]; + } + else + { + this.Data = new byte[0]; + } + this.Crc = new byte[2] { buffer[length - 2], buffer[length - 1] }; + } + else + { + this.Data = new byte[length - 11]; + } + + Array.Copy(buffer, 11, this.Data, 0, this.Data.Length); + return true; + } + return false; + } + } + + /// + /// UDP数据包 + /// + [System.Diagnostics.DebuggerDisplay("Count={Count}")] + public class UdpPackage + { + private readonly ConcurrentQueue m_frames; + private readonly Timer m_timer; + private int m_count; + private int m_length; + + private int m_mtu; + + /// + /// 构造函数 + /// + /// + /// + /// + public UdpPackage(long id, int timeout, ConcurrentDictionary revStore) + { + this.ID = id; + this.m_frames = new ConcurrentQueue(); + this.m_timer = new Timer((o) => + { + if (revStore.TryRemove(this.ID, out UdpPackage udpPackage)) + { + udpPackage.m_frames.Clear(); + } + }, null, timeout, Timeout.Infinite); + } + + /// + /// 当前长度 + /// + public int Count => this.m_count; + + /// + /// Crc + /// + public byte[] Crc { get; private set; } + + /// + /// 包唯一标识 + /// + public long ID { get; } + + /// + /// 是否已完成 + /// + public bool IsComplated => this.TotalCount > 0 ? (this.TotalCount == this.m_count ? true : false) : false; + + /// + /// 当前数据长度 + /// + public int Length => this.m_length; + + /// + /// MTU + /// + public int MTU => this.m_mtu + 11; + + /// + /// 总长度,在收到最后一帧之前,为-1。 + /// + public int TotalCount { get; private set; } = -1; + + /// + /// 添加帧 + /// + /// + public void Add(UdpFrame frame) + { + Interlocked.Increment(ref this.m_count); + + if (frame.FIN) + { + this.TotalCount = frame.SN + 1; + this.Crc = frame.Crc; + } + Interlocked.Add(ref this.m_length, frame.Data.Length); + if (frame.SN == 0) + { + this.m_mtu = frame.Data.Length; + } + this.m_frames.Enqueue(frame); + } + + /// + /// 获得数据 + /// + /// + /// + public bool TryGetData(ByteBlock byteBlock) + { + while (this.m_frames.TryDequeue(out UdpFrame frame)) + { + byteBlock.Pos = frame.SN * this.m_mtu; + byteBlock.Write(frame.Data); + } + + if (byteBlock.Len != this.Length) + { + return false; + } + byte[] crc = TouchSocket.Core.Crc.Crc16(byteBlock.Buffer, 0, byteBlock.Len); + if (crc[0] != this.Crc[0] || crc[1] != this.Crc[1]) + { + return false; + } + + return true; + } + } + + /// + /// UDP数据包的适配器 + /// + public class UdpPackageAdapter : UdpDataHandlingAdapter + { + private readonly SnowflakeIDGenerator m_iDGenerator; + private readonly ConcurrentDictionary revStore; + private int m_mtu = 1472; + + /// + /// 构造函数 + /// + public UdpPackageAdapter() + { + this.revStore = new ConcurrentDictionary(); + this.m_iDGenerator = new SnowflakeIDGenerator(4); + } + + /// + /// + /// + public override bool CanSendRequestInfo => false; + + /// + /// + /// + public override bool CanSplicingSend => true; + + /// + /// 最大传输单元 + /// + public int MTU + { + get => this.m_mtu + 11; + set => this.m_mtu = value > 11 ? value : 1472; + } + + /// + /// 接收超时时间,默认5000ms + /// + public int Timeout { get; set; } = 5000; + + /// + /// + /// + /// + /// + protected override void PreviewReceived(EndPoint remoteEndPoint, ByteBlock byteBlock) + { + var udpFrame = new UdpFrame(); + if (udpFrame.Parse(byteBlock.Buffer, 0, byteBlock.Len)) + { + UdpPackage udpPackage = this.revStore.GetOrAdd(udpFrame.ID, (i) => new UdpPackage(i, this.Timeout, this.revStore)); + udpPackage.Add(udpFrame); + if (udpPackage.Length > this.MaxPackageSize) + { + this.revStore.TryRemove(udpPackage.ID, out _); + this.m_owner?.Logger.Error("数据长度大于设定的最大值。"); + return; + } + if (udpPackage.IsComplated) + { + if (this.revStore.TryRemove(udpPackage.ID, out _)) + { + using (var block = new ByteBlock(udpPackage.Length)) + { + if (udpPackage.TryGetData(block)) + { + this.GoReceived(remoteEndPoint, block, null); + } + } + } + } + } + } + + /// + /// + /// + /// + /// + /// + /// + protected override void PreviewSend(EndPoint endPoint, byte[] buffer, int offset, int length) + { + if (length > this.MaxPackageSize) + { + throw new OverlengthException("发送数据大于设定值,相同解析器可能无法收到有效数据,已终止发送"); + } + long id = this.m_iDGenerator.NextID(); + int off = 0; + int surLen = length; + int freeRoom = this.m_mtu - 11; + ushort sn = 0; + /*|********|**|*|n|*/ + /*|********|**|*|**|*/ + while (surLen > 0) + { + byte[] data = new byte[this.m_mtu]; + Buffer.BlockCopy(TouchSocketBitConverter.Default.GetBytes(id), 0, data, 0, 8); + Buffer.BlockCopy(TouchSocketBitConverter.Default.GetBytes(sn++), 0, data, 8, 2); + if (surLen > freeRoom)//有余 + { + Buffer.BlockCopy(buffer, off, data, 11, freeRoom); + off += freeRoom; + surLen -= freeRoom; + this.GoSend(endPoint, data, 0, this.m_mtu); + } + else if (surLen + 2 <= freeRoom)//结束且能容纳Crc + { + byte flag = 0; + data[10] = flag.SetBit(7, 1);//设置终结帧 + + Buffer.BlockCopy(buffer, off, data, 11, surLen); + Buffer.BlockCopy(Crc.Crc16(buffer, offset, length), 0, data, 11 + surLen, 2); + + this.GoSend(endPoint, data, 0, surLen + 11 + 2); + + off += surLen; + surLen -= surLen; + } + else//结束但不能容纳Crc + { + Buffer.BlockCopy(buffer, off, data, 11, surLen); + this.GoSend(endPoint, data, 0, surLen + 11); + off += surLen; + surLen -= surLen; + + byte[] finData = new byte[13]; + Buffer.BlockCopy(TouchSocketBitConverter.Default.GetBytes(id), 0, finData, 0, 8); + Buffer.BlockCopy(TouchSocketBitConverter.Default.GetBytes(sn++), 0, finData, 8, 2); + byte flag = 0; + finData[10] = flag.SetBit(7, 1); + Buffer.BlockCopy(Crc.Crc16(buffer, offset, length), 0, finData, 11, 2); + this.GoSend(endPoint, finData, 0, finData.Length); + } + } + } + + /// + /// + /// + /// + /// + protected override void PreviewSend(EndPoint endPoint, IList> transferBytes) + { + int length = 0; + foreach (ArraySegment item in transferBytes) + { + length += item.Count; + } + + if (length > this.MaxPackageSize) + { + throw new OverlengthException("发送数据大于设定值,相同解析器可能无法收到有效数据,已终止发送"); + } + + using (var byteBlock = new ByteBlock(length)) + { + foreach (ArraySegment item in transferBytes) + { + byteBlock.Write(item.Array, item.Offset, item.Count); + } + this.PreviewSend(endPoint, byteBlock.Buffer, 0, byteBlock.Len); + } + } + + /// + /// + /// + /// + protected override void PreviewSend(IRequestInfo requestInfo) + { + throw new NotImplementedException(); + } + + /// + /// + /// + protected override void Reset() + { + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs.meta new file mode 100644 index 0000000..3879b38 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DataAdapter/Udp/UdpPackageAdapter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21c33c5b9a0022b479cfaac1383605d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs new file mode 100644 index 0000000..97bc068 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs @@ -0,0 +1,85 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Net; +using TouchSocket.Core; +using TouchSocket.Sockets; + +/// +/// 显示信息 +/// +/// +/// +public delegate void MessageEventHandler(TClient client, MsgEventArgs e); + +/// +/// 普通通知 +/// +/// +/// +/// +public delegate void TouchSocketEventHandler(TClient client, TouchSocketEventArgs e); + +/// +/// ID修改通知 +/// +/// +/// +/// +public delegate void IDChangedEventHandler(TClient client, IDChangedEventArgs e); + +/// +/// Connecting +/// +/// +/// +/// +public delegate void ConnectingEventHandler(TClient client, ConnectingEventArgs e); + +/// +/// 客户端断开连接 +/// +/// +/// +/// +public delegate void DisconnectEventHandler(TClient client, DisconnectEventArgs e); + +/// +/// 正在连接事件 +/// +/// +/// +/// +public delegate void OperationEventHandler(TClient client, OperationEventArgs e); + +/// +/// 插件数据 +/// +/// +/// +public delegate void PluginReceivedEventHandler(TClient client, ReceivedDataEventArgs e); + +/// +/// 普通数据 +/// +/// +/// +/// +public delegate void ReceivedEventHandler(TClient client, ByteBlock byteBlock, IRequestInfo requestInfo); + +/// +/// UDP接收 +/// +/// +/// +/// +public delegate void UdpReceivedEventHandler(EndPoint endpoint, ByteBlock byteBlock, IRequestInfo requestInfo); \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs.meta new file mode 100644 index 0000000..779b7e8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/DelegateCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 452953be55d513546adee1a6d98eb46c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum.meta new file mode 100644 index 0000000..d90467c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b7dceafd27255ae4c8d367ee023b543b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs new file mode 100644 index 0000000..a35f9e3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Sockets +{ + /// + /// 检查清理类型 + /// + public enum CheckClearType + { + /// + /// 仅统计发送 + /// + OnlySend, + + /// + /// 仅统计接收 + /// + OnlyReceive, + + /// + /// 全部 + /// + All + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs.meta new file mode 100644 index 0000000..4a455bb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/CheckClearType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8c95179e656afed4ea2016bea4f90a7f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs new file mode 100644 index 0000000..4a6b6ef --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 过滤结果 + /// + public enum FilterResult + { + /// + /// 缓存后续所有数据。 + /// + Cache, + + /// + /// 操作成功 + /// + Success, + + /// + /// 继续操作,一般原因是本次数据有部分无效,但已经调整了属性,所以继续后续解析。 + /// 或者想放弃当前数据的操作,直接设置相等即可。 + /// + GoOn + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs.meta new file mode 100644 index 0000000..d1814b3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FilterResult.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 008e752b6bfc8804fa1bdf35737fe2ab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs new file mode 100644 index 0000000..5a9a051 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Sockets +{ + /// + /// 固定包头类型 + /// + public enum FixedHeaderType : byte + { + /// + /// 以1Byte标识长度,最长接收255 + /// + Byte = 1, + + /// + /// 以2Byte标识长度,最长接收65535 + /// + Ushort = 2, + + /// + /// 以4Byte标识长度,最长接收2147483647 + /// + Int = 4 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs.meta new file mode 100644 index 0000000..7c27bf0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/FixedHeaderType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b77bdb0d9a90355428e86e7789938388 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs new file mode 100644 index 0000000..61f858e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Sockets +{ + /// + /// 接收类型 + /// + public enum ReceiveType : byte + { + /// + /// 该模式下会自动接收数据,然后主动触发。 + /// + Auto, + + /// + /// 在该模式下,不会投递接收申请,用户可通过,获取到流以后,自己处理接收。 + /// 注意:连接端不会感知主动断开 + /// + None + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs.meta new file mode 100644 index 0000000..f0e2381 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ReceiveType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fef8d9c93099b4347a7e3e015d072618 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs new file mode 100644 index 0000000..57206b9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Sockets +{ + /// + /// 服务器状态 + /// + public enum ServerState + { + /// + /// 无状态,指示为初建 + /// + None, + + /// + /// 正在运行 + /// + Running, + + /// + /// 运行遇到异常 + /// + Exception, + + /// + /// 已停止 + /// + Stopped, + + /// + /// 已释放 + /// + Disposed + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs.meta new file mode 100644 index 0000000..4b41d30 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Enum/ServerState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8262bf4706370341bb493fbbf8b92e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs.meta new file mode 100644 index 0000000..a0d6ff4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7af619a171d01e6419e70fb2af9fee9f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs new file mode 100644 index 0000000..07c1821 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 字节事件 + /// + public class ByteBlockEventArgs : TouchSocketEventArgs + { + /// + /// 构造函数 + /// + public ByteBlockEventArgs(ByteBlock byteBlock) + { + ByteBlock = byteBlock; + } + + /// + /// 数据块 + /// + public ByteBlock ByteBlock { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs.meta new file mode 100644 index 0000000..bfda08d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ByteBlockEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8c419c07a5aafd2429f5e6218570a233 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs new file mode 100644 index 0000000..1ebcd57 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 字节事件 + /// + public class BytesEventArgs : TouchSocketEventArgs + { + /// + /// 构造函数 + /// + /// + public BytesEventArgs(byte[] data) + { + ReceivedDataBytes = data; + } + + /// + /// 字节数组 + /// + public byte[] ReceivedDataBytes { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs.meta new file mode 100644 index 0000000..48ac6e3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/BytesEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8fbc48a7a2437247b31e87e0ce427dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs new file mode 100644 index 0000000..fa7c749 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// ConfigEventArgs + /// + public class ConfigEventArgs : TouchSocketEventArgs + { + /// + /// 实例化2ConfigEventArgs + /// + /// + public ConfigEventArgs(TouchSocketConfig config) + { + Config = config; + } + + /// + /// 具体配置 + /// + public TouchSocketConfig Config { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs.meta new file mode 100644 index 0000000..e4f642d --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConfigEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bfc98096a1f0c5148ad69b036b1b9198 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs new file mode 100644 index 0000000..295c2d7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Net.Sockets; + +namespace TouchSocket.Sockets +{ + /// + /// ClientConnectingEventArgs + /// + [Obsolete("此类已被弃用,请使用ConnectingEventArgs代替", true)] + public class ClientConnectingEventArgs : OperationEventArgs + { + + } + /// + /// 客户端连接事件。 + /// + public class ConnectingEventArgs : OperationEventArgs + { + private readonly Socket socket; + + /// + /// 构造函数 + /// + /// + public ConnectingEventArgs(Socket socket) + { + this.socket = socket; + } + + /// + /// 新初始化的通信器 + /// + public Socket Socket => socket; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs.meta new file mode 100644 index 0000000..933f686 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ConnectingEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7e7fec9e940255049846b8df4727ce7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs new file mode 100644 index 0000000..90cde6c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Sockets +{ + /// + /// 断开连接事件参数 + /// + public class DisconnectEventArgs : MsgEventArgs + { + /// + /// 构造函数 + /// + /// + /// + public DisconnectEventArgs(bool manual, string mes) : base(mes) + { + Manual = manual; + } + + /// + /// 是否为主动行为。 + /// + public bool Manual { get; private set; } + } + + /// + /// ClientDisconnectedEventArgs + /// + [Obsolete("该类型已被弃用,请使用DisconnectEventArgs替代。", true)] + public class ClientDisconnectedEventArgs : MsgEventArgs + { + + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs.meta new file mode 100644 index 0000000..995000f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/DisconnectEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df924347b83c7fa4a99f16694f9e662f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs new file mode 100644 index 0000000..ad266e7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs @@ -0,0 +1,43 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// IDChangedEventArgs + /// + public class IDChangedEventArgs : TouchSocketEventArgs + { + /// + /// IDChangedEventArgs + /// + /// + /// + public IDChangedEventArgs(string oldID, string newID) + { + OldID = oldID; + NewID = newID; + } + + /// + /// 旧ID + /// + public string OldID { get; private set; } + + /// + /// 新ID + /// + public string NewID { get; private set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs.meta new file mode 100644 index 0000000..5af59a4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/IDChangedEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6236d635ae6afb04ebc312176ad7e2ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs new file mode 100644 index 0000000..c8f00af --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 消息事件 + /// + public class MsgEventArgs : TouchSocketEventArgs + { + /// + /// 构造函数 + /// + /// + public MsgEventArgs(string mes) + { + Message = mes; + } + + /// + /// 构造函数 + /// + public MsgEventArgs() + { + } + + /// + /// 消息 + /// + public string Message { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs.meta new file mode 100644 index 0000000..9f35831 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/MsgEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2584c77073e0d4c4db00582fedba43f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs new file mode 100644 index 0000000..990d3ca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// ClientOperationEventArgs + /// + [Obsolete("此类已被弃用,请使用OperationEventArgs代替", true)] + public class ClientOperationEventArgs : TouchSocketEventArgs + { + + } + /// + /// Client消息操作事件 + /// + public class OperationEventArgs : TouchSocketEventArgs + { + /// + /// 构造函数 + /// + public OperationEventArgs() + { + IsPermitOperation = true; + } + + /// + /// 客户端ID + /// + public string ID { get; set; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs.meta new file mode 100644 index 0000000..180ec0c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/OperationEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6fcc8b8454cffac4c842301b5bc41d5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs new file mode 100644 index 0000000..57c74d3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 插件处理事件 + /// + public class ReceivedDataEventArgs : ByteBlockEventArgs + { + /// + /// 构造函数 + /// + /// + /// + public ReceivedDataEventArgs(ByteBlock byteBlock, IRequestInfo requestInfo) : base(byteBlock) + { + RequestInfo = requestInfo; + } + + /// + /// 对象载体 + /// + public IRequestInfo RequestInfo { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs.meta new file mode 100644 index 0000000..cd76868 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ReceivedDataEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6a0ce3917f5f64544b9dd7957a0c3033 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs new file mode 100644 index 0000000..e3ec471 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 发送事件 + /// + public class SendingEventArgs : TouchSocketEventArgs + { + /// + /// 构造函数 + /// + /// + /// + /// + public SendingEventArgs(byte[] buffer, int offset, int length) + { + Buffer = buffer; + Offset = offset; + Length = length; + IsPermitOperation = true; + } + + /// + /// 数据缓存区,该属性获取来自于内存池,所以最好不要引用该对象,可以同步使用该对象 + /// + public byte[] Buffer { get; } + + /// + /// 缓存偏移 + /// + public int Offset { get; } + + /// + /// 数据长度 + /// + public int Length { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs.meta new file mode 100644 index 0000000..12e636f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/SendingEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5a25eb7730b96fb49a659a7a79567913 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs new file mode 100644 index 0000000..0f69376 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 服务器状态事件参数 + /// + public class ServiceStateEventArgs: MsgEventArgs + { + /// + /// 服务器状态事件参数 + /// + /// + /// + public ServiceStateEventArgs(ServerState serverState,Exception exception) + { + ServerState = serverState; + Exception = exception; + } + + /// + /// 服务器状态 + /// + public ServerState ServerState { get; } + + /// + /// 异常类 + /// + public Exception Exception { get; } + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs.meta new file mode 100644 index 0000000..ded18d3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/ServiceStateEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 403dd2685bf7f3240a23fdd120437372 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs new file mode 100644 index 0000000..b836dca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Net; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// Udp接收消息 + /// + public class UdpReceivedDataEventArgs : ReceivedDataEventArgs + { + /// + /// 构造函数 + /// + /// + /// + /// + public UdpReceivedDataEventArgs(EndPoint endPoint, ByteBlock byteBlock, IRequestInfo requestInfo) : base(byteBlock, requestInfo) + { + EndPoint = endPoint; + } + + /// + /// 接收终结点 + /// + public EndPoint EndPoint { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs.meta new file mode 100644 index 0000000..9b0f2f4 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/EventArgs/UdpReceivedDataEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 387ef5547454db84a8c5a3bc8fd685fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions.meta new file mode 100644 index 0000000..9228d03 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b51e6d05d6712e84da1fa9d6c1c36704 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs new file mode 100644 index 0000000..9457e75 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Sockets +{ + /// + /// 没有找到ID对应的客户端 + /// + [Serializable] + public class ClientNotFindException : Exception + { + /// + /// 构造函数 + /// + public ClientNotFindException() + { } + + /// + /// 构造函数 + /// + /// + public ClientNotFindException(string message) : base(message) { } + + /// + /// 构造函数 + /// + /// + /// + public ClientNotFindException(string message, System.Exception inner) : base(message, inner) { } + + /// + /// 构造函数 + /// + /// + /// + protected ClientNotFindException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs.meta new file mode 100644 index 0000000..51688fb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/ClientNotFindException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6685537e2e59b24797e51a138ab56dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs new file mode 100644 index 0000000..b9e0098 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Sockets +{ + /// + /// 未连接异常 + /// + [Serializable] + public class NotConnectedException : Exception + { + /// + /// 构造函数 + /// + public NotConnectedException() + { } + + /// + /// 构造函数 + /// + /// + public NotConnectedException(string message) : base(message) { } + + /// + /// 构造函数 + /// + /// + /// + public NotConnectedException(string message, System.Exception inner) : base(message, inner) { } + + /// + /// 构造函数 + /// + /// + /// + protected NotConnectedException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs.meta new file mode 100644 index 0000000..f6d58cb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/NotConnectedException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c2603bd55ea7054f88922edbdc71b64 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs new file mode 100644 index 0000000..f196183 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; + +namespace TouchSocket.Sockets +{ + /// + /// 超长异常 + /// + [Serializable] + public class OverlengthException : Exception + { + /// + /// 构造函数 + /// + public OverlengthException() + { } + + /// + /// 构造函数 + /// + /// + public OverlengthException(string message) : base(message) { } + + /// + /// 构造函数 + /// + /// + /// + public OverlengthException(string message, System.Exception inner) : base(message, inner) { } + + /// + /// 构造函数 + /// + /// + /// + protected OverlengthException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs.meta new file mode 100644 index 0000000..4968ced --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Exceptions/OverlengthException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e24bf9b6d48ff84f95af3414dc19008 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions.meta new file mode 100644 index 0000000..ec065bd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f257691459204f4c883fc6e4168d460 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs new file mode 100644 index 0000000..cadb918 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs @@ -0,0 +1,157 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 客户端扩展类 + /// + public static class ClientExtension + { + /// + /// 获取相关信息。格式: + ///IPPort=IP:Port,ID=id,Protocol=Protocol + /// + /// + /// + /// + public static string GetInfo(this T client) where T : ISocketClient + { + return $"IP&Port={client.IP}:{client.Port},ID={client.ID},Protocol={client.Protocol}"; + } + + /// + /// 获取服务器中,除自身以外的所有客户端id + /// + /// + /// + /// + public static IEnumerable GetOtherIDs(this T client) where T : ISocketClient + { + return client.Service.GetIDs().Where(id => id != client.ID); + } + + /// + /// 获取最后活动时间。即的最近值。 + /// + /// + /// + /// + public static DateTime GetLastActiveTime(this T client) where T : IClient + { + return client.LastSendTime > client.LastReceivedTime ? client.LastSendTime : client.LastReceivedTime; + } + + /// + /// 安全性发送关闭报文 + /// + /// + /// + /// + public static bool TryShutdown(this T client, SocketShutdown how = SocketShutdown.Both) where T : ITcpClientBase + { + try + { + if (!client.MainSocket.Connected) + { + return false; + } + client?.MainSocket?.Shutdown(how); + return true; + } + catch + { + } + + return false; + } + + /// + /// 安全性关闭。不会抛出异常。 + /// + /// + /// + /// + public static void SafeClose(this T client, string msg) where T : ITcpClientBase + { + try + { + client.Close(msg); + } + catch + { + } + } + + /// + /// 获取IP和端口。 + /// + /// + /// + /// + public static string GetIPPort(this T client) where T : ITcpClientBase + { + return $"{client.IP}:{client.Port}"; + } + + #region 连接 + + /// + /// 尝试连接。不会抛出异常。 + /// + /// + /// + /// + /// + public static Result TryConnect(this TClient client, int timeout = 5000) where TClient : ITcpClient + { + try + { + client.Connect(timeout); + return new Result(ResultCode.Success); + } + catch (Exception ex) + { + return new Result(ResultCode.Exception, ex.Message); + } + } + + /// + /// 尝试连接。不会抛出异常。 + /// + /// + /// + /// + /// + public static async Task TryConnectAsync(this TClient client, int timeout = 5000) where TClient : ITcpClient + { + try + { + await client.ConnectAsync(timeout); + return new Result(ResultCode.Success); + } + catch (Exception ex) + { + return new Result(ResultCode.Exception, ex.Message); + } + } + + #endregion 连接 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs.meta new file mode 100644 index 0000000..84247f6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/ClientExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4417f7ddff319e3459ba52910ed6f86b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs new file mode 100644 index 0000000..b2b410e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs @@ -0,0 +1,353 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// SenderExtension + /// + public static class SenderExtension + { + #region ISend + + /// + /// 同步发送数据。 + /// + /// + /// + /// + public static void Send(this TClient client, byte[] buffer) where TClient : ISender + { + client.Send(buffer, 0, buffer.Length); + } + + /// + /// 同步发送数据。 + /// + /// + /// + /// + public static void Send(this TClient client, ByteBlock byteBlock) where TClient : ISender + { + client.Send(byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 以UTF-8的编码同步发送字符串。 + /// + /// + /// + /// + public static void Send(this TClient client, string value) where TClient : ISender + { + client.Send(Encoding.UTF8.GetBytes(value)); + } + + /// + /// 异步发送数据。 + /// + /// + /// + /// + public static Task SendAsync(this TClient client, byte[] buffer) where TClient : ISender + { + return client.SendAsync(buffer, 0, buffer.Length); + } + + /// + /// 以UTF-8的编码异步发送字符串。 + /// + /// + /// + /// + public static Task SendAsync(this TClient client, string value) where TClient : ISender + { + return client.SendAsync(Encoding.UTF8.GetBytes(value)); + } + + #endregion ISend + + #region IDefaultSender + + /// + /// 以UTF-8的编码同步发送字符串。 + /// + /// + /// + /// + public static void DefaultSend(this TClient client, string value) where TClient : IDefaultSender + { + client.DefaultSend(Encoding.UTF8.GetBytes(value)); + } + + /// + /// 同步发送数据。 + /// + /// + /// + /// + public static void DefaultSend(this TClient client, byte[] buffer) where TClient : IDefaultSender + { + client.DefaultSend(buffer, 0, buffer.Length); + } + + /// + /// 同步发送数据。 + /// + /// + /// + /// + public static void DefaultSend(this TClient client, ByteBlock byteBlock) where TClient : IDefaultSender + { + client.DefaultSend(byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 以UTF-8的编码异步发送字符串。 + /// + /// + /// + /// + public static Task DefaultSendAsync(this TClient client, string value) where TClient : IDefaultSender + { + return client.DefaultSendAsync(Encoding.UTF8.GetBytes(value)); + } + + /// + /// 异步发送数据。 + /// + /// + /// + /// + public static Task DefaultSendAsync(this TClient client, byte[] buffer) where TClient : IDefaultSender + { + return client.DefaultSendAsync(buffer, 0, buffer.Length); + } + + #endregion IDefaultSender + + #region IIDSender + + /// + /// 以UTF-8的编码同步发送字符串。 + /// + /// + /// + /// + /// + public static void Send(this TClient client, string id, string value) where TClient : IIDSender + { + client.Send(id, Encoding.UTF8.GetBytes(value)); + } + + /// + /// 同步发送数据。 + /// + /// + /// + /// + /// + public static void Send(this TClient client, string id, byte[] buffer) where TClient : IIDSender + { + client.Send(id, buffer, 0, buffer.Length); + } + + /// + /// 同步发送数据。 + /// + /// + /// + /// + /// + public static void Send(this TClient client, string id, ByteBlock byteBlock) where TClient : IIDSender + { + client.Send(id, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 以UTF-8的编码异步发送字符串。 + /// + /// + /// + /// + /// + public static Task SendAsync(this TClient client, string id, string value) where TClient : IIDSender + { + return client.SendAsync(id, Encoding.UTF8.GetBytes(value)); + } + + /// + /// 异步发送数据。 + /// + /// + /// + /// + /// + public static Task SendAsync(this TClient client, string id, byte[] buffer) where TClient : IIDSender + { + return client.SendAsync(id, buffer, 0, buffer.Length); + } + + #endregion IIDSender + + #region IUdpDefaultSender + + /// + /// 以UTF-8的编码同步发送字符串。 + /// + /// + /// + /// + /// + public static void DefaultSend(this TClient client, EndPoint endPoint, string value) where TClient : IUdpDefaultSender + { + if (value is null) + { + throw new ArgumentNullException(nameof(value)); + } + + client.DefaultSend(endPoint, Encoding.UTF8.GetBytes(value)); + } + + /// + /// 绕过适配器,直接发送字节流 + /// + /// + /// 目的终结点 + /// 数据区 + /// 发送数据超长 + /// 其他异常 + public static void DefaultSend(this TClient client, EndPoint endPoint, byte[] buffer) + where TClient : IUdpDefaultSender + { + client.DefaultSend(endPoint, buffer, 0, buffer.Length); + } + + /// + /// 以UTF-8的编码异步发送字符串。 + /// + /// + /// + /// + /// + public static Task DefaultSendAsync(this TClient client, EndPoint endPoint, string value) where TClient : IUdpDefaultSender + { + return client.DefaultSendAsync(endPoint, Encoding.UTF8.GetBytes(value)); + } + + /// + /// 绕过适配器,直接发送字节流 + /// + /// + /// 目的终结点 + /// 数据缓存区 + /// 发送数据超长 + /// 其他异常 + public static Task DefaultSendAsync(this TClient client, EndPoint endPoint, byte[] buffer) + where TClient : IUdpDefaultSender + { + return client.DefaultSendAsync(endPoint, buffer, 0, buffer.Length); + } + + /// + /// 绕过适配器,直接发送字节流 + /// + /// + /// 目的终结点 + /// + /// 发送数据超长 + /// 其他异常 + public static Task DefaultSendAsync(this TClient client, EndPoint endPoint, ByteBlock byteBlock) + where TClient : IUdpDefaultSender + { + return client.DefaultSendAsync(endPoint, byteBlock.Buffer, 0, byteBlock.Len); + } + + #endregion IUdpDefaultSender + + #region IUdpClientSender + + /// + /// 以UTF-8的编码同步发送字符串。 + /// + /// + /// + /// + /// + public static void Send(this TClient client, EndPoint endPoint, string value) where TClient : IUdpClientSender + { + client.Send(endPoint, Encoding.UTF8.GetBytes(value)); + } + + /// + /// 发送字节流 + /// + /// + /// 目的终结点 + /// 数据区 + /// 发送数据超长 + /// 其他异常 + public static void Send(this TClient client, EndPoint endPoint, byte[] buffer) + where TClient : IUdpClientSender + { + client.Send(endPoint, buffer, 0, buffer.Length); + } + + /// + /// 发送字节流 + /// + /// + /// 目的终结点 + /// 数据区 + /// 发送数据超长 + /// 其他异常 + public static void Send(this TClient client, EndPoint endPoint, ByteBlock byteBlock) + where TClient : IUdpClientSender + { + client.Send(endPoint, byteBlock.Buffer, 0, byteBlock.Len); + } + + /// + /// 以UTF-8的编码异步发送字符串。 + /// + /// + /// + /// + /// + public static Task SendAsync(this TClient client, EndPoint endPoint, string value) where TClient : IUdpClientSender + { + return client.SendAsync(endPoint, Encoding.UTF8.GetBytes(value)); + } + + /// + /// 发送字节流 + /// + /// + /// 目的终结点 + /// 数据缓存区 + /// 发送数据超长 + /// 其他异常 + public static Task SendAsync(this TClient client, EndPoint endPoint, byte[] buffer) + where TClient : IUdpClientSender + { + return client.SendAsync(endPoint, buffer, 0, buffer.Length); + } + + #endregion IUdpClientSender + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs.meta new file mode 100644 index 0000000..43168a9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SenderExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ddc2a32424fd91f4cac4504b04bff6ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs new file mode 100644 index 0000000..fb621ab --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Sockets; + +namespace TouchSocket.Sockets +{ + /// + /// SocketExtension + /// + public static class SocketExtension + { + /// + /// 会使用同步锁,保证所有数据上缓存区。 + /// + /// + /// + /// + /// + public static void AbsoluteSend(this Socket socket, byte[] buffer, int offset, int length) + { + lock (socket) + { + while (length > 0) + { + int r = socket.Send(buffer, offset, length, SocketFlags.None); + if (r == 0 && length > 0) + { + throw new Exception("发送数据不完全"); + } + offset += r; + length -= r; + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs.meta new file mode 100644 index 0000000..c0692fe --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c07982b1783a42144901507b93627be6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs new file mode 100644 index 0000000..17fa303 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs @@ -0,0 +1,138 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using TouchSocket.Sockets; + +namespace TouchSocket.Core +{ + /// + /// IPluginsManagerExtension + /// + public static class SocketPluginsManagerExtension + { + /// + /// 使用断线重连。 + /// 该效果仅客户端在完成首次连接,且为被动断开时有效。 + /// + /// + /// 成功回调函数 + /// 尝试重连次数,设为-1时则永远尝试连接 + /// 是否输出日志。 + /// 失败时,停留时间 + /// + public static IPluginsManager UseReconnection(this IPluginsManager pluginsManager, int tryCount = 10, + bool printLog = false, int sleepTime = 1000, Action successCallback = null) + { + bool first = true; + var reconnectionPlugin = new ReconnectionPlugin(client => + { + int tryT = tryCount; + while (tryCount < 0 || tryT-- > 0) + { + try + { + if (client.Online) + { + return true; + } + else + { + if (first) Thread.Sleep(1000); + first = false; + client.Connect(); + first = true; + } + successCallback?.Invoke(client); + return true; + } + catch (Exception ex) + { + if (printLog) + { + client.Logger.Log(LogType.Error, client, "断线重连失败。", ex); + } + Thread.Sleep(sleepTime); + } + } + return true; + }); + + pluginsManager.Add(reconnectionPlugin); + return pluginsManager; + } + + /// + /// 检查连接客户端活性插件。 + /// 当在设置的周期内,没有接收/发送任何数据,则判定该客户端掉线。执行清理。默认配置:60秒为一个周期,同时检测发送和接收。 + /// 仅服务器适用。 + /// + /// + /// + public static CheckClearPlugin UseCheckClear(this IPluginsManager pluginsManager) + { + return pluginsManager.Add(); + } + + /// + /// 使用断线重连。 + /// 该效果仅客户端在完成首次连接,且为被动断开时有效。 + /// + /// + /// 失败时间隔时间 + /// 失败时回调(参数依次为:客户端,本轮尝试重连次数,异常信息)。如果回调为null或者返回false,则终止尝试下次连接。 + /// 成功连接时回调。 + /// + public static IPluginsManager UseReconnection(this IPluginsManager pluginsManager, int sleepTime, + Func failCallback, + Action successCallback) + { + bool first = true; + var reconnectionPlugin = new ReconnectionPlugin(client => + { + int tryT = 0; + while (true) + { + try + { + if (client.Online) + { + return true; + } + else + { + if (first) Thread.Sleep(1000); + first = false; + client.Connect(); + first = true; + } + + successCallback?.Invoke(client); + return true; + } + catch (Exception ex) + { + Thread.Sleep(sleepTime); + if (failCallback?.Invoke(client, ++tryT, ex) != true) + { + return true; + } + } + } + }); + + pluginsManager.Add(reconnectionPlugin); + return pluginsManager; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs.meta new file mode 100644 index 0000000..105fa91 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Extensions/SocketPluginsManagerExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bcde893882eda443b4706fc68a52ce7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface.meta new file mode 100644 index 0000000..ccf6363 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 658a100b5ed78b54f8dc56e132392489 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs new file mode 100644 index 0000000..f3c149f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs @@ -0,0 +1,58 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 终端接口 + /// + public interface IClient : IDependencyObject, IDisposable + { + /// + /// 处理未经过适配器的数据。返回值表示是否继续向下传递。 + /// + Func OnHandleRawBuffer { get; set; } + + /// + /// 处理经过适配器后的数据。返回值表示是否继续向下传递。 + /// + Func OnHandleReceivedData { get; set; } + + /// + /// 日志记录器 + /// + ILog Logger { get; } + + /// + /// 终端协议 + /// + Protocol Protocol { get; set; } + + /// + /// 简单IOC容器 + /// + IContainer Container { get; } + + /// + /// 最后一次接收到数据的时间 + /// + DateTime LastReceivedTime { get; } + + /// + /// 最后一次发送数据的时间 + /// + DateTime LastSendTime { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs.meta new file mode 100644 index 0000000..922d706 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f04b03a500914634ebfa2749cdc4f9c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs new file mode 100644 index 0000000..c93cf80 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// INATSocketClient + /// + public interface INATSocketClient : ISocketClient + { + /// + /// 添加转发客户端。 + /// + /// 配置文件 + /// 当完成配置,但是还未连接时回调。 + /// + ITcpClient AddTargetClient(TouchSocketConfig config, Action setupAction = null); + + /// + /// 添加转发客户端。 + /// + /// 配置文件 + /// 当完成配置,但是还未连接时回调。 + /// + Task AddTargetClientAsync(TouchSocketConfig config, Action setupAction = null); + + /// + /// 获取所有目标客户端 + /// + /// + ITcpClient[] GetTargetClients(); + + /// + /// 发送数据到全部转发端。 + /// + /// + /// + /// + void SendToTargetClient(byte[] buffer, int offset, int length); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs.meta new file mode 100644 index 0000000..4d11d15 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/INATSocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aac16403d6d3e934280d930064bb4475 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs new file mode 100644 index 0000000..b2a180a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Sockets +{ + /// + /// 请求解析对象接口。 + ///此处接口设计借鉴SuperSocket,只为大家更好理解 + /// + public interface IRequestInfo + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs.meta new file mode 100644 index 0000000..459e20f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IRequestInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1f9ac3817e0d8b4bb611e3f18fe57a4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender.meta new file mode 100644 index 0000000..fc47734 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f3697fdea607b8418ca20b445bae42e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs new file mode 100644 index 0000000..a154a79 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// 客户端发送接口 + /// + public interface IClientSender : ISender, IRequsetInfoSender + { + /// + /// 同步组合发送数据。 + /// 内部已经封装Ssl和发送长度检测,即:调用完成即表示数据全部发送完毕。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 组合数据 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + void Send(IList> transferBytes); + + /// + /// 异步组合发送数据。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 组合数据 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + Task SendAsync(IList> transferBytes); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs.meta new file mode 100644 index 0000000..e895e79 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IClientSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 012fbc7046138f34d9b42d4e2f1ebfcb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs new file mode 100644 index 0000000..6e1fd6f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// 具有直接发送功能 + /// + public interface IDefaultSender + { + /// + /// 绕过适配器,直接发送字节流 + /// + /// 数据缓存区 + /// 偏移量 + /// 数据长度 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + void DefaultSend(byte[] buffer, int offset, int length); + + /// + /// 绕过适配器,直接发送字节流 + /// + /// 数据缓存区 + /// 偏移量 + /// 数据长度 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + Task DefaultSendAsync(byte[] buffer, int offset, int length); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs.meta new file mode 100644 index 0000000..bc918bb --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IDefaultSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 355214e7e2e3f4d489e54d49aeee2313 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs new file mode 100644 index 0000000..6b167c2 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs @@ -0,0 +1,49 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// IIDRequsetInfoSender + /// + public interface IIDRequsetInfoSender + { + /// + /// 同步发送数据。 + /// 内部已经封装Ssl和发送长度检测,即:调用完成即表示数据全部发送完毕。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// + /// 解析对象 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + void Send(string id, IRequestInfo requestInfo); + + /// + /// 异步发送数据。 + /// 时,如果使用独立线程发送,则不会触发异常。 + /// 时,相当于 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// + /// 解析对象 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + Task SendAsync(string id, IRequestInfo requestInfo); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs.meta new file mode 100644 index 0000000..3dbec4f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDRequsetInfoSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61ede631842cf304387e90c42604d76a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs new file mode 100644 index 0000000..cec5008 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs @@ -0,0 +1,67 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// 通过ID发送 + /// + public interface IIDSender + { + /// + /// 向对应ID的客户端发送 + /// + /// 目标ID + /// 数据 + /// 偏移 + /// 长度 + /// 未连接异常 + /// 未找到ID对应的客户端 + /// 其他异常 + void Send(string id, byte[] buffer, int offset, int length); + + /// + /// 向对应ID的客户端发送 + /// + /// 目标ID + /// 数据 + /// 偏移 + /// 长度 + /// 未连接异常 + /// 未找到ID对应的客户端 + /// 其他异常 + Task SendAsync(string id, byte[] buffer, int offset, int length); + + /// + /// 向对应ID的客户端发送 + /// + /// 目标ID + /// 数据对象 + /// 未连接异常 + /// 未找到ID对应的客户端 + /// 其他异常 + void Send(string id, IRequestInfo requestInfo); + + /// + /// 向对应ID的客户端发送 + /// + /// 目标ID + /// 数据对象 + /// 未连接异常 + /// 未找到ID对应的客户端 + /// 其他异常 + Task SendAsync(string id, IRequestInfo requestInfo); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs.meta new file mode 100644 index 0000000..e025086 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IIDSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 36c8f6577376cfa47b9413acd5f695df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs new file mode 100644 index 0000000..6734f41 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// IRequsetInfoSend + /// + public interface IRequsetInfoSender + { + /// + /// 同步发送数据。 + /// 内部已经封装Ssl和发送长度检测,即:调用完成即表示数据全部发送完毕。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 解析对象 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + void Send(IRequestInfo requestInfo); + + /// + /// 异步发送数据。 + /// 内部已经封装Ssl和发送长度检测,即:调用完成即表示数据全部发送完毕。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 解析对象 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + Task SendAsync(IRequestInfo requestInfo); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs.meta new file mode 100644 index 0000000..b145633 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IRequsetInfoSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9e2f06de2f55c34bb63479afac3e6a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs new file mode 100644 index 0000000..0a77a58 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// 具有发送功能的接口 + /// + public interface ISender : ISenderBase + { + /// + /// 同步发送数据。 + /// 内部已经封装Ssl和发送长度检测,即:调用完成即表示数据全部发送完毕。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 数据缓存区 + /// 偏移量 + /// 数据长度 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + void Send(byte[] buffer, int offset, int length); + + /// + /// 异步发送数据。 + /// 时,如果使用独立线程发送,则不会触发异常。 + /// 时,相当于 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 数据缓存区 + /// 偏移量 + /// 数据长度 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + Task SendAsync(byte[] buffer, int offset, int length); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs.meta new file mode 100644 index 0000000..7a54c4c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 842dccfce0ca7ce4c92dd9262311661e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs new file mode 100644 index 0000000..6b6ca33 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +namespace TouchSocket.Sockets +{ + /// + /// 具有发送动作的基类。 + /// + public interface ISenderBase + { + /// + /// 表示对象能否顺利执行发送操作。 + /// 由于高并发,当该值为True时,也不一定完全能执行。 + /// + bool CanSend { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs.meta new file mode 100644 index 0000000..44d0548 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/ISenderBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5eb102de2d3cc8f47a91a64d897ef96c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs new file mode 100644 index 0000000..22a6c5a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// 具有Udp终结点的发送 + /// + public interface IUdpClientSender : ISender + { + /// + /// 同步组合发送数据。 + /// 内部已经封装Ssl和发送长度检测,即:调用完成即表示数据全部发送完毕。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 远程终结点 + /// 组合数据 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + void Send(EndPoint endPoint, IList> transferBytes); + + /// + /// 异步组合发送数据。 + /// 时,如果使用独立线程发送,则不会触发异常。 + /// 时,相当于 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 远程终结点 + /// 组合数据 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + Task SendAsync(EndPoint endPoint, IList> transferBytes); + + /// + /// 同步组合发送数据。 + /// 内部已经封装Ssl和发送长度检测,即:调用完成即表示数据全部发送完毕。 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 远程终结点 + /// + /// + /// + /// 发送数据超长 + /// 其他异常 + void Send(EndPoint endPoint, byte[] buffer, int offset, int length); + + /// + /// 异步组合发送数据。 + /// 时,如果使用独立线程发送,则不会触发异常。 + /// 时,相当于 + /// 该发送会经过适配器封装,具体封装内容由适配器决定。 + /// + /// 远程终结点 + /// + /// + /// + /// 发送数据超长 + /// 其他异常 + Task SendAsync(EndPoint endPoint, byte[] buffer, int offset, int length); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs.meta new file mode 100644 index 0000000..c80bf41 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpClientSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b36b77508312d6468fb43b25fc1c26a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs new file mode 100644 index 0000000..60b6eb3 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Net; +using System.Threading.Tasks; + +namespace TouchSocket.Sockets +{ + /// + /// 具有直接发送功能 + /// + public interface IUdpDefaultSender : ISenderBase + { + /// + /// 绕过适配器,直接发送字节流 + /// + /// 目的终结点 + /// 数据缓存区 + /// 偏移量 + /// 数据长度 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + void DefaultSend(EndPoint endPoint, byte[] buffer, int offset, int length); + + /// + /// 绕过适配器,直接发送字节流 + /// + /// 目的终结点 + /// 数据缓存区 + /// 偏移量 + /// 数据长度 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + Task DefaultSendAsync(EndPoint endPoint, byte[] buffer, int offset, int length); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs.meta new file mode 100644 index 0000000..5f6c966 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IUdpDefaultSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a5151811849bac4b904f2c8a3b80ad9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs new file mode 100644 index 0000000..07f2c8c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 发送等待接口 + /// + public interface IWaitSender : ISenderBase + { + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + byte[] SendThenReturn(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + byte[] SendThenReturn(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 发送流中的有效数据 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + byte[] SendThenReturn(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + Task SendThenReturnAsync(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + Task SendThenReturnAsync(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 异步发送 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + Task SendThenReturnAsync(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs.meta new file mode 100644 index 0000000..12a61d9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISender/IWaitSender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a5a81f4b915ce64a8cade98e80537d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs new file mode 100644 index 0000000..b26ee4a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 服务器接口 + /// + public interface IService : IDisposable + { + /// + /// 服务器状态 + /// + ServerState ServerState { get; } + + /// + /// 获取服务器配置 + /// + TouchSocketConfig Config { get; } + + /// + /// 名称 + /// + string ServerName { get; } + + /// + /// 配置服务器 + /// + /// 配置 + /// + /// 设置的服务实例 + IService Setup(TouchSocketConfig serverConfig); + + /// + /// 配置服务器 + /// + /// + /// + /// 设置的服务实例 + IService Setup(int port); + + /// + /// 启动 + /// + /// + /// + /// + /// 设置的服务实例 + IService Start(); + + /// + /// 停止 + /// + /// + /// 设置的服务实例 + IService Stop(); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs.meta new file mode 100644 index 0000000..3c73e6c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c344938f4b21cd142828eeed44cbd0b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs new file mode 100644 index 0000000..440ca46 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// Socket基接口 + /// + public interface ISocket : IDisposable + { + /// + /// 数据交互缓存池限制 + /// + int BufferLength { get; } + + /// + /// 日志记录器 + /// + ILog Logger { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs.meta new file mode 100644 index 0000000..eb17dc0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocket.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c7ff899e48d0be4ab03047c207216cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs new file mode 100644 index 0000000..ec88d71 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Sockets +{ + /// + /// 服务器辅助类接口 + /// + public interface ISocketClient : ITcpClientBase, IClientSender, IIDSender, IIDRequsetInfoSender + { + /// + /// 重新设置ID + /// + /// + void ResetID(string newID); + + /// + /// 用于索引的ID + /// + string ID { get; } + + /// + /// 包含此辅助类的主服务器类 + /// + TcpServiceBase Service { get; } + + /// + /// 接收此客户端的服务器IP地址 + /// + string ServiceIP { get; } + + /// + /// 接收此客户端的服务器端口 + /// + int ServicePort { get; } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs.meta new file mode 100644 index 0000000..c747d60 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ISocketClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fbf2f3b8ba947a148b768e64d3f753d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs new file mode 100644 index 0000000..4635b11 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs @@ -0,0 +1,68 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// TCP客户端终端接口 + /// + public interface ITcpClient : ITcpClientBase, IClientSender, IPluginObject + { + /// + /// 成功连接到服务器 + /// + MessageEventHandler Connected { get; set; } + + /// + /// 准备连接的时候 + /// + ConnectingEventHandler Connecting { get; set; } + + /// + /// 远程IPHost。 + /// + IPHost RemoteIPHost { get; } + + /// + /// 连接服务器 + /// + /// + /// + ITcpClient Connect(int timeout = 5000); + + /// + /// 异步连接服务器 + /// + /// + /// + Task ConnectAsync(int timeout = 5000); + + /// + /// 配置服务器 + /// + /// + /// + ITcpClient Setup(TouchSocketConfig config); + + /// + /// 配置服务器 + /// + /// + /// + ITcpClient Setup(string ipHost); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs.meta new file mode 100644 index 0000000..a5f69a7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e99413f993f03704b8cd5f6fce652084 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs new file mode 100644 index 0000000..067e3b9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs @@ -0,0 +1,120 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System.IO; +using System.Net.Security; +using System.Net.Sockets; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// TCP终端基础接口。 + /// + /// 注意:该接口并不仅表示客户端。也实现了该接口。 + /// + /// + public interface ITcpClientBase : IClient, ISender, IDefaultSender, IPluginObject, IRequsetInfoSender + { + /// + /// 缓存池大小 + /// + int BufferLength { get; } + + /// + /// 是否允许自由调用进行赋值。 + /// + bool CanSetDataHandlingAdapter { get; } + + /// + /// 客户端配置 + /// + TouchSocketConfig Config { get; } + + /// + /// 数据处理适配器 + /// + DataHandlingAdapter DataHandlingAdapter { get; } + + /// + /// 断开连接 + /// + DisconnectEventHandler Disconnected { get; set; } + + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + DisconnectEventHandler Disconnecting { get; set; } + /// + /// IP地址 + /// + string IP { get; } + + /// + /// 表示是否为客户端。 + /// + bool IsClient { get; } + /// + /// 主通信器 + /// + Socket MainSocket { get; } + + /// + /// 判断是否在线 + /// 该属性仅表示TCP状态是否在线 + /// + bool Online { get; } + + /// + /// 端口号 + /// + int Port { get; } + + /// + /// 接收模式 + /// + public ReceiveType ReceiveType { get; } + + /// + /// 使用Ssl加密 + /// + bool UseSsl { get; } + + + /// + /// 中断终端 + /// + void Close(); + + /// + /// 中断终端,传递中断消息 + /// + /// + void Close(string msg); + + /// + /// 获取流,在正常模式下为,在Ssl模式下为。 + /// + /// + Stream GetStream(); + + /// + /// 设置数据处理适配器 + /// + /// + void SetDataHandlingAdapter(DataHandlingAdapter adapter); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs.meta new file mode 100644 index 0000000..8d59063 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpClientBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4451be502cff1404bb8590577337de38 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs new file mode 100644 index 0000000..41f7b4c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs @@ -0,0 +1,110 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// TCP系列服务器接口 + /// + public interface ITcpService : ITcpService where TClient : ISocketClient + { + /// + /// 用户连接完成 + /// + TouchSocketEventHandler Connected { get; set; } + + /// + /// 有用户连接的时候 + /// + OperationEventHandler Connecting { get; set; } + + /// + /// 有用户断开连接 + /// + DisconnectEventHandler Disconnected { get; set; } + + /// + /// 尝试获取TClient + /// + /// ID + /// TClient + /// + bool TryGetSocketClient(string id, out TClient socketClient); + } + + /// + /// TCP服务器接口 + /// + public interface ITcpService : IService, IIDSender, IIDRequsetInfoSender, IPluginObject + { + /// + /// 当前在线客户端数量 + /// + int Count { get; } + + /// + /// 获取默认新ID。 + /// + Func GetDefaultNewID { get; } + + /// + /// 获取最大可连接数 + /// + int MaxCount { get; } + + /// + /// 网络监听集合 + /// + NetworkMonitor[] Monitors { get; } + + /// + /// 获取当前连接的所有客户端 + /// + SocketClientCollection SocketClients { get; } + + /// + /// 使用Ssl加密 + /// + bool UseSsl { get; } + + /// + /// 清理当前已连接的所有客户端 + /// + void Clear(); + + /// + /// 获取当前在线的所有ID集合 + /// + /// + string[] GetIDs(); + + /// + /// 重置ID + /// + /// + /// + /// + /// + void ResetID(string oldID, string newID); + + /// + /// 根据ID判断SocketClient是否存在 + /// + /// + /// + bool SocketClientExist(string id); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs.meta new file mode 100644 index 0000000..b37985e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/ITcpService.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 47b6f0a591e08b043ad0c5b9ac2d38f6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs new file mode 100644 index 0000000..71a10ba --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs @@ -0,0 +1,49 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// UDP会话 + /// + public interface IUdpSession : IService, IClient, IClientSender, IUdpClientSender, IDefaultSender, IUdpDefaultSender + { + /// + /// 插件管理器 + /// + IPluginsManager PluginsManager { get; } + + /// + /// 缓存池大小 + /// + int BufferLength { get; } + + /// + /// 是否允许自由调用进行赋值。 + /// + bool CanSetDataHandlingAdapter { get; } + + /// + /// 数据处理适配器 + /// + UdpDataHandlingAdapter DataHandlingAdapter { get; } + + /// + /// 设置数据处理适配器 + /// + /// + void SetDataHandlingAdapter(UdpDataHandlingAdapter adapter); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs.meta new file mode 100644 index 0000000..926594e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/IUdpSession.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42cc25f6a6d5cd341babbe7dede176a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins.meta new file mode 100644 index 0000000..e2eef2a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 983625c751b1f5b45b23e2346ff957b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs new file mode 100644 index 0000000..eb2a3c9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 当配置Config时触发。 + /// + public interface IConfigPlugin : IPlugin + { + /// + /// 当载入配置时 + /// + /// + /// + [AsyncRaiser] + void OnLoadingConfig(object sender, ConfigEventArgs e); + + /// + /// 当载入配置时 + /// + /// + /// + Task OnLoadingConfigAsync(object sender, ConfigEventArgs e); + + /// + /// 当完成配置载入时 + /// + /// + /// + [AsyncRaiser] + void OnLoadedConfig(object sender, ConfigEventArgs e); + + /// + /// 当完成配置载入时 + /// + /// + /// + /// + Task OnLoadedConfigAsync(object sender, ConfigEventArgs e); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs.meta new file mode 100644 index 0000000..036feab --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConfigPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 747fe0935b7a08c4c904e4ec98a57d00 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs new file mode 100644 index 0000000..a9c1ddc --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 具有完成连接动作的插件接口 + /// + public interface IConnectedPlugin:IPlugin + { + /// + /// 客户端连接成功后触发 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnConnected(object client, TouchSocketEventArgs e); + + /// + /// 客户端连接成功后触发 + /// + /// + /// + /// + Task OnConnectedAsync(object client, TouchSocketEventArgs e); + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs.meta new file mode 100644 index 0000000..b6da320 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectedPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6a297882e0da5054b897bc49c41840fd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs new file mode 100644 index 0000000..d14b791 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 具有预备连接的插件接口 + /// + public interface IConnectingPlugin:IPlugin + { + /// + ///在即将完成连接时触发。 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnConnecting(object client, OperationEventArgs e); + + /// + /// 在即将完成连接时触发。 + /// + /// + /// + /// + Task OnConnectingAsync(object client, OperationEventArgs e); + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs.meta new file mode 100644 index 0000000..25ff9a1 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IConnectingPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: acfce82f0fe96da4fac079db153845f6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs new file mode 100644 index 0000000..741efce --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 具有断开连接的插件接口 + /// + public interface IDisconnectedPlguin:IPlugin + { + /// + /// 会话断开后触发 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnDisconnected(object client, DisconnectEventArgs e); + + /// + /// 会话断开后触发 + /// + /// + /// + /// + Task OnDisconnectedAsync(object client, DisconnectEventArgs e); + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs.meta new file mode 100644 index 0000000..8971add --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectedPlguin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bd64ec88e517c0f42827d35fd3806bb7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs new file mode 100644 index 0000000..b352839 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 具有预断开连接插件接口 + /// + public interface IDisconnectingPlugin:IPlugin + { + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnDisconnecting(object client, DisconnectEventArgs e); + + /// + /// 即将断开连接(仅主动断开时有效)。 + /// + /// 当主动调用Close断开时,可通过终止断开行为。 + /// + /// + /// + /// + /// + Task OnDisconnectingAsync(object client, DisconnectEventArgs e); + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs.meta new file mode 100644 index 0000000..23f0fdd --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IDisconnectingPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a11279e358b31c40bed1b031446d841 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs new file mode 100644 index 0000000..edd6676 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs @@ -0,0 +1,48 @@ +using TouchSocket.Core; +using System.Threading.Tasks; +using System; + +namespace TouchSocket.Sockets +{ + /// + /// IServicePlugin + /// + public interface IServicePlugin : IPlugin + { + /// + /// 当服务器执行后时。 + /// + /// 注意:此处并不表示服务器成功启动,具体状态请看 + /// + /// + /// + /// + [AsyncRaiser] + void OnStarted(object sender, ServiceStateEventArgs e); + + /// + /// 当服务器执行后时。 + /// + /// 注意:此处并不表示服务器成功启动,具体状态请看 + /// + /// + /// + /// + Task OnStartedAsync(object sender, ServiceStateEventArgs e); + + /// + /// 当服务器调用或者时 + /// + /// + /// + [AsyncRaiser] + void OnStoped(object sender, ServiceStateEventArgs e); + + /// + /// 当服务器调用或者时 + /// + /// + /// + Task OnStopedAsync(object sender, ServiceStateEventArgs e); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs.meta new file mode 100644 index 0000000..b69461f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IServicePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 083d5774ae19d4c40a7245a81388c985 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs new file mode 100644 index 0000000..1bee0ff --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs @@ -0,0 +1,87 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// Tcp系插件接口 + /// + public interface ITcpPlugin : IPlugin, IConnectingPlugin, IConnectedPlugin, IDisconnectingPlugin, IDisconnectedPlguin + { + /// + /// 当Client的ID被更改后触发 + /// + /// + /// + [AsyncRaiser] + void OnIDChanged(ITcpClientBase client, IDChangedEventArgs e); + + /// + /// 当Client的ID被更改后触发 + /// + /// + /// + /// + Task OnIDChangedAsync(ITcpClientBase client, IDChangedEventArgs e); + + /// + /// 在收到数据时触发 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnReceivedData(ITcpClientBase client, ReceivedDataEventArgs e); + + /// + /// 在收到数据时触发 + /// + /// + /// + /// + Task OnReceivedDataAsync(ITcpClientBase client, ReceivedDataEventArgs e); + + /// + /// 在刚收到数据时触发,即在适配器之前。 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnReceivingData(ITcpClientBase client, ByteBlockEventArgs e); + + /// + /// 在刚收到数据时触发,即在适配器之前。 + /// + /// + /// + /// + Task OnReceivingDataAsync(ITcpClientBase client, ByteBlockEventArgs e); + + /// + /// 当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnSendingData(ITcpClientBase client, SendingEventArgs e); + + /// + /// 当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。 + /// + /// + /// + /// + Task OnSendingDataAsync(ITcpClientBase client, SendingEventArgs e); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs.meta new file mode 100644 index 0000000..63ea7c6 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/ITcpPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d03fe91927b1ae2499d33e9d101a091a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs new file mode 100644 index 0000000..4f45139 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// Udp会话插件 + /// + public interface IUdpSessionPlugin : IPlugin + { + /// + /// 在收到数据时触发 + /// + /// 客户端 + /// 参数 + [AsyncRaiser] + void OnReceivedData(IUdpSession client, UdpReceivedDataEventArgs e); + + /// + /// 在收到数据时触发 + /// + /// + /// + /// + Task OnReceivedDataAsync(IUdpSession client, UdpReceivedDataEventArgs e); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs.meta new file mode 100644 index 0000000..35ade63 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Interface/Plugins/IUdpSessionPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 200b81d250a943249bab4228eeb9e383 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins.meta new file mode 100644 index 0000000..e3ad161 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f65b57ad4f6675843a2a8f3f931f8983 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs new file mode 100644 index 0000000..b28e759 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs @@ -0,0 +1,116 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 检查清理连接插件。服务器适用。 + /// + [SingletonPlugin] + public class CheckClearPlugin : TcpPluginBase + { + private ITcpService m_service; + private Thread m_thread; + + /// + /// 清理统计类型。默认为:。当设置为时, + /// 则只检验发送方向是否有数据流动。没有的话则会断开连接。 + /// + public CheckClearType CheckClearType { get; set; } = CheckClearType.All; + + /// + /// 获取或设置清理无数据交互的Client,默认60秒。 + /// + public TimeSpan Duration { get; set; } = TimeSpan.FromSeconds(60); + + /// + /// 清理统计类型。默认为:。当设置为时, + /// 则只检验发送方向是否有数据流动。没有的话则会断开连接。 + /// + /// + /// + public CheckClearPlugin SetCheckClearType(CheckClearType clearType) + { + CheckClearType = clearType; + return this; + } + + /// + /// 设置清理无数据交互的Client,默认60秒。 + /// + /// + /// + public CheckClearPlugin SetDuration(TimeSpan timeSpan) + { + if (timeSpan == TimeSpan.Zero || timeSpan == TimeSpan.MaxValue || timeSpan == TimeSpan.MinValue) + { + throw new InvalidTimeZoneException("设置的时间必须为有效值。"); + } + Duration = timeSpan; + return this; + } + + /// + protected override void OnLoadedConfig(object sender, ConfigEventArgs e) + { + if (sender is ITcpService service) + { + m_service = service; + m_thread = new Thread(ClearThread); + m_thread.IsBackground = true; + m_thread.Start(); + } + base.OnLoadedConfig(sender, e); + } + + private void ClearThread(object obj) + { + while (true) + { + if (m_service.ServerState == ServerState.Disposed || DisposedValue) + { + return; + } + foreach (var client in m_service.SocketClients.GetClients()) + { + if (CheckClearType == CheckClearType.OnlyReceive) + { + if (DateTime.Now - client.LastReceivedTime > Duration) + { + client.SafeClose("超时无数据Receive交互,主动断开连接"); + } + } + else if (CheckClearType == CheckClearType.OnlySend) + { + if (DateTime.Now - client.LastSendTime > Duration) + { + client.SafeClose("超时无数据Send交互,主动断开连接"); + } + } + else + { + if (DateTime.Now - client.GetLastActiveTime() > Duration) + { + client.SafeClose("超时无数据交互,主动断开连接"); + } + } + } + + Thread.Sleep(1000); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs.meta new file mode 100644 index 0000000..417ab0c --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/CheckClearPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d335cfd805b1a24580a68d334801cfe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs new file mode 100644 index 0000000..a4a296f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 重连插件 + /// + [SingletonPlugin] + public sealed class ReconnectionPlugin : TcpPluginBase where TClient : class, ITcpClient + { + private readonly Func m_tryCon; + + /// + /// 初始化一个重连插件 + /// + /// 无论如何,只要返回True,则结束本轮尝试 + public ReconnectionPlugin(Func tryCon) + { + Order = int.MinValue; + m_tryCon = tryCon; + } + + /// + /// + /// + /// + /// + protected override void OnDisconnected(ITcpClientBase client, DisconnectEventArgs e) + { + base.OnDisconnected(client, e); + + if (client is ITcpClient tcpClient) + { + if (e.Manual) + { + return; + } + EasyTask.Run(() => + { + while (true) + { + try + { + if (m_tryCon.Invoke((TClient)tcpClient)) + { + break; + } + } + catch + { + } + } + }); + } + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs.meta new file mode 100644 index 0000000..042e57a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ReconnectionPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 47ef836629695ed4887d9160845c8db6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs new file mode 100644 index 0000000..696b0df --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// ServicePlugin + /// + public class ServicePlugin : PluginBase, IServicePlugin + { + /// + protected virtual void OnStarted(TService sender, ServiceStateEventArgs e) + { + + } + + /// + protected virtual Task OnStartedAsync(TService sender, ServiceStateEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + protected virtual void OnStoped(TService sender, ServiceStateEventArgs e) + { + + } + + /// + protected virtual Task OnStopedAsync(TService sender, ServiceStateEventArgs e) + { + return EasyTask.CompletedTask; + } + + void IServicePlugin.OnStarted(object sender, ServiceStateEventArgs e) + { + this.OnStarted((TService)sender, e); + } + + Task IServicePlugin.OnStartedAsync(object sender, ServiceStateEventArgs e) + { + return this.OnStartedAsync((TService)sender, e); + } + + void IServicePlugin.OnStoped(object sender, ServiceStateEventArgs e) + { + this.OnStoped((TService)sender, e); + } + + Task IServicePlugin.OnStopedAsync(object sender, ServiceStateEventArgs e) + { + return this.OnStopedAsync((TService)sender, e); + } + } + + /// + /// TcpServicePlugin + /// + public class TcpServicePlugin : ServicePlugin + { + + } + + /// + /// UdpServicePlugin + /// + public class UdpServicePlugin : ServicePlugin + { + + } +} diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs.meta new file mode 100644 index 0000000..6c177b5 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/ServicePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 251ce7367b5c1d942b534d58e44727db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs new file mode 100644 index 0000000..7d10186 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs @@ -0,0 +1,118 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// TCP命令行插件。 + /// + public abstract class TcpCommandLinePlugin : TcpPluginBase + { + private readonly Dictionary m_pairs = new Dictionary(); + private ILog m_logger; + + /// + /// TCP命令行插件。 + /// + /// + /// + protected TcpCommandLinePlugin(ILog logger) + { + m_logger = logger ?? throw new ArgumentNullException(nameof(logger)); + Converter = new StringConverter(); + var ms = GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(a => a.Name.EndsWith("Command")); + foreach (var item in ms) + { + m_pairs.Add(item.Name.Replace("Command", string.Empty), new Method(item)); + } + } + + /// + /// 字符串转换器,默认支持基础类型和Json。可以自定义。 + /// + public StringConverter Converter { get; } + + /// + /// 是否返回执行异常。 + /// + public bool ReturnException { get; set; } = true; + + /// + /// 当有执行异常时,不返回异常。 + /// + /// + public TcpCommandLinePlugin NoReturnException() + { + ReturnException = false; + return this; + } + + /// + /// + /// + /// + /// + protected override void OnReceivedData(ITcpClientBase client, ReceivedDataEventArgs e) + { + try + { + string[] strs = e.ByteBlock.ToString().Split(' '); + if (strs.Length > 0 && m_pairs.TryGetValue(strs[0], out Method method)) + { + var ps = method.Info.GetParameters(); + object[] os = new object[ps.Length]; + int index = 0; + for (int i = 0; i < ps.Length; i++) + { + if (ps[i].ParameterType.IsInterface && typeof(ITcpClientBase).IsAssignableFrom(ps[i].ParameterType)) + { + os[i] = client; + } + else + { + os[i] = Converter.ConvertFrom(strs[index + 1], ps[i].ParameterType); + index++; + } + } + e.Handled = true; + + try + { + object result = method.Invoke(this, os); + if (method.HasReturn) + { + client.Send(Converter.ConvertTo(result)); + } + } + catch (Exception ex) + { + if (ReturnException) + { + client.Send(ex.Message); + } + } + } + } + catch (Exception ex) + { + m_logger.Log(LogType.Error, this, ex.Message, ex); + } + base.OnReceivedData(client, e); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs.meta new file mode 100644 index 0000000..7cdde67 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpCommandLinePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2cb4e2fd12b20d64e93173364fd9a84f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs new file mode 100644 index 0000000..b46ada7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs @@ -0,0 +1,325 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 插件实现基类 + /// + public abstract class TcpPluginBase : TcpPluginBase + { + } + + /// + /// 插件实现基类 + /// + public abstract class TcpPluginBase : PluginBase, ITcpPlugin, IConfigPlugin + { + void IConnectedPlugin.OnConnected(object client, TouchSocketEventArgs e) + { + OnConnected((TClient)client, e); + } + + Task IConnectedPlugin.OnConnectedAsync(object client, TouchSocketEventArgs e) + { + return OnConnectedAsync((TClient)client, e); + } + + void IConnectingPlugin.OnConnecting(object client, OperationEventArgs e) + { + OnConnecting((TClient)client, e); + } + + Task IConnectingPlugin.OnConnectingAsync(object client, OperationEventArgs e) + { + return OnConnectingAsync((TClient)client, e); + } + + void IDisconnectedPlguin.OnDisconnected(object client, DisconnectEventArgs e) + { + OnDisconnected((TClient)client, e); + } + + Task IDisconnectedPlguin.OnDisconnectedAsync(object client, DisconnectEventArgs e) + { + return OnDisconnectedAsync((TClient)client, e); + } + + void IDisconnectingPlugin.OnDisconnecting(object client, DisconnectEventArgs e) + { + this.OnDisconnecting((TClient)client, e); + } + + Task IDisconnectingPlugin.OnDisconnectingAsync(object client, DisconnectEventArgs e) + { + return this.OnDisconnectingAsync((TClient)client, e); + } + + void ITcpPlugin.OnIDChanged(ITcpClientBase client, IDChangedEventArgs e) + { + OnIDChanged((TClient)client, e); + } + + Task ITcpPlugin.OnIDChangedAsync(ITcpClientBase client, IDChangedEventArgs e) + { + return OnIDChangedAsync((TClient)client, e); + } + + void IConfigPlugin.OnLoadedConfig(object sender, ConfigEventArgs e) + { + OnLoadedConfig(sender, e); + } + + Task IConfigPlugin.OnLoadedConfigAsync(object sender, ConfigEventArgs e) + { + return OnLoadedConfigAsync(sender, e); + } + + void IConfigPlugin.OnLoadingConfig(object sender, ConfigEventArgs e) + { + OnLoadingConfig(sender, e); + } + + Task IConfigPlugin.OnLoadingConfigAsync(object sender, ConfigEventArgs e) + { + return OnLoadingConfigAsync(sender, e); + } + + void ITcpPlugin.OnReceivedData(ITcpClientBase client, ReceivedDataEventArgs e) + { + OnReceivedData((TClient)client, e); + } + + Task ITcpPlugin.OnReceivedDataAsync(ITcpClientBase client, ReceivedDataEventArgs e) + { + return OnReceivedDataAsync((TClient)client, e); + } + + void ITcpPlugin.OnReceivingData(ITcpClientBase client, ByteBlockEventArgs e) + { + OnReceivingData((TClient)client, e); + } + + Task ITcpPlugin.OnReceivingDataAsync(ITcpClientBase client, ByteBlockEventArgs e) + { + return OnReceivingDataAsync((TClient)client, e); + } + + void ITcpPlugin.OnSendingData(ITcpClientBase client, SendingEventArgs e) + { + OnSending((TClient)client, e); + } + + Task ITcpPlugin.OnSendingDataAsync(ITcpClientBase client, SendingEventArgs e) + { + return OnSendingDataAsync((TClient)client, e); + } + + #region 虚函数实现 + + /// + /// 成功建立连接 + /// + /// + /// + protected virtual void OnConnected(TClient client, TouchSocketEventArgs e) + { + } + + /// + /// 客户端连接成功后触发 + /// + /// + /// + /// + protected virtual Task OnConnectedAsync(TClient client, TouchSocketEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在请求连接时 + /// + /// + /// + protected virtual void OnConnecting(TClient client, OperationEventArgs e) + { + } + + /// + /// 在即将完成连接时触发。 + /// + /// + /// + /// + protected virtual Task OnConnectingAsync(TClient client, OperationEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在断开连接时 + /// + /// + /// + protected virtual void OnDisconnected(TClient client, DisconnectEventArgs e) + { + } + + /// + /// 会话断开后触发 + /// + /// + /// + /// + protected virtual Task OnDisconnectedAsync(TClient client, DisconnectEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + protected virtual void OnDisconnecting(TClient client, DisconnectEventArgs e) + { + } + + /// + protected virtual Task OnDisconnectingAsync(TClient client, DisconnectEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 当Client的ID被更改后触发 + /// + /// + /// + protected virtual void OnIDChanged(TClient client, TouchSocketEventArgs e) + { + } + + /// + /// 当Client的ID被更改后触发 + /// + /// + /// + /// + protected virtual Task OnIDChangedAsync(TClient client, TouchSocketEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 当载入配置时 + /// + /// + /// + protected virtual void OnLoadedConfig(object sender, ConfigEventArgs e) + { + } + + /// + /// 当完成配置载入时 + /// + /// + /// + /// + protected virtual Task OnLoadedConfigAsync(object sender, ConfigEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 当完成配置载入时 + /// + /// + /// + protected virtual void OnLoadingConfig(object sender, ConfigEventArgs e) + { + } + + /// + /// 当载入配置时 + /// + /// + /// + /// + protected virtual Task OnLoadingConfigAsync(object sender, ConfigEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在收到数据时触发 + /// + /// 客户端 + /// 参数,当设置e.Handled=true时,终止向下传递 + protected virtual void OnReceivedData(TClient client, ReceivedDataEventArgs e) + { + } + + /// + /// 在收到数据时触发 + /// + /// + /// + /// + protected virtual Task OnReceivedDataAsync(TClient client, ReceivedDataEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 在刚收到数据时触发,即在适配器之前。 + /// + /// 客户端 + /// 参数 + protected virtual void OnReceivingData(TClient client, ByteBlockEventArgs e) + { + } + + /// + /// 在刚收到数据时触发,即在适配器之前。 + /// + /// + /// + /// + protected virtual Task OnReceivingDataAsync(TClient client, ByteBlockEventArgs e) + { + return EasyTask.CompletedTask; + } + + /// + /// 当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。 + /// + /// 客户端 + /// 参数,当设置e.IsPermitOperation=false时,中断发送。 + protected virtual void OnSending(TClient client, SendingEventArgs e) + { + } + + /// + /// 当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。 + /// + /// + /// + /// + protected virtual Task OnSendingDataAsync(TClient client, SendingEventArgs e) + { + return EasyTask.CompletedTask; + } + + #endregion 虚函数实现 + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs.meta new file mode 100644 index 0000000..56666b8 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/TcpPluginBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd63ae6f81489d441811d6defc53fb1d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs new file mode 100644 index 0000000..bb9ee13 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs @@ -0,0 +1,80 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// UdpSessionPluginBase + /// + public class UdpSessionPluginBase : UdpSessionPluginBase + { + } + + /// + /// Udp插件实现类 + /// + public class UdpSessionPluginBase : DisposableObject, IUdpSessionPlugin + { + /// + /// + /// + public ILog Logger { get; set; } + + /// + /// + /// + public int Order { get; set; } + + /// + /// + /// + public IPluginsManager PluginsManager { get; set; } + + /// + /// + /// + /// + /// + void IUdpSessionPlugin.OnReceivedData(IUdpSession client, UdpReceivedDataEventArgs e) + { + OnReceivedData((TSession)client, e); + } + + Task IUdpSessionPlugin.OnReceivedDataAsync(IUdpSession client, UdpReceivedDataEventArgs e) + { + return OnReceivedDataAsync((TSession)client, e); + } + + /// + /// 收到数据 + /// + /// + /// + protected virtual void OnReceivedData(TSession client, UdpReceivedDataEventArgs e) + { + } + + /// + /// 在收到数据时触发 + /// + /// + /// + /// + protected virtual Task OnReceivedDataAsync(TSession client, UdpReceivedDataEventArgs e) + { + return EasyTask.CompletedTask; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs.meta new file mode 100644 index 0000000..a1fb45e --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/Plugins/UdpSessionPluginBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c820f838875a9534cb51c83f8175c1b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient.meta new file mode 100644 index 0000000..ef3671f --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 963224e1bf3d6fa4fadda5b3b6c592a4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs new file mode 100644 index 0000000..5463886 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs @@ -0,0 +1,111 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// 等待型客户端。 + /// + public interface IWaitingClient : IWaitSender,IDisposable where TClient : IClient, IDefaultSender, ISender + { + /// + /// 等待设置。 + /// + public WaitingOptions WaitingOptions { get;} + + /// + /// 客户端终端 + /// + TClient Client { get; } + + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + ResponsedData SendThenResponse(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + ResponsedData SendThenResponse(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 发送流中的有效数据 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + ResponsedData SendThenResponse(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + Task SendThenResponseAsync(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + Task SendThenResponseAsync(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default); + + /// + /// 异步发送 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + Task SendThenResponseAsync(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default); + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs.meta new file mode 100644 index 0000000..f5dc5ca --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/IWaitingClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0f2949f9e55498d4c88be994c9d76057 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs new file mode 100644 index 0000000..4a9152a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Sockets +{ + /// + /// 响应数据。 + /// + public struct ResponsedData + { + private readonly byte[] m_data; + private readonly IRequestInfo m_requestInfo; + + /// + /// 构造函数 + /// + /// + /// + public ResponsedData(byte[] data, IRequestInfo requestInfo) + { + m_data = data; + m_requestInfo = requestInfo; + } + + /// + /// 数据 + /// + public byte[] Data => m_data; + + /// + /// RequestInfo + /// + public IRequestInfo RequestInfo => m_requestInfo; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs.meta new file mode 100644 index 0000000..ba817e7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/ResponsedData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2d34b2908dfe756429e1c42b4e717f4d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs new file mode 100644 index 0000000..0595834 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs @@ -0,0 +1,382 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using System.Threading; +using System.Threading.Tasks; +using TouchSocket.Core; +using TouchSocket.Resources; + +namespace TouchSocket.Sockets +{ + internal class WaitingClient : DisposableObject, IWaitingClient where TClient : IClient, IDefaultSender, ISender + { + private readonly WaitData m_waitData; + + private volatile bool breaked; + + public WaitingClient(TClient client, WaitingOptions waitingOptions) + { + Client = client ?? throw new ArgumentNullException(nameof(client)); + m_waitData = new WaitData(); + WaitingOptions = waitingOptions; + } + + public bool CanSend + { + get + { + if (Client is ITcpClientBase tcpClient) + { + return tcpClient.Online; + } + else if (Client is IUdpSession) + { + return true; + } + else + { + return false; + } + } + } + + public TClient Client { get; private set; } + + public WaitingOptions WaitingOptions { get; set; } + + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public ResponsedData SendThenResponse(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default) + { + lock (this) + { + try + { + breaked = false; + m_waitData.Reset(); + if (WaitingOptions.BreakTrigger && this.Client is ITcpClientBase tcpClient) + { + tcpClient.Disconnected += this.OnDisconnected; + } + + if (WaitingOptions.AdapterFilter == AdapterFilter.AllAdapter || WaitingOptions.AdapterFilter == AdapterFilter.WaitAdapter) + { + Client.OnHandleReceivedData += OnHandleReceivedData; + } + else + { + Client.OnHandleRawBuffer += OnHandleRawBuffer; + } + + if (WaitingOptions.RemoteIPHost != null && Client is IUdpSession session) + { + if (WaitingOptions.AdapterFilter == AdapterFilter.AllAdapter || WaitingOptions.AdapterFilter == AdapterFilter.SendAdapter) + { + session.Send(WaitingOptions.RemoteIPHost.EndPoint, buffer, offset, length); + } + else + { + session.DefaultSend(WaitingOptions.RemoteIPHost.EndPoint, buffer, offset, length); + } + } + else + { + if (WaitingOptions.AdapterFilter == AdapterFilter.AllAdapter || WaitingOptions.AdapterFilter == AdapterFilter.SendAdapter) + { + Client.Send(buffer, offset, length); + } + else + { + Client.DefaultSend(buffer, offset, length); + } + } + + m_waitData.SetCancellationToken(token); + switch (m_waitData.Wait(timeout)) + { + case WaitDataStatus.SetRunning: + return m_waitData.WaitResult; + + case WaitDataStatus.Overtime: + throw new TimeoutException(); + case WaitDataStatus.Canceled: + { + if (this.WaitingOptions.ThrowBreakException && this.breaked) + { + throw new Exception("等待已终止。可能是客户端已掉线,或者被注销。"); + } + return default; + } + case WaitDataStatus.Default: + case WaitDataStatus.Disposed: + default: + throw new Exception(TouchSocketStatus.UnknownError.GetDescription()); + } + } + finally + { + if (this.WaitingOptions.BreakTrigger && this.Client is ITcpClientBase tcpClient) + { + tcpClient.Disconnected -= this.OnDisconnected; + } + + if (WaitingOptions.AdapterFilter == AdapterFilter.AllAdapter || WaitingOptions.AdapterFilter == AdapterFilter.WaitAdapter) + { + Client.OnHandleReceivedData -= OnHandleReceivedData; + } + else + { + Client.OnHandleRawBuffer -= OnHandleRawBuffer; + } + } + } + } + + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public ResponsedData SendThenResponse(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default) + { + return SendThenResponse(buffer, 0, buffer.Length, timeout, token); + } + + /// + /// 发送流中的有效数据 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public ResponsedData SendThenResponse(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default) + { + return SendThenResponse(byteBlock.Buffer, 0, byteBlock.Len, timeout, token); + } + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public Task SendThenResponseAsync(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default) + { + return EasyTask.Run(() => + { + return SendThenResponse(buffer, offset, length, timeout, token); + }); + } + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public Task SendThenResponseAsync(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default) + { + return EasyTask.Run(() => + { + return SendThenResponse(buffer, timeout, token); + }); + } + + /// + /// 异步发送 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public Task SendThenResponseAsync(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default) + { + return EasyTask.Run(() => + { + return SendThenResponse(byteBlock, timeout, token); + }); + } + + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public byte[] SendThenReturn(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default) + { + return SendThenResponse(buffer, offset, length, timeout, token).Data; + } + + /// + /// 发送字节流 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public byte[] SendThenReturn(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default) + { + return SendThenReturn(buffer, 0, buffer.Length, timeout, token); + } + + /// + /// 发送流中的有效数据 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public byte[] SendThenReturn(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default) + { + return SendThenReturn(byteBlock.Buffer, 0, byteBlock.Len, timeout, token); + } + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 偏移 + /// 长度 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public Task SendThenReturnAsync(byte[] buffer, int offset, int length, int timeout = 1000 * 5, CancellationToken token = default) + { + return EasyTask.Run(() => + { + return SendThenReturn(buffer, offset, length, timeout, token); + }); + } + + /// + /// 异步发送 + /// + /// 数据缓存区 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public Task SendThenReturnAsync(byte[] buffer, int timeout = 1000 * 5, CancellationToken token = default) + { + return EasyTask.Run(() => + { + return SendThenReturn(buffer, timeout, token); + }); + } + + /// + /// 异步发送 + /// + /// 数据块载体 + /// 超时时间 + /// 取消令箭 + /// 客户端没有连接 + /// 发送数据超长 + /// 其他异常 + /// 返回的数据 + public Task SendThenReturnAsync(ByteBlock byteBlock, int timeout = 1000 * 5, CancellationToken token = default) + { + return EasyTask.Run(() => + { + return SendThenReturn(byteBlock, timeout, token); + }); + } + + protected override void Dispose(bool disposing) + { + this.Client = default; + this.m_waitData.SafeDispose(); + base.Dispose(disposing); + } + + private void OnDisconnected(ITcpClientBase client, DisconnectEventArgs e) + { + breaked = true; + this.m_waitData.Cancel(); + } + + private bool OnHandleRawBuffer(ByteBlock byteBlock) + { + ResponsedData responsedData = new ResponsedData(byteBlock.ToArray(), null); + return !m_waitData.Set(responsedData); + } + + /// + /// + /// + /// + /// + private bool OnHandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) + { + ResponsedData responsedData; + if (byteBlock != null) + { + responsedData = new ResponsedData(byteBlock.ToArray(), requestInfo); + } + else + { + responsedData = new ResponsedData(null, requestInfo); + } + return !m_waitData.Set(responsedData); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs.meta new file mode 100644 index 0000000..bfe2b9a --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClient.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f4634317c5c2dfa449bc8b297e4e8ee5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs new file mode 100644 index 0000000..744dd32 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +using System; +using TouchSocket.Core; + +namespace TouchSocket.Sockets +{ + /// + /// WaitingClientExtensions + /// + public static class WaitingClientExtension + { + /// + /// 获取可等待的客户端。 + /// + /// + /// + /// + /// + public static IWaitingClient GetWaitingClient(this TClient client, WaitingOptions waitingOptions) where TClient : IClient, IDefaultSender, ISender + { + WaitingClient waitingClient = new WaitingClient(client, waitingOptions); + return waitingClient; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs.meta new file mode 100644 index 0000000..ce217ae --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingClientExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: db80bccf07589a946b9aba59fa9382f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs new file mode 100644 index 0000000..5a817f0 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs @@ -0,0 +1,66 @@ +//------------------------------------------------------------------------------ +// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 +// CSDN博客:https://blog.csdn.net/qq_40374647 +// 哔哩哔哩视频:https://space.bilibili.com/94253567 +// Gitee源代码仓库:https://gitee.com/RRQM_Home +// Github源代码仓库:https://github.com/RRQM +// API首页:https://www.yuque.com/rrqm/touchsocket/index +// 交流QQ群:234762506 +// 感谢您的下载和使用 +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +namespace TouchSocket.Sockets +{ + /// + /// 适配器筛选 + /// + public enum AdapterFilter + { + /// + /// 发送和接收都经过适配器 + /// + AllAdapter, + + /// + /// 发送经过适配器,接收不经过 + /// + SendAdapter, + + /// + /// 发送不经过适配器,接收经过 + /// + WaitAdapter, + + /// + /// 全都不经过适配器。 + /// + NoneAll + } + + /// + /// 等待设置 + /// + public class WaitingOptions + { + /// + /// 适配器筛选 + /// + public AdapterFilter AdapterFilter { get; set; } = AdapterFilter.AllAdapter; + /// + /// 当Client为Tcp系时。是否在断开连接时立即触发结果。默认会返回null。当时,会触发异常。 + /// + public bool BreakTrigger { get; set; } + + /// + /// 远程地址(仅在Udp模式下生效) + /// + public IPHost RemoteIPHost { get; set; } + + /// + /// 当Client为Tcp系时。是否在断开连接时以异常返回结果。 + /// + public bool ThrowBreakException { get; set; } = true; + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs.meta b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs.meta new file mode 100644 index 0000000..6009194 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/_3rd/TouchSocket/Sockets/WaitingClient/WaitingOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d839269adade714eaa5a1d82f9d9bb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/HandDriver/package.json b/Assets/HandDriverUPM/HandDriver/package.json new file mode 100644 index 0000000..6e02ee7 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/package.json @@ -0,0 +1,10 @@ +{ +"name": "com.udexreal.handdriver", +"displayName": "HandDriver", +"description": ""HandDriver", +"version": "2.1.8", +"unity": "2022.3", +"license": "MIT", +"dependencies": { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/HandDriver/package.json.meta b/Assets/HandDriverUPM/HandDriver/package.json.meta new file mode 100644 index 0000000..0d18ee9 --- /dev/null +++ b/Assets/HandDriverUPM/HandDriver/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 074f31793dddd1042887e51c6005051c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes.meta b/Assets/HandDriverUPM/NaughtyAttributes.meta new file mode 100644 index 0000000..78a2f94 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5655267fdc48d5a42a0c5d96aced8e7e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core.meta new file mode 100644 index 0000000..b6e4a87 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e2bd53b151a7f74a962791e3bc33651 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes.meta new file mode 100644 index 0000000..132a3c2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c76425e719cd4424d868674bcfb233f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs new file mode 100644 index 0000000..b7abb8c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class AllowNestingAttribute : DrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs.meta new file mode 100644 index 0000000..343dfec --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AllowNestingAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95b49d3abe880c044adbe7faf6b7b4ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs new file mode 100644 index 0000000..e8d9c2a --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs @@ -0,0 +1,24 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class AnimatorParamAttribute : DrawerAttribute + { + public string AnimatorName { get; private set; } + public AnimatorControllerParameterType? AnimatorParamType { get; private set; } + + public AnimatorParamAttribute(string animatorName) + { + AnimatorName = animatorName; + AnimatorParamType = null; + } + + public AnimatorParamAttribute(string animatorName, AnimatorControllerParameterType animatorParamType) + { + AnimatorName = animatorName; + AnimatorParamType = animatorParamType; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta new file mode 100644 index 0000000..db61add --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/AnimatorParamAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7373332cb77b42744a415d6b4add445d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs new file mode 100644 index 0000000..3e48717 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs @@ -0,0 +1,30 @@ +using System; +using UnityEngine; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class CurveRangeAttribute : DrawerAttribute + { + public Vector2 Min { get; private set; } + public Vector2 Max { get; private set; } + public EColor Color { get; private set; } + + public CurveRangeAttribute(Vector2 min, Vector2 max, EColor color = EColor.Clear) + { + Min = min; + Max = max; + Color = color; + } + + public CurveRangeAttribute(EColor color) + : this(Vector2.zero, Vector2.one, color) + { + } + + public CurveRangeAttribute(float minX, float minY, float maxX, float maxY, EColor color = EColor.Clear) + : this(new Vector2(minX, minY), new Vector2(maxX, maxY), color) + { + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs.meta new file mode 100644 index 0000000..93b60ab --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/CurveRangeAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bbdf3fb8882c7514c9a01108122cda7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs new file mode 100644 index 0000000..92e28d5 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs @@ -0,0 +1,11 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + /// + /// Base class for all drawer attributes + /// + public class DrawerAttribute : PropertyAttribute, INaughtyAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs.meta new file mode 100644 index 0000000..aa54215 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DrawerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9df37fdebccf65c4da5b0a14f6dad5f5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs new file mode 100644 index 0000000..2bf4702 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs @@ -0,0 +1,57 @@ +using System.Collections; +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class DropdownAttribute : DrawerAttribute + { + public string ValuesName { get; private set; } + + public DropdownAttribute(string valuesName) + { + ValuesName = valuesName; + } + } + + public interface IDropdownList : IEnumerable> + { + } + + public class DropdownList : IDropdownList + { + private List> _values; + + public DropdownList() + { + _values = new List>(); + } + + public void Add(string displayName, T value) + { + _values.Add(new KeyValuePair(displayName, value)); + } + + public IEnumerator> GetEnumerator() + { + return _values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public static explicit operator DropdownList(DropdownList target) + { + DropdownList result = new DropdownList(); + foreach (var kvp in target) + { + result.Add(kvp.Key, kvp.Value); + } + + return result; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs.meta new file mode 100644 index 0000000..b25926d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/DropdownAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2cb864a1092cec04f8a4dbb556e8ed31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs new file mode 100644 index 0000000..81aab8e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class EnumFlagsAttribute : DrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta new file mode 100644 index 0000000..25a52af --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/EnumFlagsAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8b31eb6d7299e54d89dcabc4cad0e6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs new file mode 100644 index 0000000..83d522e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ExpandableAttribute : DrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs.meta new file mode 100644 index 0000000..8fa04e4 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/Expandable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 60926d6ca7f9ced469e9248ff1192da6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs new file mode 100644 index 0000000..a3681bb --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class HorizontalLineAttribute : DrawerAttribute + { + public const float DefaultHeight = 2.0f; + public const EColor DefaultColor = EColor.Gray; + + public float Height { get; private set; } + public EColor Color { get; private set; } + + public HorizontalLineAttribute(float height = DefaultHeight, EColor color = DefaultColor) + { + Height = height; + Color = color; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta new file mode 100644 index 0000000..ecfd258 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/HorizontalLineAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2fdd6f99acca2fd42a4f3162d585ce95 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs new file mode 100644 index 0000000..cd66aab --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EInfoBoxType + { + Normal, + Warning, + Error + } + + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class InfoBoxAttribute : DrawerAttribute + { + public string Text { get; private set; } + public EInfoBoxType Type { get; private set; } + + public InfoBoxAttribute(string text, EInfoBoxType type = EInfoBoxType.Normal) + { + Text = text; + Type = type; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs.meta new file mode 100644 index 0000000..8748a6e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InfoBoxAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afd1d6323740c734893fa8397c53113b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs new file mode 100644 index 0000000..db74147 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class InputAxisAttribute : DrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs.meta new file mode 100644 index 0000000..da3b2c4 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/InputAxisAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85033978c18810f46af271bbe94cf4aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs new file mode 100644 index 0000000..6f56200 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class LayerAttribute : DrawerAttribute + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs.meta new file mode 100644 index 0000000..93d97f7 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/LayerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 668d19ebe071176448d1af816a9a0ce0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs new file mode 100644 index 0000000..4f93921 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinMaxSliderAttribute : DrawerAttribute + { + public float MinValue { get; private set; } + public float MaxValue { get; private set; } + + public MinMaxSliderAttribute(float minValue, float maxValue) + { + MinValue = minValue; + MaxValue = maxValue; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta new file mode 100644 index 0000000..03e5dcf --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/MinMaxSliderAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4aaa73f574deaa54187cb54aae571b24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs new file mode 100644 index 0000000..39344a0 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs @@ -0,0 +1,37 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ProgressBarAttribute : DrawerAttribute + { + public string Name { get; private set; } + public float MaxValue { get; set; } + public string MaxValueName { get; private set; } + public EColor Color { get; private set; } + + public ProgressBarAttribute(string name, float maxValue, EColor color = EColor.Blue) + { + Name = name; + MaxValue = maxValue; + Color = color; + } + + public ProgressBarAttribute(string name, string maxValueName, EColor color = EColor.Blue) + { + Name = name; + MaxValueName = maxValueName; + Color = color; + } + + public ProgressBarAttribute(float maxValue, EColor color = EColor.Blue) + : this("", maxValue, color) + { + } + + public ProgressBarAttribute(string maxValueName, EColor color = EColor.Blue) + : this("", maxValueName, color) + { + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs.meta new file mode 100644 index 0000000..11029f0 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ProgressBarAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e19e4db6f4d08f849aa8ea8155cd2760 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs new file mode 100644 index 0000000..1c5eddc --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ResizableTextAreaAttribute : DrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta new file mode 100644 index 0000000..cc11d00 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ResizableTextAreaAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56d9a4b795ef4a94d86b94e55fb81240 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs new file mode 100644 index 0000000..215ba6c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class SceneAttribute : DrawerAttribute + { + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs.meta new file mode 100644 index 0000000..f22649b --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/SceneAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e054de18423364f4688b72a0f2a472b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs new file mode 100644 index 0000000..75654b0 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowAssetPreviewAttribute : DrawerAttribute + { + public const int DefaultWidth = 64; + public const int DefaultHeight = 64; + + public int Width { get; private set; } + public int Height { get; private set; } + + public ShowAssetPreviewAttribute(int width = DefaultWidth, int height = DefaultHeight) + { + Width = width; + Height = height; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta new file mode 100644 index 0000000..4893b92 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/ShowAssetPreviewAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b7dd9b44abc0054cb5cd68d74be2c1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs new file mode 100644 index 0000000..200374e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class TagAttribute : DrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs.meta new file mode 100644 index 0000000..618033c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes/TagAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8903399bbd7c9d745a7b9188ab6c8320 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase.meta new file mode 100644 index 0000000..3096ac4 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5cf879ed72221e740a7aa02ef9c366a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs new file mode 100644 index 0000000..1488d63 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs @@ -0,0 +1,33 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EButtonEnableMode + { + /// + /// Button should be active always + /// + Always, + /// + /// Button should be active only in editor + /// + Editor, + /// + /// Button should be active only in playmode + /// + Playmode + } + + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class ButtonAttribute : SpecialCaseDrawerAttribute + { + public string Text { get; private set; } + public EButtonEnableMode SelectedEnableMode { get; private set; } + + public ButtonAttribute(string text = null, EButtonEnableMode enabledMode = EButtonEnableMode.Always) + { + this.Text = text; + this.SelectedEnableMode = enabledMode; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta new file mode 100644 index 0000000..cc7be5c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ButtonAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8fe363a25ec5e24a9dd510bb0b4a0d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs new file mode 100644 index 0000000..43ae334 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReorderableListAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta new file mode 100644 index 0000000..add3c4a --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ReorderableListAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6189b48f4055e6c47aa132632d898fa6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs new file mode 100644 index 0000000..e3b9376 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + public class ShowNativePropertyAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta new file mode 100644 index 0000000..5aed9a2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNativePropertyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8e9b7b71c94a1f459336a24cfe04b1b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs new file mode 100644 index 0000000..9bf0609 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ShowNonSerializedFieldAttribute : SpecialCaseDrawerAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta new file mode 100644 index 0000000..84d5624 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/ShowNonSerializedFieldAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ea09f60df536734184a8920ff8bda6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs new file mode 100644 index 0000000..e71be81 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class SpecialCaseDrawerAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta new file mode 100644 index 0000000..3b4bd25 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/DrawerAttributes_SpecialCase/SpecialCaseDrawerAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95a59093f8ed1af48a8be75fa3050a3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs new file mode 100644 index 0000000..b67ba03 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public interface INaughtyAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs.meta new file mode 100644 index 0000000..e2dd9d9 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/INaughtyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: edda855906d15e541b46efd812fd70f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes.meta new file mode 100644 index 0000000..547f24d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64c95d02a2004854585e8d923d6680d0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs new file mode 100644 index 0000000..23d7e00 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class BoxGroupAttribute : MetaAttribute, IGroupAttribute + { + public string Name { get; private set; } + + public BoxGroupAttribute(string name = "") + { + Name = name; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs.meta new file mode 100644 index 0000000..d68d8de --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/BoxGroupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07da8af1e3be52c4789678bf4138ae11 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs new file mode 100644 index 0000000..68c92b4 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class DisableIfAttribute : EnableIfAttributeBase + { + public DisableIfAttribute(string condition) + : base(condition) + { + Inverted = true; + } + + public DisableIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = true; + } + + public DisableIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = true; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs.meta new file mode 100644 index 0000000..b91dc52 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/DisableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 52a0d5c249ac8fd42a4fb4d61bc2f797 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs new file mode 100644 index 0000000..e22afdf --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class EnableIfAttribute : EnableIfAttributeBase + { + public EnableIfAttribute(string condition) + : base(condition) + { + Inverted = false; + } + + public EnableIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = false; + } + + public EnableIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = false; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs.meta new file mode 100644 index 0000000..f3a696c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a616ae826c8ebae45a89d6a8cb68a843 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs new file mode 100644 index 0000000..3e6d667 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs @@ -0,0 +1,39 @@ +using System; + +namespace NaughtyAttributes +{ + public abstract class EnableIfAttributeBase : MetaAttribute + { + public string[] Conditions { get; private set; } + public EConditionOperator ConditionOperator { get; private set; } + public bool Inverted { get; protected set; } + + /// + /// If this not null, [0] is name of an enum variable. + /// + public Enum EnumValue { get; private set; } + + public EnableIfAttributeBase(string condition) + { + ConditionOperator = EConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public EnableIfAttributeBase(EConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + + public EnableIfAttributeBase(string enumName, Enum enumValue) + : this(enumName) + { + if (enumValue == null) + { + throw new ArgumentNullException(nameof(enumValue), "This parameter must be an enum value."); + } + + EnumValue = enumValue; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs.meta new file mode 100644 index 0000000..45fd5eb --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/EnableIfAttributeBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ba6385cd022e164b89ead1937173ddc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs new file mode 100644 index 0000000..cf20f17 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class FoldoutAttribute : MetaAttribute, IGroupAttribute + { + public string Name { get; private set; } + + public FoldoutAttribute(string name) + { + Name = name; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs.meta new file mode 100644 index 0000000..e39736b --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/FoldoutAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95f184555d5079243b2d25b35a641a74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs new file mode 100644 index 0000000..0f8533e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class HideIfAttribute : ShowIfAttributeBase + { + public HideIfAttribute(string condition) + : base(condition) + { + Inverted = true; + } + + public HideIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = true; + } + + public HideIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = true; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs.meta new file mode 100644 index 0000000..888cf89 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/HideIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ab2d0fcfb13a214ea6ef7629c96a761 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs new file mode 100644 index 0000000..7c1ea76 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs @@ -0,0 +1,8 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + public interface IGroupAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs.meta new file mode 100644 index 0000000..47db85d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/IGroupAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7c437b9ac50575347a7b12520f37f9a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs new file mode 100644 index 0000000..45e5d19 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class LabelAttribute : MetaAttribute + { + public string Label { get; private set; } + + public LabelAttribute(string label) + { + Label = label; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs.meta new file mode 100644 index 0000000..9488d54 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/LabelAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79e0e0c0a7c25ea4fbe8eecaa4d559a0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs new file mode 100644 index 0000000..b63026a --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class MetaAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs.meta new file mode 100644 index 0000000..a7be132 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/MetaAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a482b4e0fbf0f4547a5d522182a68d24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs new file mode 100644 index 0000000..fcbb187 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = true, Inherited = true)] + public class OnValueChangedAttribute : MetaAttribute + { + public string CallbackName { get; private set; } + + public OnValueChangedAttribute(string callbackName) + { + CallbackName = callbackName; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs.meta new file mode 100644 index 0000000..4a92c4b --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/OnValueChangedAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e16a27c5576022b4bbe997c7db9051f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs new file mode 100644 index 0000000..78a4705 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ReadOnlyAttribute : MetaAttribute + { + + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs.meta new file mode 100644 index 0000000..24ec846 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ReadOnlyAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e57264747ba93b94fbff12733de29499 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs new file mode 100644 index 0000000..3d721da --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs @@ -0,0 +1,26 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class ShowIfAttribute : ShowIfAttributeBase + { + public ShowIfAttribute(string condition) + : base(condition) + { + Inverted = false; + } + + public ShowIfAttribute(EConditionOperator conditionOperator, params string[] conditions) + : base(conditionOperator, conditions) + { + Inverted = false; + } + + public ShowIfAttribute(string enumName, object enumValue) + : base(enumName, enumValue as Enum) + { + Inverted = false; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs.meta new file mode 100644 index 0000000..4556ac2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ada427cfd2c9b04989d6d18dea27985 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs new file mode 100644 index 0000000..8f76ed4 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs @@ -0,0 +1,39 @@ +using System; + +namespace NaughtyAttributes +{ + public class ShowIfAttributeBase : MetaAttribute + { + public string[] Conditions { get; private set; } + public EConditionOperator ConditionOperator { get; private set; } + public bool Inverted { get; protected set; } + + /// + /// If this not null, [0] is name of an enum variable. + /// + public Enum EnumValue { get; private set; } + + public ShowIfAttributeBase(string condition) + { + ConditionOperator = EConditionOperator.And; + Conditions = new string[1] { condition }; + } + + public ShowIfAttributeBase(EConditionOperator conditionOperator, params string[] conditions) + { + ConditionOperator = conditionOperator; + Conditions = conditions; + } + + public ShowIfAttributeBase(string enumName, Enum enumValue) + : this(enumName) + { + if (enumValue == null) + { + throw new ArgumentNullException(nameof(enumValue), "This parameter must be an enum value."); + } + + EnumValue = enumValue; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs.meta new file mode 100644 index 0000000..e82a9ad --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/MetaAttributes/ShowIfAttributeBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0532b1c4d8a9ccf4b9f98f0bbe4a6747 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef b/Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef new file mode 100644 index 0000000..569e4e6 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef @@ -0,0 +1,12 @@ +{ + "name": "NaughtyAttributes.Core", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef.meta new file mode 100644 index 0000000..731749c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/NaughtyAttributes.Core.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 776d03a35f1b52c4a9aed9f56d7b4229 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility.meta new file mode 100644 index 0000000..80be476 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d61a3a977073c740ae13a3683ed22a1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs new file mode 100644 index 0000000..f938b93 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace NaughtyAttributes +{ + public enum EColor + { + Clear, + White, + Black, + Gray, + Red, + Pink, + Orange, + Yellow, + Green, + Blue, + Indigo, + Violet + } + + public static class EColorExtensions + { + public static Color GetColor(this EColor color) + { + switch (color) + { + case EColor.Clear: + return new Color32(0, 0, 0, 0); + case EColor.White: + return new Color32(255, 255, 255, 255); + case EColor.Black: + return new Color32(0, 0, 0, 255); + case EColor.Gray: + return new Color32(128, 128, 128, 255); + case EColor.Red: + return new Color32(255, 0, 63, 255); + case EColor.Pink: + return new Color32(255, 152, 203, 255); + case EColor.Orange: + return new Color32(255, 128, 0, 255); + case EColor.Yellow: + return new Color32(255, 211, 0, 255); + case EColor.Green: + return new Color32(98, 200, 79, 255); + case EColor.Blue: + return new Color32(0, 135, 189, 255); + case EColor.Indigo: + return new Color32(75, 0, 130, 255); + case EColor.Violet: + return new Color32(128, 0, 255, 255); + default: + return new Color32(0, 0, 0, 255); + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs.meta new file mode 100644 index 0000000..0f32c5e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EColor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 059f8674a8065924ea9c678298b5cd63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs new file mode 100644 index 0000000..9ff8c0a --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs @@ -0,0 +1,10 @@ +using System; + +namespace NaughtyAttributes +{ + public enum EConditionOperator + { + And, + Or + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs.meta new file mode 100644 index 0000000..60e3264 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/Utility/EConditionOperator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c227b6c19fc67b46ad294d95818f85a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes.meta new file mode 100644 index 0000000..d5aba48 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf91d63e37bed3e4cbf75d576fc03a21 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs new file mode 100644 index 0000000..62c1dc3 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MaxValueAttribute : ValidatorAttribute + { + public float MaxValue { get; private set; } + + public MaxValueAttribute(float maxValue) + { + MaxValue = maxValue; + } + + public MaxValueAttribute(int maxValue) + { + MaxValue = maxValue; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs.meta new file mode 100644 index 0000000..b02fdbc --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MaxValueAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a748250af5ccfd7499cfb444aafb8a03 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs new file mode 100644 index 0000000..507c034 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs @@ -0,0 +1,20 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class MinValueAttribute : ValidatorAttribute + { + public float MinValue { get; private set; } + + public MinValueAttribute(float minValue) + { + MinValue = minValue; + } + + public MinValueAttribute(int minValue) + { + MinValue = minValue; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs.meta new file mode 100644 index 0000000..9d90191 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/MinValueAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40133bac7c8d42b4d837138430a503e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs new file mode 100644 index 0000000..b1161a5 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class RequiredAttribute : ValidatorAttribute + { + public string Message { get; private set; } + + public RequiredAttribute(string message = null) + { + Message = message; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs.meta new file mode 100644 index 0000000..7f87cfc --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/RequiredAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b0cdf49d1687849458b1a8d4786553d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs new file mode 100644 index 0000000..6a353c2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NaughtyAttributes +{ + [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)] + public class ValidateInputAttribute : ValidatorAttribute + { + public string CallbackName { get; private set; } + public string Message { get; private set; } + + public ValidateInputAttribute(string callbackName, string message = null) + { + CallbackName = callbackName; + Message = message; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta new file mode 100644 index 0000000..0addd1a --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidateInputAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c4171d68fb5bc0448d3ac298973e82c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs new file mode 100644 index 0000000..3b1201d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace NaughtyAttributes +{ + public class ValidatorAttribute : Attribute, INaughtyAttribute + { + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs.meta new file mode 100644 index 0000000..f5daea8 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Core/ValidatorAttributes/ValidatorAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0f3c43bed2dbc5249b6c6ec7859c2020 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor.meta new file mode 100644 index 0000000..e6d284d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3f898b36e67bd14c92e03d636f51c7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers.meta new file mode 100644 index 0000000..79b2c37 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3041a2296f3b1749b3ef18e695adee4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs new file mode 100644 index 0000000..dae6544 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs @@ -0,0 +1,23 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(HorizontalLineAttribute))] + public class HorizontalLineDecoratorDrawer : DecoratorDrawer + { + public override float GetHeight() + { + HorizontalLineAttribute lineAttr = (HorizontalLineAttribute)attribute; + return EditorGUIUtility.singleLineHeight + lineAttr.Height; + } + + public override void OnGUI(Rect position) + { + Rect rect = EditorGUI.IndentedRect(position); + rect.y += EditorGUIUtility.singleLineHeight / 3.0f; + HorizontalLineAttribute lineAttr = (HorizontalLineAttribute)attribute; + NaughtyEditorGUI.HorizontalLine(rect, lineAttr.Height, lineAttr.Color.GetColor()); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta new file mode 100644 index 0000000..719f6d8 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/HorizontalLineDecoratorDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ec99f3a124f20e40b8f5edfeb1ecced +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs new file mode 100644 index 0000000..89249ae --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs @@ -0,0 +1,59 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(InfoBoxAttribute))] + public class InfoBoxDecoratorDrawer : DecoratorDrawer + { + public override float GetHeight() + { + return GetHelpBoxHeight(); + } + + public override void OnGUI(Rect rect) + { + InfoBoxAttribute infoBoxAttribute = (InfoBoxAttribute)attribute; + + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect infoBoxRect = new Rect( + rect.x + indentLength, + rect.y, + rect.width - indentLength, + GetHelpBoxHeight()); + + DrawInfoBox(infoBoxRect, infoBoxAttribute.Text, infoBoxAttribute.Type); + } + + private float GetHelpBoxHeight() + { + InfoBoxAttribute infoBoxAttribute = (InfoBoxAttribute)attribute; + float minHeight = EditorGUIUtility.singleLineHeight * 2.0f; + float desiredHeight = GUI.skin.box.CalcHeight(new GUIContent(infoBoxAttribute.Text), EditorGUIUtility.currentViewWidth); + float height = Mathf.Max(minHeight, desiredHeight); + + return height; + } + + private void DrawInfoBox(Rect rect, string infoText, EInfoBoxType infoBoxType) + { + MessageType messageType = MessageType.None; + switch (infoBoxType) + { + case EInfoBoxType.Normal: + messageType = MessageType.Info; + break; + + case EInfoBoxType.Warning: + messageType = MessageType.Warning; + break; + + case EInfoBoxType.Error: + messageType = MessageType.Error; + break; + } + + NaughtyEditorGUI.HelpBox(rect, infoText, messageType); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta new file mode 100644 index 0000000..5f50ace --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/DecoratorDrawers/InfoBoxDecoratorDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9c18b0e698717442b7631c5066d667f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef new file mode 100644 index 0000000..e1aafc2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "NaughtyAttributes.Editor", + "references": [ + "NaughtyAttributes.Core" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef.meta new file mode 100644 index 0000000..70dc9f2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyAttributes.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f88fb04354076c646a4107a491394033 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs new file mode 100644 index 0000000..2be2908 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs @@ -0,0 +1,301 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(UnityEngine.Object), true)] + public class NaughtyInspector : UnityEditor.Editor + { + protected List _serializedProperties = new List(); + protected List _nonSerializedFields; + protected List _nativeProperties; + protected List _methods; + + protected List _nonGroupedSerializedProperty; + protected SerializedProperty m_ScriptProperty; + + protected List> _groupedSerialzedProperty; + protected List> _foldoutGroupedSerializedProperty; + + private Dictionary _foldouts = new Dictionary(); + + private bool _anyNaughtyAttribute; + + protected bool _useCachedMetaAttributes; + protected bool _changeDetected; + + protected virtual void OnEnable() + { + this.Prepare(); + } + + protected virtual void OnDisable() + { + //cleanup memory + ReorderableListPropertyDrawer.Instance.ClearCache(); + + _nonSerializedFields.Clear(); + _nativeProperties.Clear(); + _methods.Clear(); + _foldouts.Clear(); + + _foldoutGroupedSerializedProperty.Clear(); + _groupedSerialzedProperty.Clear(); + _nonGroupedSerializedProperty.Clear(); + _serializedProperties.Clear(); + + m_ScriptProperty = default; + } + + public virtual void Prepare() + { + _nonSerializedFields = ReflectionUtility.GetAllFields( + target, f => f.GetCustomAttributes(typeof(ShowNonSerializedFieldAttribute), true).Length > 0).ToList(); + + _nativeProperties = ReflectionUtility.GetAllProperties( + target, p => p.GetCustomAttributes(typeof(ShowNativePropertyAttribute), true).Length > 0).ToList(); + + _methods = ReflectionUtility.GetAllMethods( + target, m => m.GetCustomAttributes(typeof(ButtonAttribute), true).Length > 0).ToList(); + + GetSerializedProperties(ref _serializedProperties); + + _anyNaughtyAttribute = _serializedProperties.Any(p => PropertyUtility.GetAttribute(p.serializedProperty) != null); + + _nonGroupedSerializedProperty = GetNonGroupedProperties(_serializedProperties).ToList(); + + //.First(...) doesnt work for some reason because the m_Script field isnt loaded yet I assume + NaughtyProperty[] mScripts = _serializedProperties.Where(p => p.serializedProperty.name.Equals("m_Script")).ToArray(); + m_ScriptProperty = mScripts.Length > 0 ? mScripts[0].serializedProperty : null; + + _groupedSerialzedProperty = GetGroupedProperties(_serializedProperties).ToList(); + + _foldoutGroupedSerializedProperty = GetFoldoutProperties(_serializedProperties).ToList(); + + _useCachedMetaAttributes = false; + } + + public override void OnInspectorGUI() + { + _changeDetected = false; + + if (!_anyNaughtyAttribute) + { + DrawDefaultInspector(); + } + else + { + DrawSerializedProperties(); + } + + DrawNonSerializedFields(); + DrawNativeProperties(); + DrawButtons(); + + _useCachedMetaAttributes = !_changeDetected; + } + + protected virtual void GetSerializedProperties(ref List outSerializedProperties) + { + outSerializedProperties.Clear(); + outSerializedProperties.TrimExcess(); + + using (var iterator = serializedObject.GetIterator()) + { + if (iterator.NextVisible(true)) + { + do + { + outSerializedProperties.Add( + PropertyUtility.CreateNaughtyProperty( + serializedObject.FindProperty(iterator.name))); + } + while (iterator.NextVisible(false)); + } + } + } + + protected virtual void DrawSerializedProperties() + { + serializedObject.Update(); + + if (m_ScriptProperty != null) + { + using (new EditorGUI.DisabledScope(disabled: true)) + { + EditorGUILayout.PropertyField(m_ScriptProperty); + } + } + + // Draw non-grouped serialized properties + foreach (var naughtyProperty in _nonGroupedSerializedProperty) + { + if (!_useCachedMetaAttributes) + { + naughtyProperty.cachedIsVisible = PropertyUtility.IsVisible(naughtyProperty.showIfAttribute, + naughtyProperty.serializedProperty); + + naughtyProperty.cachedIsEnabled = PropertyUtility.IsEnabled(naughtyProperty.readOnlyAttribute, naughtyProperty.enableIfAttribute, + naughtyProperty.serializedProperty); + } + + _changeDetected |= NaughtyEditorGUI.PropertyField_Layout(naughtyProperty, includeChildren: true); + } + + // Draw grouped serialized properties + foreach (var group in _groupedSerialzedProperty) + { + IEnumerable visibleProperties = + _useCachedMetaAttributes + ? group.Where(p => p.cachedIsVisible) + : group.Where(p => + { + p.cachedIsEnabled = PropertyUtility.IsEnabled(p.readOnlyAttribute, p.enableIfAttribute, + p.serializedProperty); + + return p.cachedIsVisible = + PropertyUtility.IsVisible(p.showIfAttribute, p.serializedProperty); + }); + + if (!visibleProperties.Any()) + { + continue; + } + + NaughtyEditorGUI.BeginBoxGroup_Layout(group.Key); + foreach (var naughtyProperty in visibleProperties) + { + _changeDetected |= NaughtyEditorGUI.PropertyField_Layout(naughtyProperty, includeChildren: true); + } + NaughtyEditorGUI.EndBoxGroup_Layout(); + } + + // Draw foldout serialized properties + foreach (var group in _foldoutGroupedSerializedProperty) + { + IEnumerable visibleProperties = + _useCachedMetaAttributes + ? group.Where(p => p.cachedIsVisible) + : group.Where(p => + { + p.cachedIsEnabled = PropertyUtility.IsEnabled(p.readOnlyAttribute, p.enableIfAttribute, + p.serializedProperty); + + return p.cachedIsVisible = + PropertyUtility.IsVisible(p.showIfAttribute, p.serializedProperty); + }); + + if (!visibleProperties.Any()) + { + continue; + } + + if (!_foldouts.ContainsKey(group.Key)) + { + _foldouts[group.Key] = new SavedBool($"{target.GetInstanceID()}.{group.Key}", false); + } + + _foldouts[group.Key].Value = EditorGUILayout.Foldout(_foldouts[group.Key].Value, group.Key, true); + if (_foldouts[group.Key].Value) + { + foreach (var naughtyProperty in visibleProperties) + { + _changeDetected |= NaughtyEditorGUI.PropertyField_Layout(naughtyProperty, true); + } + } + } + + serializedObject.ApplyModifiedProperties(); + } + + protected virtual void DrawNonSerializedFields(bool drawHeader = false) + { + if (_nonSerializedFields.Any()) + { + if (drawHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Non-Serialized Fields", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + } + + foreach (var field in _nonSerializedFields) + { + NaughtyEditorGUI.NonSerializedField_Layout(serializedObject.targetObject, field); + } + } + } + + protected virtual void DrawNativeProperties(bool drawHeader = false) + { + if (_nativeProperties.Any()) + { + if (drawHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Native Properties", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + } + + foreach (var property in _nativeProperties) + { + NaughtyEditorGUI.NativeProperty_Layout(serializedObject.targetObject, property); + } + } + } + + protected virtual void DrawButtons(bool drawHeader = false) + { + if (_methods.Any()) + { + if (drawHeader) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Buttons", GetHeaderGUIStyle()); + NaughtyEditorGUI.HorizontalLine( + EditorGUILayout.GetControlRect(false), HorizontalLineAttribute.DefaultHeight, HorizontalLineAttribute.DefaultColor.GetColor()); + } + + foreach (var method in _methods) + { + NaughtyEditorGUI.Button(serializedObject.targetObject, method); + } + } + } + + private static IEnumerable GetNonGroupedProperties(IEnumerable properties) + { + return properties.Where(p => PropertyUtility.GetAttribute(p.serializedProperty) == null && !p.serializedProperty.name.Equals("m_Script")); + } + + private static IEnumerable> GetGroupedProperties(IEnumerable properties) + { + return properties + .Where(p => PropertyUtility.GetAttribute(p.serializedProperty) != null) + .GroupBy(p => PropertyUtility.GetAttribute(p.serializedProperty).Name); + } + + private static IEnumerable> GetFoldoutProperties(IEnumerable properties) + { + return properties + .Where(p => PropertyUtility.GetAttribute(p.serializedProperty) != null) + .GroupBy(p => PropertyUtility.GetAttribute(p.serializedProperty).Name); + } + + private static GUIStyle GetHeaderGUIStyle() + { + GUIStyle style = new GUIStyle(EditorStyles.centeredGreyMiniLabel); + style.fontStyle = FontStyle.Bold; + style.alignment = TextAnchor.UpperCenter; + + return style; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs.meta new file mode 100644 index 0000000..b63e99f --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b9b53879f7c93b42835c3ad9e0d0a66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs new file mode 100644 index 0000000..2a68e6b --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs @@ -0,0 +1,21 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class NaughtyProperty + { + public SerializedProperty serializedProperty; + + public LabelAttribute labelAttribute; + + public SpecialCaseDrawerAttribute specialCaseDrawerAttribute; + + public ShowIfAttributeBase showIfAttribute; + public EnableIfAttributeBase enableIfAttribute; + public ReadOnlyAttribute readOnlyAttribute; + public ValidatorAttribute[] validatorAttributes; + + public bool cachedIsVisible = true; + public bool cachedIsEnabled = true; + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs.meta new file mode 100644 index 0000000..cbb0337 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/NaughtyProperty.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12288d0262da08245af3b1fef6421c75 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers.meta new file mode 100644 index 0000000..7d7dbed --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4327d74fca5deaa4c83c483fe468d274 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs new file mode 100644 index 0000000..7e81b12 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs @@ -0,0 +1,16 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(AllowNestingAttribute))] + public class AllowNestingPropertyDrawer : PropertyDrawerBase + { + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + EditorGUI.PropertyField(rect, property, label, true); + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta new file mode 100644 index 0000000..f2f2145 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AllowNestingPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3175e7041b8f4348bd652485a78e7b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs new file mode 100644 index 0000000..75a6ff8 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs @@ -0,0 +1,181 @@ +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEditor.Animations; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(AnimatorParamAttribute))] + public class AnimatorParamPropertyDrawer : PropertyDrawerBase + { + private AnimatorParamAttribute _cachedAnimatorParamAttribute; + + private const string InvalidAnimatorControllerWarningMessage = "Target animator controller is null"; + private const string InvalidTypeWarningMessage = "{0} must be an int or a string"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (_cachedAnimatorParamAttribute == null) + _cachedAnimatorParamAttribute = PropertyUtility.GetAttribute(property); + + AnimatorParamAttribute animatorParamAttribute = _cachedAnimatorParamAttribute; + bool validAnimatorController = GetAnimatorController(property, animatorParamAttribute.AnimatorName) != null; + bool validPropertyType = property.propertyType == SerializedPropertyType.Integer || property.propertyType == SerializedPropertyType.String; + + return (validAnimatorController && validPropertyType) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (_cachedAnimatorParamAttribute == null) + _cachedAnimatorParamAttribute = PropertyUtility.GetAttribute(property); + + AnimatorParamAttribute animatorParamAttribute = _cachedAnimatorParamAttribute; + + AnimatorController animatorController = GetAnimatorController(property, animatorParamAttribute.AnimatorName); + if (animatorController == null) + { + DrawDefaultPropertyAndHelpBox(rect, property, InvalidAnimatorControllerWarningMessage, MessageType.Warning); + return; + } + + int parametersCount = animatorController.parameters.Length; + List animatorParameters = new List(parametersCount); + for (int i = 0; i < parametersCount; i++) + { + AnimatorControllerParameter parameter = animatorController.parameters[i]; + if (animatorParamAttribute.AnimatorParamType == null || parameter.type == animatorParamAttribute.AnimatorParamType) + { + animatorParameters.Add(parameter); + } + } + + switch (property.propertyType) + { + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, animatorParameters); + break; + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, animatorParameters); + break; + default: + DrawDefaultPropertyAndHelpBox(rect, property, string.Format(InvalidTypeWarningMessage, property.name), MessageType.Warning); + break; + } + + EditorGUI.EndProperty(); + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, List animatorParameters) + { + int paramNameHash = property.intValue; + int index = 0; + + for (int i = 0; i < animatorParameters.Count; i++) + { + if (paramNameHash == animatorParameters[i].nameHash) + { + index = i + 1; // +1 because the first option is reserved for (None) + break; + } + } + + string[] displayOptions = GetDisplayOptions(animatorParameters); + + int newIndex = EditorGUI.Popup(rect, label.text, index, displayOptions); + int newValue = newIndex == 0 ? 0 : animatorParameters[newIndex - 1].nameHash; + + if (property.intValue != newValue) + { + property.intValue = newValue; + } + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, List animatorParameters) + { + string paramName = property.stringValue; + int index = 0; + + for (int i = 0; i < animatorParameters.Count; i++) + { + if (paramName.Equals(animatorParameters[i].name, System.StringComparison.Ordinal)) + { + index = i + 1; // +1 because the first option is reserved for (None) + break; + } + } + + string[] displayOptions = GetDisplayOptions(animatorParameters); + + int newIndex = EditorGUI.Popup(rect, label.text, index, displayOptions); + string newValue = newIndex == 0 ? null : animatorParameters[newIndex - 1].name; + + if (!property.stringValue.Equals(newValue, System.StringComparison.Ordinal)) + { + property.stringValue = newValue; + } + } + + private static string[] GetDisplayOptions(List animatorParams) + { + string[] displayOptions = new string[animatorParams.Count + 1]; + displayOptions[0] = "(None)"; + + for (int i = 0; i < animatorParams.Count; i++) + { + displayOptions[i + 1] = animatorParams[i].name; + } + + return displayOptions; + } + + private static AnimatorController GetAnimatorController(SerializedProperty property, string animatorName) + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo animatorFieldInfo = ReflectionUtility.GetField(target, animatorName); + if (animatorFieldInfo != null && + animatorFieldInfo.FieldType == typeof(Animator)) + { + Animator animator = animatorFieldInfo.GetValue(target) as Animator; + if (animator != null) + { + AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController; + return animatorController; + } + } + + PropertyInfo animatorPropertyInfo = ReflectionUtility.GetProperty(target, animatorName); + if (animatorPropertyInfo != null && + animatorPropertyInfo.PropertyType == typeof(Animator)) + { + Animator animator = animatorPropertyInfo.GetValue(target) as Animator; + if (animator != null) + { + AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController; + return animatorController; + } + } + + MethodInfo animatorGetterMethodInfo = ReflectionUtility.GetMethod(target, animatorName); + if (animatorGetterMethodInfo != null && + animatorGetterMethodInfo.ReturnType == typeof(Animator) && + animatorGetterMethodInfo.GetParameters().Length == 0) + { + Animator animator = animatorGetterMethodInfo.Invoke(target, null) as Animator; + if (animator != null) + { + AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController; + return animatorController; + } + } + + return null; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta new file mode 100644 index 0000000..4c3a7e6 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/AnimatorParamPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98ff8cb1bcefae740a68d9a5c5ee3563 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs new file mode 100644 index 0000000..0329b20 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs @@ -0,0 +1,47 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(CurveRangeAttribute))] + public class CurveRangePropertyDrawer : PropertyDrawerBase + { + private CurveRangeAttribute _cachedCurveRangeAttribute; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + float propertyHeight = property.propertyType == SerializedPropertyType.AnimationCurve + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + + return propertyHeight; + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + // Check user error + if (property.propertyType != SerializedPropertyType.AnimationCurve) + { + string message = string.Format("Field {0} is not an AnimationCurve", property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + return; + } + + if (_cachedCurveRangeAttribute == null) + _cachedCurveRangeAttribute = PropertyUtility.GetAttribute(property); + + var attribute = _cachedCurveRangeAttribute; + + EditorGUI.CurveField( + rect, + property, + attribute.Color == EColor.Clear ? Color.green : attribute.Color.GetColor(), + new Rect(attribute.Min.x, attribute.Min.y, attribute.Max.x - attribute.Min.x, attribute.Max.y - attribute.Min.y), + label); + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta new file mode 100644 index 0000000..adea11e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/CurveRangePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 798b8c99fbc072a4b83ee387e472a2bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs new file mode 100644 index 0000000..88d64de --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs @@ -0,0 +1,177 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Reflection; +using System; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(DropdownAttribute))] + public class DropdownPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + DropdownAttribute dropdownAttribute = (DropdownAttribute)attribute; + object values = GetValues(property, dropdownAttribute.ValuesName); + FieldInfo fieldInfo = ReflectionUtility.GetField(PropertyUtility.GetTargetObjectWithProperty(property), property.name); + + float propertyHeight = AreValuesValid(values, fieldInfo) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + + return propertyHeight; + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + DropdownAttribute dropdownAttribute = (DropdownAttribute)attribute; + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + object valuesObject = GetValues(property, dropdownAttribute.ValuesName); + FieldInfo dropdownField = ReflectionUtility.GetField(target, property.name); + + if (AreValuesValid(valuesObject, dropdownField)) + { + if (valuesObject is IList && dropdownField.FieldType == GetElementType(valuesObject)) + { + // Selected value + object selectedValue = dropdownField.GetValue(target); + + // Values and display options + IList valuesList = (IList)valuesObject; + object[] values = new object[valuesList.Count]; + string[] displayOptions = new string[valuesList.Count]; + + for (int i = 0; i < values.Length; i++) + { + object value = valuesList[i]; + values[i] = value; + displayOptions[i] = value == null ? "" : value.ToString(); + } + + // Selected value index + int selectedValueIndex = Array.IndexOf(values, selectedValue); + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + NaughtyEditorGUI.Dropdown( + rect, property.serializedObject, target, dropdownField, label.text, selectedValueIndex, values, displayOptions); + } + else if (valuesObject is IDropdownList) + { + // Current value + object selectedValue = dropdownField.GetValue(target); + + // Current value index, values and display options + int index = -1; + int selectedValueIndex = -1; + List values = new List(); + List displayOptions = new List(); + IDropdownList dropdown = (IDropdownList)valuesObject; + + using (IEnumerator> dropdownEnumerator = dropdown.GetEnumerator()) + { + while (dropdownEnumerator.MoveNext()) + { + index++; + + KeyValuePair current = dropdownEnumerator.Current; + if (current.Value?.Equals(selectedValue) == true) + { + selectedValueIndex = index; + } + + values.Add(current.Value); + + if (current.Key == null) + { + displayOptions.Add(""); + } + else if (string.IsNullOrWhiteSpace(current.Key)) + { + displayOptions.Add(""); + } + else + { + displayOptions.Add(current.Key); + } + } + } + + if (selectedValueIndex < 0) + { + selectedValueIndex = 0; + } + + NaughtyEditorGUI.Dropdown( + rect, property.serializedObject, target, dropdownField, label.text, selectedValueIndex, values.ToArray(), displayOptions.ToArray()); + } + } + else + { + string message = string.Format("Invalid values with name '{0}' provided to '{1}'. Either the values name is incorrect or the types of the target field and the values field/property/method don't match", + dropdownAttribute.ValuesName, dropdownAttribute.GetType().Name); + + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private object GetValues(SerializedProperty property, string valuesName) + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo valuesFieldInfo = ReflectionUtility.GetField(target, valuesName); + if (valuesFieldInfo != null) + { + return valuesFieldInfo.GetValue(target); + } + + PropertyInfo valuesPropertyInfo = ReflectionUtility.GetProperty(target, valuesName); + if (valuesPropertyInfo != null) + { + return valuesPropertyInfo.GetValue(target); + } + + MethodInfo methodValuesInfo = ReflectionUtility.GetMethod(target, valuesName); + if (methodValuesInfo != null && + methodValuesInfo.ReturnType != typeof(void) && + methodValuesInfo.GetParameters().Length == 0) + { + return methodValuesInfo.Invoke(target, null); + } + + return null; + } + + private bool AreValuesValid(object values, FieldInfo dropdownField) + { + if (values == null || dropdownField == null) + { + return false; + } + + if ((values is IList && dropdownField.FieldType == GetElementType(values)) || + (values is IDropdownList)) + { + return true; + } + + return false; + } + + private Type GetElementType(object values) + { + Type valuesType = values.GetType(); + Type elementType = ReflectionUtility.GetListElementType(valuesType); + + return elementType; + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta new file mode 100644 index 0000000..fecae2c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/DropdownPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd080b36769bcd94d909fc0431cf25e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs new file mode 100644 index 0000000..63236a1 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs @@ -0,0 +1,38 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(EnumFlagsAttribute))] + public class EnumFlagsPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + Enum targetEnum = PropertyUtility.GetTargetObjectOfProperty(property) as Enum; + + return (targetEnum != null) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + Enum targetEnum = PropertyUtility.GetTargetObjectOfProperty(property) as Enum; + if (targetEnum != null) + { + Enum enumNew = EditorGUI.EnumFlagsField(rect, label.text, targetEnum); + property.intValue = (int)Convert.ChangeType(enumNew, targetEnum.GetType()); + } + else + { + string message = attribute.GetType().Name + " can be used only on enums"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta new file mode 100644 index 0000000..c0081d2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/EnumFlagsPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b750e1461c1126d4399459b90b31e75e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs new file mode 100644 index 0000000..81d86a5 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs @@ -0,0 +1,197 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ExpandableAttribute))] + public class ExpandablePropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (property.objectReferenceValue == null) + { + return GetPropertyHeight(property); + } + + System.Type propertyType = PropertyUtility.GetPropertyType(property); + if (typeof(ScriptableObject).IsAssignableFrom(propertyType)) + { + ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; + if (scriptableObject == null) + { + return GetPropertyHeight(property); + } + + if (property.isExpanded) + { + using (SerializedObject serializedObject = new SerializedObject(scriptableObject)) + { + float totalHeight = EditorGUIUtility.singleLineHeight; + + using (var iterator = serializedObject.GetIterator()) + { + if (iterator.NextVisible(true)) + { + do + { + SerializedProperty childProperty = serializedObject.FindProperty(iterator.name); + if (childProperty.name.Equals("m_Script", System.StringComparison.Ordinal)) + { + continue; + } + + bool visible = PropertyUtility.IsVisible(childProperty); + if (!visible) + { + continue; + } + + float height = GetPropertyHeight(childProperty); + totalHeight += height; + } + while (iterator.NextVisible(false)); + } + } + + totalHeight += EditorGUIUtility.standardVerticalSpacing; + return totalHeight; + } + } + else + { + return GetPropertyHeight(property); + } + } + else + { + return GetPropertyHeight(property) + GetHelpBoxHeight(); + } + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.objectReferenceValue == null) + { + EditorGUI.PropertyField(rect, property, label, false); + } + else + { + System.Type propertyType = PropertyUtility.GetPropertyType(property); + if (typeof(ScriptableObject).IsAssignableFrom(propertyType)) + { + ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; + if (scriptableObject == null) + { + EditorGUI.PropertyField(rect, property, label, false); + } + else + { + // Draw a foldout + Rect foldoutRect = new Rect() + { + x = rect.x, + y = rect.y, + width = EditorGUIUtility.labelWidth, + height = EditorGUIUtility.singleLineHeight + }; + + property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, label, toggleOnLabelClick: true); + + // Draw the scriptable object field + Rect propertyRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.PropertyField(propertyRect, property, label, false); + + property.serializedObject.ApplyModifiedProperties(); + + // Draw the child properties + if (property.isExpanded) + { + DrawChildProperties(rect, property); + } + } + } + else + { + string message = $"{typeof(ExpandableAttribute).Name} can only be used on scriptable objects"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + } + + EditorGUI.EndProperty(); + } + + private void DrawChildProperties(Rect rect, SerializedProperty property) + { + ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; + if (scriptableObject == null) + { + return; + } + + Rect boxRect = new Rect() + { + x = 0.0f, + y = rect.y + EditorGUIUtility.singleLineHeight, + width = rect.width * 2.0f, + height = rect.height - EditorGUIUtility.singleLineHeight + }; + + GUI.Box(boxRect, GUIContent.none); + + using (new EditorGUI.IndentLevelScope()) + { + SerializedObject serializedObject = new SerializedObject(scriptableObject); + + using (var iterator = serializedObject.GetIterator()) + { + float yOffset = EditorGUIUtility.singleLineHeight; + + if (iterator.NextVisible(true)) + { + do + { + SerializedProperty childProperty = serializedObject.FindProperty(iterator.name); + if (childProperty.name.Equals("m_Script", System.StringComparison.Ordinal)) + { + continue; + } + + bool visible = PropertyUtility.IsVisible(childProperty); + if (!visible) + { + continue; + } + + float childHeight = GetPropertyHeight(childProperty); + Rect childRect = new Rect() + { + x = rect.x, + y = rect.y + yOffset, + width = rect.width, + height = childHeight + }; + + //TODO since the depth can go deeper we cant just use one field. - need better caching and mapping here! + //_naughtyProperty ??= PropertyUtility.CreateNaughtyProperty(childProperty); + NaughtyEditorGUI.PropertyField(childRect, PropertyUtility.CreateNaughtyProperty(childProperty), true); + + yOffset += childHeight; + } + while (iterator.NextVisible(false)); + } + } + + serializedObject.ApplyModifiedProperties(); + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta new file mode 100644 index 0000000..d5925fe --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ExpandablePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1ddb7194615bdc4e8b2088c8d165d8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs new file mode 100644 index 0000000..e42e97c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(InputAxisAttribute))] + public class InputAxisPropertyDrawer : PropertyDrawerBase + { + private static readonly string AssetPath = Path.Combine("ProjectSettings", "InputManager.asset"); + private const string AxesPropertyPath = "m_Axes"; + private const string NamePropertyPath = "m_Name"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.String) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.String) + { + var inputManagerAsset = AssetDatabase.LoadAssetAtPath(AssetPath, typeof(object)); + var inputManager = new SerializedObject(inputManagerAsset); + + var axesProperty = inputManager.FindProperty(AxesPropertyPath); + var axesSet = new HashSet(); + axesSet.Add("(None)"); + + for (var i = 0; i < axesProperty.arraySize; i++) + { + var axis = axesProperty.GetArrayElementAtIndex(i).FindPropertyRelative(NamePropertyPath).stringValue; + axesSet.Add(axis); + } + + var axes = axesSet.ToArray(); + + string propertyString = property.stringValue; + int index = 0; + // check if there is an entry that matches the entry and get the index + // we skip index 0 as that is a special custom case + for (int i = 1; i < axes.Length; i++) + { + if (axes[i].Equals(propertyString, System.StringComparison.Ordinal)) + { + index = i; + break; + } + } + + // Draw the popup box with the current selected index + int newIndex = EditorGUI.Popup(rect, label.text, index, axes); + + // Adjust the actual string value of the property based on the selection + string newValue = newIndex > 0 ? axes[newIndex] : string.Empty; + + if (!property.stringValue.Equals(newValue, System.StringComparison.Ordinal)) + { + property.stringValue = newValue; + } + } + else + { + string message = string.Format("{0} supports only string fields", typeof(InputAxisAttribute).Name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta new file mode 100644 index 0000000..08f8f46 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/InputAxisPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0de9d3dfe2d466a458be838edf361645 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs new file mode 100644 index 0000000..8637717 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs @@ -0,0 +1,88 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(LayerAttribute))] + public class LayerPropertyDrawer : PropertyDrawerBase + { + private const string TypeWarningMessage = "{0} must be an int or a string"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + bool validPropertyType = property.propertyType == SerializedPropertyType.String || property.propertyType == SerializedPropertyType.Integer; + + return validPropertyType + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + switch (property.propertyType) + { + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, GetLayers()); + break; + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, GetLayers()); + break; + default: + string message = string.Format(TypeWarningMessage, property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + break; + } + + EditorGUI.EndProperty(); + } + + private string[] GetLayers() + { + return UnityEditorInternal.InternalEditorUtility.layers; + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, string[] layers) + { + int index = IndexOf(layers, property.stringValue); + int newIndex = EditorGUI.Popup(rect, label.text, index, layers); + string newLayer = layers[newIndex]; + + if (!property.stringValue.Equals(newLayer, StringComparison.Ordinal)) + { + property.stringValue = layers[newIndex]; + } + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, string[] layers) + { + int index = 0; + string layerName = LayerMask.LayerToName(property.intValue); + for (int i = 0; i < layers.Length; i++) + { + if (layerName.Equals(layers[i], StringComparison.Ordinal)) + { + index = i; + break; + } + } + + int newIndex = EditorGUI.Popup(rect, label.text, index, layers); + string newLayerName = layers[newIndex]; + int newLayerNumber = LayerMask.NameToLayer(newLayerName); + + if (property.intValue != newLayerNumber) + { + property.intValue = newLayerNumber; + } + } + + private static int IndexOf(string[] layers, string layer) + { + var index = Array.IndexOf(layers, layer); + return Mathf.Clamp(index, 0, layers.Length - 1); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta new file mode 100644 index 0000000..4b2ac86 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/LayerPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7278ba0893ab7d940b5f944e5b1cf1a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs new file mode 100644 index 0000000..91d6a3e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs @@ -0,0 +1,108 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(MinMaxSliderAttribute))] + public class MinMaxSliderPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.Vector2 || property.propertyType == SerializedPropertyType.Vector2Int) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + MinMaxSliderAttribute minMaxSliderAttribute = (MinMaxSliderAttribute)attribute; + + if (property.propertyType == SerializedPropertyType.Vector2 || property.propertyType == SerializedPropertyType.Vector2Int) + { + EditorGUI.BeginProperty(rect, label, property); + + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + float labelWidth = EditorGUIUtility.labelWidth + NaughtyEditorGUI.HorizontalSpacing; + float floatFieldWidth = EditorGUIUtility.fieldWidth; + float sliderWidth = rect.width - labelWidth - 2.0f * floatFieldWidth; + float sliderPadding = 5.0f; + + Rect labelRect = new Rect( + rect.x, + rect.y, + labelWidth, + rect.height); + + Rect sliderRect = new Rect( + rect.x + labelWidth + floatFieldWidth + sliderPadding - indentLength, + rect.y, + sliderWidth - 2.0f * sliderPadding + indentLength, + rect.height); + + Rect minFloatFieldRect = new Rect( + rect.x + labelWidth - indentLength, + rect.y, + floatFieldWidth + indentLength, + rect.height); + + Rect maxFloatFieldRect = new Rect( + rect.x + labelWidth + floatFieldWidth + sliderWidth - indentLength, + rect.y, + floatFieldWidth + indentLength, + rect.height); + + // Draw the label + EditorGUI.LabelField(labelRect, label.text); + + // Draw the slider + EditorGUI.BeginChangeCheck(); + + if (property.propertyType == SerializedPropertyType.Vector2) + { + Vector2 sliderValue = property.vector2Value; + EditorGUI.MinMaxSlider(sliderRect, ref sliderValue.x, ref sliderValue.y, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); + + sliderValue.x = EditorGUI.FloatField(minFloatFieldRect, sliderValue.x); + sliderValue.x = Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); + + sliderValue.y = EditorGUI.FloatField(maxFloatFieldRect, sliderValue.y); + sliderValue.y = Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); + + if (EditorGUI.EndChangeCheck()) + { + property.vector2Value = sliderValue; + } + } + else if (property.propertyType == SerializedPropertyType.Vector2Int) + { + Vector2Int sliderValue = property.vector2IntValue; + float xValue = sliderValue.x; + float yValue = sliderValue.y; + EditorGUI.MinMaxSlider(sliderRect, ref xValue, ref yValue, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); + + sliderValue.x = EditorGUI.IntField(minFloatFieldRect, (int)xValue); + sliderValue.x = (int)Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); + + sliderValue.y = EditorGUI.IntField(maxFloatFieldRect, (int)yValue); + sliderValue.y = (int)Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); + + if (EditorGUI.EndChangeCheck()) + { + property.vector2IntValue = sliderValue; + } + } + + EditorGUI.EndProperty(); + } + else + { + string message = minMaxSliderAttribute.GetType().Name + " can be used only on Vector2 or Vector2Int fields"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta new file mode 100644 index 0000000..4613ffe --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/MinMaxSliderPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27011af81554b5b4489b155f09275475 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs new file mode 100644 index 0000000..86ab686 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs @@ -0,0 +1,162 @@ +using UnityEngine; +using UnityEditor; +using System.Reflection; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ProgressBarAttribute))] + public class ProgressBarPropertyDrawer : PropertyDrawerBase + { + private ProgressBarAttribute _cachedProgressBarAttribute; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (_cachedProgressBarAttribute == null) + _cachedProgressBarAttribute = PropertyUtility.GetAttribute(property); + + ProgressBarAttribute progressBarAttribute = _cachedProgressBarAttribute; + var maxValue = GetMaxValue(property, progressBarAttribute); + + return IsNumber(property) && IsNumber(maxValue) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (!IsNumber(property)) + { + string message = string.Format("Field {0} is not a number", property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + return; + } + + if (_cachedProgressBarAttribute == null) + _cachedProgressBarAttribute = PropertyUtility.GetAttribute(property); + + ProgressBarAttribute progressBarAttribute = _cachedProgressBarAttribute; + var value = property.propertyType == SerializedPropertyType.Integer ? property.intValue : property.floatValue; + var valueFormatted = property.propertyType == SerializedPropertyType.Integer ? value.ToString() : string.Format("{0:0.00}", value); + var maxValue = GetMaxValue(property, progressBarAttribute); + + if (maxValue != null && IsNumber(maxValue)) + { + var fillPercentage = value / CastToFloat(maxValue); + var barLabel = (!string.IsNullOrEmpty(progressBarAttribute.Name) ? "[" + progressBarAttribute.Name + "] " : "") + valueFormatted + "/" + maxValue; + var barColor = progressBarAttribute.Color.GetColor(); + var labelColor = Color.white; + + var indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect barRect = new Rect() + { + x = rect.x + indentLength, + y = rect.y, + width = rect.width - indentLength, + height = EditorGUIUtility.singleLineHeight + }; + + DrawBar(barRect, Mathf.Clamp01(fillPercentage), barLabel, barColor, labelColor); + } + else + { + string message = string.Format( + "The provided dynamic max value for the progress bar is not correct. Please check if the '{0}' is correct, or the return type is float/int", + nameof(progressBarAttribute.MaxValueName)); + + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private object GetMaxValue(SerializedProperty property, ProgressBarAttribute progressBarAttribute) + { + if (string.IsNullOrEmpty(progressBarAttribute.MaxValueName)) + { + return progressBarAttribute.MaxValue; + } + else + { + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + FieldInfo valuesFieldInfo = ReflectionUtility.GetField(target, progressBarAttribute.MaxValueName); + if (valuesFieldInfo != null) + { + return valuesFieldInfo.GetValue(target); + } + + PropertyInfo valuesPropertyInfo = ReflectionUtility.GetProperty(target, progressBarAttribute.MaxValueName); + if (valuesPropertyInfo != null) + { + return valuesPropertyInfo.GetValue(target); + } + + MethodInfo methodValuesInfo = ReflectionUtility.GetMethod(target, progressBarAttribute.MaxValueName); + if (methodValuesInfo != null && + (methodValuesInfo.ReturnType == typeof(float) || methodValuesInfo.ReturnType == typeof(int)) && + methodValuesInfo.GetParameters().Length == 0) + { + return methodValuesInfo.Invoke(target, null); + } + + return null; + } + } + + private void DrawBar(Rect rect, float fillPercent, string label, Color barColor, Color labelColor) + { + if (Event.current.type != EventType.Repaint) + { + return; + } + + var fillRect = new Rect(rect.x, rect.y, rect.width * fillPercent, rect.height); + + EditorGUI.DrawRect(rect, new Color(0.13f, 0.13f, 0.13f)); + EditorGUI.DrawRect(fillRect, barColor); + + // set alignment and cache the default + var align = GUI.skin.label.alignment; + GUI.skin.label.alignment = TextAnchor.UpperCenter; + + // set the color and cache the default + var c = GUI.contentColor; + GUI.contentColor = labelColor; + + // calculate the position + var labelRect = new Rect(rect.x, rect.y - 2, rect.width, rect.height); + + // draw~ + EditorGUI.DropShadowLabel(labelRect, label); + + // reset color and alignment + GUI.contentColor = c; + GUI.skin.label.alignment = align; + } + + private bool IsNumber(SerializedProperty property) + { + bool isNumber = property.propertyType == SerializedPropertyType.Float || property.propertyType == SerializedPropertyType.Integer; + return isNumber; + } + + private bool IsNumber(object obj) + { + return (obj is float) || (obj is int); + } + + private float CastToFloat(object obj) + { + if (obj is int) + { + return (int)obj; + } + else + { + return (float)obj; + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta new file mode 100644 index 0000000..dfb90f1 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ProgressBarPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bcbc424b10864b4eb6e3bcfb276cdf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs new file mode 100644 index 0000000..4e6ac71 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs @@ -0,0 +1,99 @@ +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyDrawerBase : PropertyDrawer + { + private SpecialCaseDrawerAttribute _cachedSpecialCaseDrawerAttribute; + + public sealed override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) + { + // Check if visible + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return; + } + + // Validate + ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes(property); + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(property); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(property); + + using (new EditorGUI.DisabledScope(disabled: !enabled)) + { + OnGUI_Internal(rect, property, PropertyUtility.GetLabel(property)); + } + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + PropertyUtility.CallOnValueChangedCallbacks(property); + } + } + + protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label); + + sealed override public float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + bool visible = PropertyUtility.IsVisible(property); + if (!visible) + { + return 0.0f; + } + + return GetPropertyHeight_Internal(property, label); + } + + protected virtual float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return EditorGUI.GetPropertyHeight(property, includeChildren: true); + } + + protected float GetPropertyHeight(SerializedProperty property) + { + if (_cachedSpecialCaseDrawerAttribute == null) + _cachedSpecialCaseDrawerAttribute = PropertyUtility.GetAttribute(property); + + SpecialCaseDrawerAttribute specialCaseAttribute = _cachedSpecialCaseDrawerAttribute; + if (specialCaseAttribute != null) + { + return specialCaseAttribute.GetDrawer().GetPropertyHeight(property); + } + + return EditorGUI.GetPropertyHeight(property, includeChildren: true); + } + + public virtual float GetHelpBoxHeight() + { + return EditorGUIUtility.singleLineHeight * 2.0f; + } + + public void DrawDefaultPropertyAndHelpBox(Rect rect, SerializedProperty property, string message, MessageType messageType) + { + float indentLength = NaughtyEditorGUI.GetIndentLength(rect); + Rect helpBoxRect = new Rect( + rect.x + indentLength, + rect.y, + rect.width - indentLength, + GetHelpBoxHeight()); + + NaughtyEditorGUI.HelpBox(helpBoxRect, message, MessageType.Warning, context: property.serializedObject.targetObject); + + Rect propertyRect = new Rect( + rect.x, + rect.y + GetHelpBoxHeight(), + rect.width, + GetPropertyHeight(property)); + + EditorGUI.PropertyField(propertyRect, property, true); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta new file mode 100644 index 0000000..71a80b6 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/PropertyDrawerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 574f5fa6033f26342816a8a5f39749e5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs new file mode 100644 index 0000000..57c3def --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs @@ -0,0 +1,80 @@ +using UnityEngine; +using UnityEditor; +using System.Text.RegularExpressions; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ResizableTextAreaAttribute))] + public class ResizableTextAreaPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (property.propertyType == SerializedPropertyType.String) + { + float labelHeight = EditorGUIUtility.singleLineHeight; + float textAreaHeight = GetTextAreaHeight(property.stringValue); + return labelHeight + textAreaHeight; + } + else + { + return GetPropertyHeight(property) + GetHelpBoxHeight(); + } + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.String) + { + Rect labelRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.LabelField(labelRect, label.text); + + EditorGUI.BeginChangeCheck(); + + Rect textAreaRect = new Rect() + { + x = labelRect.x, + y = labelRect.y + EditorGUIUtility.singleLineHeight, + width = labelRect.width, + height = GetTextAreaHeight(property.stringValue) + }; + + string textAreaValue = EditorGUI.TextArea(textAreaRect, property.stringValue); + + if (EditorGUI.EndChangeCheck()) + { + property.stringValue = textAreaValue; + } + } + else + { + string message = typeof(ResizableTextAreaAttribute).Name + " can only be used on string fields"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private int GetNumberOfLines(string text) + { + string content = Regex.Replace(text, @"\r\n|\n\r|\r|\n", Environment.NewLine); + string[] lines = content.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + return lines.Length; + } + + private float GetTextAreaHeight(string text) + { + float height = (EditorGUIUtility.singleLineHeight - 3.0f) * GetNumberOfLines(text) + 3.0f; + return height; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta new file mode 100644 index 0000000..4b1e4a5 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ResizableTextAreaPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e27ffd9a96b58c46bb74cc93de3e06f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs new file mode 100644 index 0000000..d87c508 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs @@ -0,0 +1,99 @@ +using UnityEngine; +using UnityEditor; +using System.Linq; +using System.Text.RegularExpressions; +using System; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(SceneAttribute))] + public class ScenePropertyDrawer : PropertyDrawerBase + { + private const string SceneListItem = "{0} ({1})"; + private const string ScenePattern = @".+\/(.+)\.unity"; + private const string TypeWarningMessage = "{0} must be an int or a string"; + private const string BuildSettingsWarningMessage = "No scenes in the build settings"; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + bool validPropertyType = property.propertyType == SerializedPropertyType.String || property.propertyType == SerializedPropertyType.Integer; + bool anySceneInBuildSettings = GetScenes().Length > 0; + + return (validPropertyType && anySceneInBuildSettings) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + string[] scenes = GetScenes(); + bool anySceneInBuildSettings = scenes.Length > 0; + if (!anySceneInBuildSettings) + { + DrawDefaultPropertyAndHelpBox(rect, property, BuildSettingsWarningMessage, MessageType.Warning); + return; + } + + string[] sceneOptions = GetSceneOptions(scenes); + switch (property.propertyType) + { + case SerializedPropertyType.String: + DrawPropertyForString(rect, property, label, scenes, sceneOptions); + break; + case SerializedPropertyType.Integer: + DrawPropertyForInt(rect, property, label, sceneOptions); + break; + default: + string message = string.Format(TypeWarningMessage, property.name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + break; + } + + EditorGUI.EndProperty(); + } + + private string[] GetScenes() + { + return EditorBuildSettings.scenes + .Where(scene => scene.enabled) + .Select(scene => Regex.Match(scene.path, ScenePattern).Groups[1].Value) + .ToArray(); + } + + private string[] GetSceneOptions(string[] scenes) + { + return scenes.Select((s, i) => string.Format(SceneListItem, s, i)).ToArray(); + } + + private static void DrawPropertyForString(Rect rect, SerializedProperty property, GUIContent label, string[] scenes, string[] sceneOptions) + { + int index = IndexOf(scenes, property.stringValue); + int newIndex = EditorGUI.Popup(rect, label.text, index, sceneOptions); + string newScene = scenes[newIndex]; + + if (!property.stringValue.Equals(newScene, StringComparison.Ordinal)) + { + property.stringValue = scenes[newIndex]; + } + } + + private static void DrawPropertyForInt(Rect rect, SerializedProperty property, GUIContent label, string[] sceneOptions) + { + int index = property.intValue; + int newIndex = EditorGUI.Popup(rect, label.text, index, sceneOptions); + + if (property.intValue != newIndex) + { + property.intValue = newIndex; + } + } + + private static int IndexOf(string[] scenes, string scene) + { + var index = Array.IndexOf(scenes, scene); + return Mathf.Clamp(index, 0, scenes.Length - 1); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta new file mode 100644 index 0000000..a416544 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ScenePropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f5ed440d4f429e42a5da7bc5df48fd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs new file mode 100644 index 0000000..98a874d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs @@ -0,0 +1,116 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(ShowAssetPreviewAttribute))] + public class ShowAssetPreviewPropertyDrawer : PropertyDrawerBase + { + private ShowAssetPreviewAttribute _cachedShowAssetPreviewAttribute; + + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture != null) + { + return GetPropertyHeight(property) + GetAssetPreviewSize(property).y; + } + else + { + return GetPropertyHeight(property); + } + } + else + { + return GetPropertyHeight(property) + GetHelpBoxHeight(); + } + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + Rect propertyRect = new Rect() + { + x = rect.x, + y = rect.y, + width = rect.width, + height = EditorGUIUtility.singleLineHeight + }; + + EditorGUI.PropertyField(propertyRect, property, label); + + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture != null) + { + Rect previewRect = new Rect() + { + x = rect.x + NaughtyEditorGUI.GetIndentLength(rect), + y = rect.y + EditorGUIUtility.singleLineHeight, + width = rect.width, + height = GetAssetPreviewSize(property).y + }; + + GUI.Label(previewRect, previewTexture); + } + } + else + { + string message = property.name + " doesn't have an asset preview"; + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + + private Texture2D GetAssetPreview(SerializedProperty property) + { + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue != null) + { + Texture2D previewTexture = AssetPreview.GetAssetPreview(property.objectReferenceValue); + return previewTexture; + } + + return null; + } + + return null; + } + + private Vector2 GetAssetPreviewSize(SerializedProperty property) + { + Texture2D previewTexture = GetAssetPreview(property); + if (previewTexture == null) + { + return Vector2.zero; + } + else + { + int targetWidth = ShowAssetPreviewAttribute.DefaultWidth; + int targetHeight = ShowAssetPreviewAttribute.DefaultHeight; + + if (_cachedShowAssetPreviewAttribute == null) + _cachedShowAssetPreviewAttribute = + PropertyUtility.GetAttribute(property); + + ShowAssetPreviewAttribute showAssetPreviewAttribute = _cachedShowAssetPreviewAttribute; + if (showAssetPreviewAttribute != null) + { + targetWidth = showAssetPreviewAttribute.Width; + targetHeight = showAssetPreviewAttribute.Height; + } + + int width = Mathf.Clamp(targetWidth, 0, previewTexture.width); + int height = Mathf.Clamp(targetHeight, 0, previewTexture.height); + + return new Vector2(width, height); + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta new file mode 100644 index 0000000..5a4d16d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/ShowAssetPreviewPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24dee3fc91cfe94438de1e3c158f187f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs new file mode 100644 index 0000000..b91efb2 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + [CustomPropertyDrawer(typeof(TagAttribute))] + public class TagPropertyDrawer : PropertyDrawerBase + { + protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) + { + return (property.propertyType == SerializedPropertyType.String) + ? GetPropertyHeight(property) + : GetPropertyHeight(property) + GetHelpBoxHeight(); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(rect, label, property); + + if (property.propertyType == SerializedPropertyType.String) + { + // generate the taglist + custom tags + List tagList = new List(); + tagList.Add("(None)"); + tagList.Add("Untagged"); + tagList.AddRange(UnityEditorInternal.InternalEditorUtility.tags); + + string propertyString = property.stringValue; + int index = 0; + // check if there is an entry that matches the entry and get the index + // we skip index 0 as that is a special custom case + for (int i = 1; i < tagList.Count; i++) + { + if (tagList[i].Equals(propertyString, System.StringComparison.Ordinal)) + { + index = i; + break; + } + } + + // Draw the popup box with the current selected index + int newIndex = EditorGUI.Popup(rect, label.text, index, tagList.ToArray()); + + // Adjust the actual string value of the property based on the selection + string newValue = newIndex > 0 ? tagList[newIndex] : string.Empty; + + if (!property.stringValue.Equals(newValue, System.StringComparison.Ordinal)) + { + property.stringValue = newValue; + } + } + else + { + string message = string.Format("{0} supports only string fields", typeof(TagAttribute).Name); + DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); + } + + EditorGUI.EndProperty(); + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta new file mode 100644 index 0000000..75f76c5 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers/TagPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3df4c068c970ab6498df7a60efbde311 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase.meta new file mode 100644 index 0000000..88cd458 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 750a102004a7e4f46a2046a3d74cae19 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs new file mode 100644 index 0000000..2411f50 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs @@ -0,0 +1,205 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public class ReorderableListPropertyDrawer : SpecialCasePropertyDrawerBase + { + public static readonly ReorderableListPropertyDrawer Instance = new ReorderableListPropertyDrawer(); + + private readonly Dictionary _reorderableListsByPropertyName = new Dictionary(); + + private GUIStyle _labelStyle; + + private GUIStyle GetLabelStyle() + { + if (_labelStyle == null) + { + _labelStyle = new GUIStyle(EditorStyles.boldLabel); + _labelStyle.richText = true; + } + + return _labelStyle; + } + + private string GetPropertyKeyName(SerializedProperty property) + { + return property.serializedObject.targetObject.GetInstanceID() + "." + property.name; + } + + protected override float GetPropertyHeight_Internal(SerializedProperty property) + { + if (property.isArray) + { + string key = GetPropertyKeyName(property); + + if (_reorderableListsByPropertyName.TryGetValue(key, out ReorderableList reorderableList) == false) + { + return 0; + } + + return reorderableList.GetHeight(); + } + + return EditorGUI.GetPropertyHeight(property, true); + } + + protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) + { + if (property.isArray) + { + string key = GetPropertyKeyName(property); + + ReorderableList reorderableList = null; + if (!_reorderableListsByPropertyName.ContainsKey(key)) + { + reorderableList = new ReorderableList(property.serializedObject, property, true, true, true, true) + { + drawHeaderCallback = (Rect r) => + { + EditorGUI.LabelField(r, string.Format("{0}: {1}", label.text, property.arraySize), GetLabelStyle()); + HandleDragAndDrop(r, reorderableList); + }, + + drawElementCallback = (Rect r, int index, bool isActive, bool isFocused) => + { + SerializedProperty element = property.GetArrayElementAtIndex(index); + r.y += 1.0f; + r.x += 10.0f; + r.width -= 10.0f; + + EditorGUI.PropertyField(new Rect(r.x, r.y, r.width, EditorGUIUtility.singleLineHeight), element, true); + }, + + elementHeightCallback = (int index) => + { + return EditorGUI.GetPropertyHeight(property.GetArrayElementAtIndex(index)) + 4.0f; + } + }; + + _reorderableListsByPropertyName[key] = reorderableList; + } + + reorderableList = _reorderableListsByPropertyName[key]; + + if (rect == default) + { + reorderableList.DoLayoutList(); + } + else + { + reorderableList.DoList(rect); + } + } + else + { + string message = typeof(ReorderableListAttribute).Name + " can be used only on arrays or lists"; + NaughtyEditorGUI.HelpBox_Layout(message, MessageType.Warning, context: property.serializedObject.targetObject); + EditorGUILayout.PropertyField(property, true); + } + } + + public void ClearCache() + { + _reorderableListsByPropertyName.Clear(); + } + + private Object GetAssignableObject(Object obj, ReorderableList list) + { + System.Type listType = PropertyUtility.GetPropertyType(list.serializedProperty); + System.Type elementType = ReflectionUtility.GetListElementType(listType); + + if (elementType == null) + { + return null; + } + + System.Type objType = obj.GetType(); + + if (elementType.IsAssignableFrom(objType)) + { + return obj; + } + + if (objType == typeof(GameObject)) + { + if (typeof(Transform).IsAssignableFrom(elementType)) + { + Transform transform = ((GameObject)obj).transform; + if (elementType == typeof(RectTransform)) + { + RectTransform rectTransform = transform as RectTransform; + return rectTransform; + } + else + { + return transform; + } + } + else if (typeof(MonoBehaviour).IsAssignableFrom(elementType)) + { + return ((GameObject)obj).GetComponent(elementType); + } + } + + return null; + } + + private void HandleDragAndDrop(Rect rect, ReorderableList list) + { + var currentEvent = Event.current; + var usedEvent = false; + + switch (currentEvent.type) + { + case EventType.DragExited: + if (GUI.enabled) + { + HandleUtility.Repaint(); + } + + break; + + case EventType.DragUpdated: + case EventType.DragPerform: + if (rect.Contains(currentEvent.mousePosition) && GUI.enabled) + { + // Check each single object, so we can add multiple objects in a single drag. + bool didAcceptDrag = false; + Object[] references = DragAndDrop.objectReferences; + foreach (Object obj in references) + { + Object assignableObject = GetAssignableObject(obj, list); + if (assignableObject != null) + { + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if (currentEvent.type == EventType.DragPerform) + { + list.serializedProperty.arraySize++; + int arrayEnd = list.serializedProperty.arraySize - 1; + list.serializedProperty.GetArrayElementAtIndex(arrayEnd).objectReferenceValue = assignableObject; + didAcceptDrag = true; + } + } + } + + if (didAcceptDrag) + { + GUI.changed = true; + DragAndDrop.AcceptDrag(); + usedEvent = true; + } + } + + break; + } + + if (usedEvent) + { + currentEvent.Use(); + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta new file mode 100644 index 0000000..4ff1a66 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/ReorderableListPropertyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bf36691a6d456564db2fcbfa8726b3f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs new file mode 100644 index 0000000..a26bb1e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public abstract class SpecialCasePropertyDrawerBase + { + public bool OnGUI(Rect rect, NaughtyProperty naughtyProperty) + { + bool changeDetected = false; + + // Check if visible + bool visible = PropertyUtility.IsVisible(naughtyProperty.showIfAttribute, naughtyProperty.serializedProperty); + if (!visible) + { + return false; + } + + // Validate + ValidatorAttribute[] validatorAttributes = naughtyProperty.validatorAttributes; + foreach (var validatorAttribute in validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(naughtyProperty.serializedProperty); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = PropertyUtility.IsEnabled(naughtyProperty.readOnlyAttribute, naughtyProperty.enableIfAttribute, naughtyProperty.serializedProperty); + + using (new EditorGUI.DisabledScope(disabled: !enabled)) + { + OnGUI_Internal(rect, naughtyProperty.serializedProperty, PropertyUtility.GetLabel(naughtyProperty.labelAttribute, naughtyProperty.serializedProperty)); + } + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + changeDetected = true; + PropertyUtility.CallOnValueChangedCallbacks(naughtyProperty.serializedProperty); + } + + return changeDetected; + } + + public float GetPropertyHeight(SerializedProperty property) + { + return GetPropertyHeight_Internal(property); + } + + protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label); + protected abstract float GetPropertyHeight_Internal(SerializedProperty property); + } + + public static class SpecialCaseDrawerAttributeExtensions + { + private static Dictionary _drawersByAttributeType; + + static SpecialCaseDrawerAttributeExtensions() + { + _drawersByAttributeType = new Dictionary(); + _drawersByAttributeType[typeof(ReorderableListAttribute)] = ReorderableListPropertyDrawer.Instance; + } + + public static SpecialCasePropertyDrawerBase GetDrawer(this SpecialCaseDrawerAttribute attr) + { + SpecialCasePropertyDrawerBase drawer; + if (_drawersByAttributeType.TryGetValue(attr.GetType(), out drawer)) + { + return drawer; + } + else + { + return null; + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta new file mode 100644 index 0000000..c60287c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyDrawers_SpecialCase/SpecialCasePropertyDrawerBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 771776453ad34b045a41dea54856fa12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators.meta new file mode 100644 index 0000000..949d96d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 41caedece93df91439d624dc9d124424 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs new file mode 100644 index 0000000..ab1ad4d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs @@ -0,0 +1,58 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class MaxValuePropertyValidator : PropertyValidatorBase + { + private MaxValueAttribute _cachedMaxValueAttribute; + + public override void ValidateProperty(SerializedProperty property) + { + if (_cachedMaxValueAttribute == null) + _cachedMaxValueAttribute = PropertyUtility.GetAttribute(property); + + MaxValueAttribute maxValueAttribute = _cachedMaxValueAttribute; + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue > maxValueAttribute.MaxValue) + { + property.intValue = (int)maxValueAttribute.MaxValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue > maxValueAttribute.MaxValue) + { + property.floatValue = maxValueAttribute.MaxValue; + } + } + else if (property.propertyType == SerializedPropertyType.Vector2) + { + property.vector2Value = Vector2.Min(property.vector2Value, new Vector2(maxValueAttribute.MaxValue, maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3) + { + property.vector3Value = Vector3.Min(property.vector3Value, new Vector3(maxValueAttribute.MaxValue, maxValueAttribute.MaxValue, maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector4) + { + property.vector4Value = Vector4.Min(property.vector4Value, new Vector4(maxValueAttribute.MaxValue, maxValueAttribute.MaxValue, maxValueAttribute.MaxValue, maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector2Int) + { + property.vector2IntValue = Vector2Int.Min(property.vector2IntValue, new Vector2Int((int)maxValueAttribute.MaxValue, (int)maxValueAttribute.MaxValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3Int) + { + property.vector3IntValue = Vector3Int.Min(property.vector3IntValue, new Vector3Int((int)maxValueAttribute.MaxValue, (int)maxValueAttribute.MaxValue, (int)maxValueAttribute.MaxValue)); + } + else + { + string warning = maxValueAttribute.GetType().Name + " can be used only on int, float, Vector or VectorInt fields"; + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta new file mode 100644 index 0000000..3e809ac --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MaxValuePropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 627b8e9e7bda6fa408c6f47fb8285665 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs new file mode 100644 index 0000000..365c1c1 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs @@ -0,0 +1,58 @@ +using UnityEngine; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class MinValuePropertyValidator : PropertyValidatorBase + { + private MinValueAttribute _cachedMinValueAttribute; + + public override void ValidateProperty(SerializedProperty property) + { + if (_cachedMinValueAttribute == null) + _cachedMinValueAttribute = PropertyUtility.GetAttribute(property); + + MinValueAttribute minValueAttribute = _cachedMinValueAttribute; + + if (property.propertyType == SerializedPropertyType.Integer) + { + if (property.intValue < minValueAttribute.MinValue) + { + property.intValue = (int)minValueAttribute.MinValue; + } + } + else if (property.propertyType == SerializedPropertyType.Float) + { + if (property.floatValue < minValueAttribute.MinValue) + { + property.floatValue = minValueAttribute.MinValue; + } + } + else if (property.propertyType == SerializedPropertyType.Vector2) + { + property.vector2Value = Vector2.Max(property.vector2Value, new Vector2(minValueAttribute.MinValue, minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3) + { + property.vector3Value = Vector3.Max(property.vector3Value, new Vector3(minValueAttribute.MinValue, minValueAttribute.MinValue, minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector4) + { + property.vector4Value = Vector4.Max(property.vector4Value, new Vector4(minValueAttribute.MinValue, minValueAttribute.MinValue, minValueAttribute.MinValue, minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector2Int) + { + property.vector2IntValue = Vector2Int.Max(property.vector2IntValue, new Vector2Int((int)minValueAttribute.MinValue, (int)minValueAttribute.MinValue)); + } + else if (property.propertyType == SerializedPropertyType.Vector3Int) + { + property.vector3IntValue = Vector3Int.Max(property.vector3IntValue, new Vector3Int((int)minValueAttribute.MinValue, (int)minValueAttribute.MinValue, (int)minValueAttribute.MinValue)); + } + else + { + string warning = minValueAttribute.GetType().Name + " can be used only on int, float, Vector or VectorInt fields"; + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta new file mode 100644 index 0000000..b3bb871 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/MinValuePropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03dd23f6c0598074fb1b721dcd8fe023 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs new file mode 100644 index 0000000..fed61af --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public abstract class PropertyValidatorBase + { + public abstract void ValidateProperty(SerializedProperty property); + } + + public static class ValidatorAttributeExtensions + { + private static Dictionary _validatorsByAttributeType; + + static ValidatorAttributeExtensions() + { + _validatorsByAttributeType = new Dictionary(); + _validatorsByAttributeType[typeof(MinValueAttribute)] = new MinValuePropertyValidator(); + _validatorsByAttributeType[typeof(MaxValueAttribute)] = new MaxValuePropertyValidator(); + _validatorsByAttributeType[typeof(RequiredAttribute)] = new RequiredPropertyValidator(); + _validatorsByAttributeType[typeof(ValidateInputAttribute)] = new ValidateInputPropertyValidator(); + } + + public static PropertyValidatorBase GetValidator(this ValidatorAttribute attr) + { + PropertyValidatorBase validator; + if (_validatorsByAttributeType.TryGetValue(attr.GetType(), out validator)) + { + return validator; + } + else + { + return null; + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs.meta new file mode 100644 index 0000000..97fe581 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/PropertyValidatorBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f332c8e1c3627d742aa9158af7b02ccc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs new file mode 100644 index 0000000..2af2b5f --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs @@ -0,0 +1,36 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + public class RequiredPropertyValidator : PropertyValidatorBase + { + private RequiredAttribute _cachedRequiredAttribute; + + public override void ValidateProperty(SerializedProperty property) + { + if (_cachedRequiredAttribute == null) + _cachedRequiredAttribute = PropertyUtility.GetAttribute(property); + + RequiredAttribute requiredAttribute = _cachedRequiredAttribute; + + if (property.propertyType == SerializedPropertyType.ObjectReference) + { + if (property.objectReferenceValue == null) + { + string errorMessage = property.name + " is required"; + if (!string.IsNullOrEmpty(requiredAttribute.Message)) + { + errorMessage = requiredAttribute.Message; + } + + NaughtyEditorGUI.HelpBox_Layout(errorMessage, MessageType.Error, context: property.serializedObject.targetObject); + } + } + else + { + string warning = requiredAttribute.GetType().Name + " works only on reference types"; + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta new file mode 100644 index 0000000..d24143a --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/RequiredPropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a7e657ea45f6414682b5f41be9541b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs new file mode 100644 index 0000000..fba3e27 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs @@ -0,0 +1,80 @@ +using UnityEditor; +using System.Reflection; +using System; + +namespace NaughtyAttributes.Editor +{ + public class ValidateInputPropertyValidator : PropertyValidatorBase + { + private ValidateInputAttribute _cachedValidateInputAttribute; + + public override void ValidateProperty(SerializedProperty property) + { + if (_cachedValidateInputAttribute == null) + _cachedValidateInputAttribute = PropertyUtility.GetAttribute(property); + + ValidateInputAttribute validateInputAttribute = _cachedValidateInputAttribute; + object target = PropertyUtility.GetTargetObjectWithProperty(property); + + MethodInfo validationCallback = ReflectionUtility.GetMethod(target, validateInputAttribute.CallbackName); + + if (validationCallback != null && + validationCallback.ReturnType == typeof(bool)) + { + ParameterInfo[] callbackParameters = validationCallback.GetParameters(); + + if (callbackParameters.Length == 0) { + if (!(bool)validationCallback.Invoke(target, null)) + { + if (string.IsNullOrEmpty(validateInputAttribute.Message)) + { + NaughtyEditorGUI.HelpBox_Layout( + property.name + " is not valid", MessageType.Error, context: property.serializedObject.targetObject); + } + else + { + NaughtyEditorGUI.HelpBox_Layout( + validateInputAttribute.Message, MessageType.Error, context: property.serializedObject.targetObject); + } + } + } + else if (callbackParameters.Length == 1) + { + FieldInfo fieldInfo = ReflectionUtility.GetField(target, property.name); + Type fieldType = fieldInfo.FieldType; + Type parameterType = callbackParameters[0].ParameterType; + + if (fieldType == parameterType) + { + if (!(bool)validationCallback.Invoke(target, new object[] { fieldInfo.GetValue(target) })) + { + if (string.IsNullOrEmpty(validateInputAttribute.Message)) + { + NaughtyEditorGUI.HelpBox_Layout( + property.name + " is not valid", MessageType.Error, context: property.serializedObject.targetObject); + } + else + { + NaughtyEditorGUI.HelpBox_Layout( + validateInputAttribute.Message, MessageType.Error, context: property.serializedObject.targetObject); + } + } + } + else + { + string warning = "The field type is not the same as the callback's parameter type"; + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + else + { + string warning = + validateInputAttribute.GetType().Name + + " needs a callback with boolean return type and an optional single parameter of the same type as the field"; + + NaughtyEditorGUI.HelpBox_Layout(warning, MessageType.Warning, context: property.serializedObject.targetObject); + } + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta new file mode 100644 index 0000000..3f6e539 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/PropertyValidators/ValidateInputPropertyValidator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f6adf84ed53a7840a456e8b4dce38d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility.meta new file mode 100644 index 0000000..40e857c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: acb4475c71a3fe947a81ced84ab89c6d +folderAsset: yes +timeCreated: 1508062761 +licenseType: Store +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs new file mode 100644 index 0000000..0934a23 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs @@ -0,0 +1,55 @@ +using UnityEngine; +using System.Reflection; +using System.Collections.Generic; + +namespace NaughtyAttributes.Editor +{ + public static class ButtonUtility + { + public static bool IsEnabled(Object target, MethodInfo method) + { + EnableIfAttributeBase enableIfAttribute = method.GetCustomAttribute(); + if (enableIfAttribute == null) + { + return true; + } + + List conditionValues = PropertyUtility.GetConditionValues(target, enableIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = PropertyUtility.GetConditionsFlag(conditionValues, enableIfAttribute.ConditionOperator, enableIfAttribute.Inverted); + return enabled; + } + else + { + string message = enableIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, target); + + return false; + } + } + + public static bool IsVisible(Object target, MethodInfo method) + { + ShowIfAttributeBase showIfAttribute = method.GetCustomAttribute(); + if (showIfAttribute == null) + { + return true; + } + + List conditionValues = PropertyUtility.GetConditionValues(target, showIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = PropertyUtility.GetConditionsFlag(conditionValues, showIfAttribute.ConditionOperator, showIfAttribute.Inverted); + return enabled; + } + else + { + string message = showIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, target); + + return false; + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs.meta new file mode 100644 index 0000000..cf4dace --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ButtonUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a273f81125ec52d4cb5dec2228afda0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs new file mode 100644 index 0000000..4422e2d --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs @@ -0,0 +1,382 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; + +using UnityEditor; +using UnityEditor.Experimental.SceneManagement; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class NaughtyEditorGUI + { + public const float IndentLength = 15.0f; + public const float HorizontalSpacing = 2.0f; + + private static GUIStyle _buttonStyle = new GUIStyle(GUI.skin.button) { richText = true }; + + private delegate void PropertyFieldFunction(Rect rect, NaughtyProperty naughtyProperty, GUIContent label, bool includeChildren); + + public static bool PropertyField(Rect rect, NaughtyProperty naughtyProperty, bool includeChildren) + { + return PropertyField_Implementation(rect, naughtyProperty, includeChildren, DrawPropertyField); + } + + public static bool PropertyField_Layout(NaughtyProperty naughtyProperty, bool includeChildren) + { + Rect dummyRect = new Rect(); + return PropertyField_Implementation(dummyRect, naughtyProperty, includeChildren, DrawPropertyField_Layout); + } + + private static void DrawPropertyField(Rect rect, NaughtyProperty naughtyProperty, GUIContent label, bool includeChildren) + { + EditorGUI.PropertyField(rect, naughtyProperty.serializedProperty, label, includeChildren); + } + + private static void DrawPropertyField_Layout(Rect rect, NaughtyProperty naughtyProperty, GUIContent label, bool includeChildren) + { + EditorGUILayout.PropertyField(naughtyProperty.serializedProperty, label, includeChildren); + } + + private static bool PropertyField_Implementation(Rect rect, NaughtyProperty naughtyProperty, bool includeChildren, PropertyFieldFunction propertyFieldFunction) + { + bool changeDetected = false; + + if (naughtyProperty.specialCaseDrawerAttribute != null) + { + return naughtyProperty.specialCaseDrawerAttribute.GetDrawer().OnGUI(rect, naughtyProperty); + } + else + { + // Check if visible + if (!naughtyProperty.cachedIsVisible) + { + return false; + } + + // Validate + foreach (var validatorAttribute in naughtyProperty.validatorAttributes) + { + validatorAttribute.GetValidator().ValidateProperty(naughtyProperty.serializedProperty); + } + + // Check if enabled and draw + EditorGUI.BeginChangeCheck(); + bool enabled = naughtyProperty.cachedIsEnabled; + + using (new EditorGUI.DisabledScope(disabled: !enabled)) + { + propertyFieldFunction.Invoke(rect, naughtyProperty, PropertyUtility.GetLabel(naughtyProperty.labelAttribute, naughtyProperty.serializedProperty), includeChildren); + } + + // Call OnValueChanged callbacks + if (EditorGUI.EndChangeCheck()) + { + changeDetected = true; + PropertyUtility.CallOnValueChangedCallbacks(naughtyProperty.serializedProperty); + } + } + + return changeDetected; + } + + public static float GetIndentLength(Rect sourceRect) + { + Rect indentRect = EditorGUI.IndentedRect(sourceRect); + float indentLength = indentRect.x - sourceRect.x; + + return indentLength; + } + + public static void BeginBoxGroup_Layout(string label = "") + { + EditorGUILayout.BeginVertical(GUI.skin.box); + if (!string.IsNullOrEmpty(label)) + { + EditorGUILayout.LabelField(label, EditorStyles.boldLabel); + } + } + + public static void EndBoxGroup_Layout() + { + EditorGUILayout.EndVertical(); + } + + /// + /// Creates a dropdown + /// + /// The rect the defines the position and size of the dropdown in the inspector + /// The serialized object that is being updated + /// The target object that contains the dropdown + /// The field of the target object that holds the currently selected dropdown value + /// The label of the dropdown + /// The index of the value from the values array + /// The values of the dropdown + /// The display options for the values + public static void Dropdown( + Rect rect, SerializedObject serializedObject, object target, FieldInfo dropdownField, + string label, int selectedValueIndex, object[] values, string[] displayOptions) + { + EditorGUI.BeginChangeCheck(); + + int newIndex = EditorGUI.Popup(rect, label, selectedValueIndex, displayOptions); + object newValue = values[newIndex]; + + if (!dropdownField.GetValue(target).Equals(newValue)) + { + Undo.RecordObject(serializedObject.targetObject, "Dropdown"); + + // TODO: Problem with structs, because they are value type. + // The solution is to make boxing/unboxing but unfortunately I don't know the compile time type of the target object + dropdownField.SetValue(target, newValue); + } + } + + public static void Button(UnityEngine.Object target, MethodInfo methodInfo) + { + bool visible = ButtonUtility.IsVisible(target, methodInfo); + if (!visible) + { + return; + } + + if (methodInfo.GetParameters().All(p => p.IsOptional)) + { + ButtonAttribute buttonAttribute = (ButtonAttribute)methodInfo.GetCustomAttributes(typeof(ButtonAttribute), true)[0]; + string buttonText = string.IsNullOrEmpty(buttonAttribute.Text) ? ObjectNames.NicifyVariableName(methodInfo.Name) : buttonAttribute.Text; + + bool buttonEnabled = ButtonUtility.IsEnabled(target, methodInfo); + + EButtonEnableMode mode = buttonAttribute.SelectedEnableMode; + buttonEnabled &= + mode == EButtonEnableMode.Always || + mode == EButtonEnableMode.Editor && !Application.isPlaying || + mode == EButtonEnableMode.Playmode && Application.isPlaying; + + bool methodIsCoroutine = methodInfo.ReturnType == typeof(IEnumerator); + if (methodIsCoroutine) + { + buttonEnabled &= (Application.isPlaying ? true : false); + } + + EditorGUI.BeginDisabledGroup(!buttonEnabled); + + if (GUILayout.Button(buttonText, _buttonStyle)) + { + object[] defaultParams = methodInfo.GetParameters().Select(p => p.DefaultValue).ToArray(); + IEnumerator methodResult = methodInfo.Invoke(target, defaultParams) as IEnumerator; + + if (!Application.isPlaying) + { + // Set target object and scene dirty to serialize changes to disk + EditorUtility.SetDirty(target); + + PrefabStage stage = PrefabStageUtility.GetCurrentPrefabStage(); + if (stage != null) + { + // Prefab mode + EditorSceneManager.MarkSceneDirty(stage.scene); + } + else + { + // Normal scene + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + } + } + else if (methodResult != null && target is MonoBehaviour behaviour) + { + behaviour.StartCoroutine(methodResult); + } + } + + EditorGUI.EndDisabledGroup(); + } + else + { + string warning = typeof(ButtonAttribute).Name + " works only on methods with no parameters"; + HelpBox_Layout(warning, MessageType.Warning, context: target, logToConsole: true); + } + } + + public static void NativeProperty_Layout(UnityEngine.Object target, PropertyInfo property) + { + object value = property.GetValue(target, null); + + if (value == null) + { + string warning = string.Format("{0} is null. {1} doesn't support reference types with null value", property.Name, typeof(ShowNativePropertyAttribute).Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + else if (!Field_Layout(value, property.Name)) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNativePropertyAttribute).Name, property.PropertyType.Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + } + + public static void NonSerializedField_Layout(UnityEngine.Object target, FieldInfo field) + { + object value = field.GetValue(target); + + if (value == null) + { + string warning = string.Format("{0} is null. {1} doesn't support reference types with null value", field.Name, typeof(ShowNonSerializedFieldAttribute).Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + else if (!Field_Layout(value, field.Name)) + { + string warning = string.Format("{0} doesn't support {1} types", typeof(ShowNonSerializedFieldAttribute).Name, field.FieldType.Name); + HelpBox_Layout(warning, MessageType.Warning, context: target); + } + } + + public static void HorizontalLine(Rect rect, float height, Color color) + { + rect.height = height; + EditorGUI.DrawRect(rect, color); + } + + public static void HelpBox(Rect rect, string message, MessageType type, UnityEngine.Object context = null, bool logToConsole = false) + { + EditorGUI.HelpBox(rect, message, type); + + if (logToConsole) + { + DebugLogMessage(message, type, context); + } + } + + public static void HelpBox_Layout(string message, MessageType type, UnityEngine.Object context = null, bool logToConsole = false) + { + EditorGUILayout.HelpBox(message, type); + + if (logToConsole) + { + DebugLogMessage(message, type, context); + } + } + + public static bool Field_Layout(object value, string label) + { + using (new EditorGUI.DisabledScope(disabled: true)) + { + bool isDrawn = true; + Type valueType = value.GetType(); + + if (valueType == typeof(bool)) + { + EditorGUILayout.Toggle(label, (bool)value); + } + else if (valueType == typeof(short)) + { + EditorGUILayout.IntField(label, (short)value); + } + else if (valueType == typeof(ushort)) + { + EditorGUILayout.IntField(label, (ushort)value); + } + else if (valueType == typeof(int)) + { + EditorGUILayout.IntField(label, (int)value); + } + else if (valueType == typeof(uint)) + { + EditorGUILayout.LongField(label, (uint)value); + } + else if (valueType == typeof(long)) + { + EditorGUILayout.LongField(label, (long)value); + } + else if (valueType == typeof(ulong)) + { + EditorGUILayout.TextField(label, ((ulong)value).ToString()); + } + else if (valueType == typeof(float)) + { + EditorGUILayout.FloatField(label, (float)value); + } + else if (valueType == typeof(double)) + { + EditorGUILayout.DoubleField(label, (double)value); + } + else if (valueType == typeof(string)) + { + EditorGUILayout.TextField(label, (string)value); + } + else if (valueType == typeof(Vector2)) + { + EditorGUILayout.Vector2Field(label, (Vector2)value); + } + else if (valueType == typeof(Vector3)) + { + EditorGUILayout.Vector3Field(label, (Vector3)value); + } + else if (valueType == typeof(Vector4)) + { + EditorGUILayout.Vector4Field(label, (Vector4)value); + } + else if (valueType == typeof(Vector2Int)) + { + EditorGUILayout.Vector2IntField(label, (Vector2Int)value); + } + else if (valueType == typeof(Vector3Int)) + { + EditorGUILayout.Vector3IntField(label, (Vector3Int)value); + } + else if (valueType == typeof(Color)) + { + EditorGUILayout.ColorField(label, (Color)value); + } + else if (valueType == typeof(Bounds)) + { + EditorGUILayout.BoundsField(label, (Bounds)value); + } + else if (valueType == typeof(Rect)) + { + EditorGUILayout.RectField(label, (Rect)value); + } + else if (valueType == typeof(RectInt)) + { + EditorGUILayout.RectIntField(label, (RectInt)value); + } + else if (typeof(UnityEngine.Object).IsAssignableFrom(valueType)) + { + EditorGUILayout.ObjectField(label, (UnityEngine.Object)value, valueType, true); + } + else if (valueType.BaseType == typeof(Enum)) + { + EditorGUILayout.EnumPopup(label, (Enum)value); + } + else if (valueType.BaseType == typeof(System.Reflection.TypeInfo)) + { + EditorGUILayout.TextField(label, value.ToString()); + } + else + { + isDrawn = false; + } + + return isDrawn; + } + } + + private static void DebugLogMessage(string message, MessageType type, UnityEngine.Object context) + { + switch (type) + { + case MessageType.None: + case MessageType.Info: + Debug.Log(message, context); + break; + case MessageType.Warning: + Debug.LogWarning(message, context); + break; + case MessageType.Error: + Debug.LogError(message, context); + break; + } + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs.meta new file mode 100644 index 0000000..782824e --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/NaughtyEditorGUI.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 6ff27ff7705d6064e935bb2159a1b453 +timeCreated: 1510926159 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs new file mode 100644 index 0000000..5e3b7e9 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs @@ -0,0 +1,413 @@ +using UnityEditor; +using System.Reflection; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class PropertyUtility + { + public static T GetAttribute(SerializedProperty property) where T : class + { + T[] attributes = GetAttributes(property); + return (attributes.Length > 0) ? attributes[0] : null; + } + + public static T[] GetAttributes(SerializedProperty property) where T : class + { + FieldInfo fieldInfo = ReflectionUtility.GetField(GetTargetObjectWithProperty(property), property.name); + if (fieldInfo == null) + { + return new T[] { }; + } + + return (T[])fieldInfo.GetCustomAttributes(typeof(T), true); + } + + public static NaughtyProperty CreateNaughtyProperty(SerializedProperty serializedProperty) + { + NaughtyProperty naughtyProperty = new NaughtyProperty(); + naughtyProperty.serializedProperty = serializedProperty; + + naughtyProperty.readOnlyAttribute = PropertyUtility.GetAttribute(serializedProperty); + naughtyProperty.enableIfAttribute = PropertyUtility.GetAttribute(serializedProperty); + + naughtyProperty.showIfAttribute = PropertyUtility.GetAttribute(serializedProperty); + naughtyProperty.validatorAttributes = PropertyUtility.GetAttributes(serializedProperty); + + naughtyProperty.labelAttribute = PropertyUtility.GetAttribute(serializedProperty); + + naughtyProperty.specialCaseDrawerAttribute = + PropertyUtility.GetAttribute(serializedProperty); + + return naughtyProperty; + } + + public static GUIContent GetLabel(SerializedProperty property) + { + LabelAttribute labelAttribute = GetAttribute(property); + return GetLabel(labelAttribute, property); + } + + public static GUIContent GetLabel(LabelAttribute labelAttribute, SerializedProperty property) + { + string labelText = (labelAttribute == null) + ? property.displayName + : labelAttribute.Label; + + GUIContent label = new GUIContent(labelText); + return label; + } + + public static void CallOnValueChangedCallbacks(SerializedProperty property) + { + OnValueChangedAttribute[] onValueChangedAttributes = GetAttributes(property); + if (onValueChangedAttributes.Length == 0) + { + return; + } + + object target = GetTargetObjectWithProperty(property); + property.serializedObject.ApplyModifiedProperties(); // We must apply modifications so that the new value is updated in the serialized object + + foreach (var onValueChangedAttribute in onValueChangedAttributes) + { + MethodInfo callbackMethod = ReflectionUtility.GetMethod(target, onValueChangedAttribute.CallbackName); + if (callbackMethod != null && + callbackMethod.ReturnType == typeof(void) && + callbackMethod.GetParameters().Length == 0) + { + callbackMethod.Invoke(target, new object[] { }); + } + else + { + string warning = string.Format( + "{0} can invoke only methods with 'void' return type and 0 parameters", + onValueChangedAttribute.GetType().Name); + + Debug.LogWarning(warning, property.serializedObject.targetObject); + } + } + } + + public static bool IsEnabled(SerializedProperty property) + { + ReadOnlyAttribute readOnlyAttribute = GetAttribute(property); + EnableIfAttributeBase enableIfAttribute = GetAttribute(property); + + return IsEnabled(readOnlyAttribute, enableIfAttribute, property); + } + + public static bool IsEnabled(ReadOnlyAttribute readOnlyAttribute, EnableIfAttributeBase enableIfAttribute, SerializedProperty property) + { + if (readOnlyAttribute != null) + { + return false; + } + + if (enableIfAttribute == null) + { + return true; + } + + object target = GetTargetObjectWithProperty(property); + + // deal with enum conditions + if (enableIfAttribute.EnumValue != null) + { + Enum value = GetEnumValue(target, enableIfAttribute.Conditions[0]); + if (value != null) + { + bool matched = value.GetType().GetCustomAttribute() == null + ? enableIfAttribute.EnumValue.Equals(value) + : value.HasFlag(enableIfAttribute.EnumValue); + + return matched != enableIfAttribute.Inverted; + } + + string message = enableIfAttribute.GetType().Name + " needs a valid enum field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + + // deal with normal conditions + List conditionValues = GetConditionValues(target, enableIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = GetConditionsFlag(conditionValues, enableIfAttribute.ConditionOperator, enableIfAttribute.Inverted); + return enabled; + } + else + { + string message = enableIfAttribute.GetType().Name + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + } + + public static bool IsVisible(SerializedProperty property) + { + ShowIfAttributeBase showIfAttribute = GetAttribute(property); + + return IsVisible(showIfAttribute, property); + } + + public static bool IsVisible(ShowIfAttributeBase showIfAttribute, SerializedProperty property) + { + if (showIfAttribute == null) + { + return true; + } + + object target = GetTargetObjectWithProperty(property); + + // deal with enum conditions + if (showIfAttribute.EnumValue != null) + { + Enum value = GetEnumValue(target, showIfAttribute.Conditions[0]); + if (value != null) + { + bool matched = value.GetType().GetCustomAttribute() == null + ? showIfAttribute.EnumValue.Equals(value) + : value.HasFlag(showIfAttribute.EnumValue); + + return matched != showIfAttribute.Inverted; + } + + string message = showIfAttribute.GetType().Name + + " needs a valid enum field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + + // deal with normal conditions + List conditionValues = GetConditionValues(target, showIfAttribute.Conditions); + if (conditionValues.Count > 0) + { + bool enabled = GetConditionsFlag(conditionValues, showIfAttribute.ConditionOperator, + showIfAttribute.Inverted); + return enabled; + } + else + { + string message = showIfAttribute.GetType().Name + + " needs a valid boolean condition field, property or method name to work"; + Debug.LogWarning(message, property.serializedObject.targetObject); + + return false; + } + } + + /// + /// Gets an enum value from reflection. + /// + /// The target object. + /// Name of a field, property, or method that returns an enum. + /// Null if can't find an enum value. + internal static Enum GetEnumValue(object target, string enumName) + { + FieldInfo enumField = ReflectionUtility.GetField(target, enumName); + if (enumField != null && enumField.FieldType.IsSubclassOf(typeof(Enum))) + { + return (Enum)enumField.GetValue(target); + } + + PropertyInfo enumProperty = ReflectionUtility.GetProperty(target, enumName); + if (enumProperty != null && enumProperty.PropertyType.IsSubclassOf(typeof(Enum))) + { + return (Enum)enumProperty.GetValue(target); + } + + MethodInfo enumMethod = ReflectionUtility.GetMethod(target, enumName); + if (enumMethod != null && enumMethod.ReturnType.IsSubclassOf(typeof(Enum))) + { + return (Enum)enumMethod.Invoke(target, null); + } + + return null; + } + + internal static List GetConditionValues(object target, string[] conditions) + { + List conditionValues = new List(); + foreach (var condition in conditions) + { + FieldInfo conditionField = ReflectionUtility.GetField(target, condition); + if (conditionField != null && + conditionField.FieldType == typeof(bool)) + { + conditionValues.Add((bool)conditionField.GetValue(target)); + } + + PropertyInfo conditionProperty = ReflectionUtility.GetProperty(target, condition); + if (conditionProperty != null && + conditionProperty.PropertyType == typeof(bool)) + { + conditionValues.Add((bool)conditionProperty.GetValue(target)); + } + + MethodInfo conditionMethod = ReflectionUtility.GetMethod(target, condition); + if (conditionMethod != null && + conditionMethod.ReturnType == typeof(bool) && + conditionMethod.GetParameters().Length == 0) + { + conditionValues.Add((bool)conditionMethod.Invoke(target, null)); + } + } + + return conditionValues; + } + + internal static bool GetConditionsFlag(List conditionValues, EConditionOperator conditionOperator, bool invert) + { + bool flag; + if (conditionOperator == EConditionOperator.And) + { + flag = true; + foreach (var value in conditionValues) + { + flag = flag && value; + } + } + else + { + flag = false; + foreach (var value in conditionValues) + { + flag = flag || value; + } + } + + if (invert) + { + flag = !flag; + } + + return flag; + } + + public static Type GetPropertyType(SerializedProperty property) + { + object obj = GetTargetObjectOfProperty(property); + Type objType = obj.GetType(); + + return objType; + } + + /// + /// Gets the object the property represents. + /// + /// + /// + public static object GetTargetObjectOfProperty(SerializedProperty property) + { + if (property == null) + { + return null; + } + + string path = property.propertyPath.Replace(".Array.data[", "["); + object obj = property.serializedObject.targetObject; + string[] elements = path.Split('.'); + + foreach (var element in elements) + { + if (element.Contains("[")) + { + string elementName = element.Substring(0, element.IndexOf("[")); + int index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else + { + obj = GetValue_Imp(obj, element); + } + } + + return obj; + } + + /// + /// Gets the object that the property is a member of + /// + /// + /// + public static object GetTargetObjectWithProperty(SerializedProperty property) + { + string path = property.propertyPath.Replace(".Array.data[", "["); + object obj = property.serializedObject.targetObject; + string[] elements = path.Split('.'); + + for (int i = 0; i < elements.Length - 1; i++) + { + string element = elements[i]; + if (element.Contains("[")) + { + string elementName = element.Substring(0, element.IndexOf("[")); + int index = Convert.ToInt32(element.Substring(element.IndexOf("[")).Replace("[", "").Replace("]", "")); + obj = GetValue_Imp(obj, elementName, index); + } + else + { + obj = GetValue_Imp(obj, element); + } + } + + return obj; + } + + private static object GetValue_Imp(object source, string name) + { + if (source == null) + { + return null; + } + + Type type = source.GetType(); + + while (type != null) + { + FieldInfo field = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + if (field != null) + { + return field.GetValue(source); + } + + PropertyInfo property = type.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); + if (property != null) + { + return property.GetValue(source, null); + } + + type = type.BaseType; + } + + return null; + } + + private static object GetValue_Imp(object source, string name, int index) + { + IEnumerable enumerable = GetValue_Imp(source, name) as IEnumerable; + if (enumerable == null) + { + return null; + } + + IEnumerator enumerator = enumerable.GetEnumerator(); + for (int i = 0; i <= index; i++) + { + if (!enumerator.MoveNext()) + { + return null; + } + } + + return enumerator.Current; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs.meta new file mode 100644 index 0000000..dce67c6 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/PropertyUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 312eedcb79c7a5542b87c0b848e3e2fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs new file mode 100644 index 0000000..4f9f544 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; + +namespace NaughtyAttributes.Editor +{ + public static class ReflectionUtility + { + public static IEnumerable GetAllFields(object target, Func predicate) + { + if (target == null) + { + Debug.LogError("The target object is null. Check for missing scripts."); + yield break; + } + + List types = GetSelfAndBaseTypes(target); + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable fieldInfos = types[i] + .GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var fieldInfo in fieldInfos) + { + yield return fieldInfo; + } + } + } + + public static IEnumerable GetAllProperties(object target, Func predicate) + { + if (target == null) + { + Debug.LogError("The target object is null. Check for missing scripts."); + yield break; + } + + List types = GetSelfAndBaseTypes(target); + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable propertyInfos = types[i] + .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var propertyInfo in propertyInfos) + { + yield return propertyInfo; + } + } + } + + public static IEnumerable GetAllMethods(object target, Func predicate) + { + if (target == null) + { + Debug.LogError("The target object is null. Check for missing scripts."); + yield break; + } + + List types = GetSelfAndBaseTypes(target); + + for (int i = types.Count - 1; i >= 0; i--) + { + IEnumerable methodInfos = types[i] + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly) + .Where(predicate); + + foreach (var methodInfo in methodInfos) + { + yield return methodInfo; + } + } + } + + public static FieldInfo GetField(object target, string fieldName) + { + return GetAllFields(target, f => f.Name.Equals(fieldName, StringComparison.Ordinal)).FirstOrDefault(); + } + + public static PropertyInfo GetProperty(object target, string propertyName) + { + return GetAllProperties(target, p => p.Name.Equals(propertyName, StringComparison.Ordinal)).FirstOrDefault(); + } + + public static MethodInfo GetMethod(object target, string methodName) + { + return GetAllMethods(target, m => m.Name.Equals(methodName, StringComparison.Ordinal)).FirstOrDefault(); + } + + public static Type GetListElementType(Type listType) + { + if (listType.IsGenericType) + { + return listType.GetGenericArguments()[0]; + } + else + { + return listType.GetElementType(); + } + } + + /// + /// Get type and all base types of target, sorted as following: + /// [target's type, base type, base's base type, ...] + /// + /// + /// + private static List GetSelfAndBaseTypes(object target) + { + List types = new List() + { + target.GetType() + }; + + while (types.Last().BaseType != null) + { + types.Add(types.Last().BaseType); + } + + return types; + } + } +} diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs.meta new file mode 100644 index 0000000..fc01215 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/ReflectionUtility.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 1d86c581f02a55f458e36bf7e81e3084 +timeCreated: 1520258793 +licenseType: Store +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs new file mode 100644 index 0000000..4f4298c --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs @@ -0,0 +1,34 @@ +using UnityEditor; + +namespace NaughtyAttributes.Editor +{ + internal class SavedBool + { + private bool _value; + private string _name; + + public bool Value + { + get + { + return _value; + } + set + { + if (_value == value) + { + return; + } + + _value = value; + EditorPrefs.SetBool(_name, value); + } + } + + public SavedBool(string name, bool value) + { + _name = name; + _value = EditorPrefs.GetBool(name, value); + } + } +} \ No newline at end of file diff --git a/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs.meta b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs.meta new file mode 100644 index 0000000..aebf007 --- /dev/null +++ b/Assets/HandDriverUPM/NaughtyAttributes/Editor/Utility/SavedBool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 18613afe66b0c0344a2be5f430bf965a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..37ebb10 --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,45 @@ +{ + "dependencies": { + "com.unity.collab-proxy": "2.0.7", + "com.unity.feature.development": "1.0.1", + "com.unity.ide.rider": "3.0.24", + "com.unity.ide.visualstudio": "2.0.18", + "com.unity.ide.vscode": "1.2.5", + "com.unity.test-framework": "1.1.33", + "com.unity.textmeshpro": "3.0.6", + "com.unity.timeline": "1.6.5", + "com.unity.ugui": "1.0.0", + "com.unity.visualscripting": "1.9.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..60a1da1 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,393 @@ +{ + "dependencies": { + "com.unity.collab-proxy": { + "version": "2.0.7", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.editorcoroutines": { + "version": "1.0.0", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ext.nunit": { + "version": "1.0.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.feature.development": { + "version": "1.0.1", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.ide.visualstudio": "2.0.18", + "com.unity.ide.rider": "3.0.24", + "com.unity.ide.vscode": "1.2.5", + "com.unity.editorcoroutines": "1.0.0", + "com.unity.performance.profile-analyzer": "1.2.2", + "com.unity.test-framework": "1.1.33", + "com.unity.testtools.codecoverage": "1.2.4" + } + }, + "com.unity.ide.rider": { + "version": "3.0.24", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.18", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.9" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.vscode": { + "version": "1.2.5", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.performance.profile-analyzer": { + "version": "1.2.2", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.settings-manager": { + "version": "1.0.3", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.test-framework": { + "version": "1.1.33", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.testtools.codecoverage": { + "version": "1.2.4", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.0.16", + "com.unity.settings-manager": "1.0.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.textmeshpro": { + "version": "3.0.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.timeline": { + "version": "1.6.5", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.visualscripting": { + "version": "1.9.0", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.uielementsnative": "1.0.0" + } + }, + "com.unity.modules.uielementsnative": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..07ebfb0 --- /dev/null +++ b/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 1024 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..cdc1f3e --- /dev/null +++ b/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0 + m_ClothInterCollisionStiffness: 0 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_DefaultMaxAngluarSpeed: 7 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..0147887 --- /dev/null +++ b/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] + m_configObjects: {} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..1e44a0a --- /dev/null +++ b/ProjectSettings/EditorSettings.asset @@ -0,0 +1,30 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_ExternalVersionControlSupport: Visible Meta Files + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref + m_ProjectGenerationRootNamespace: + m_CollabEditorSettings: + inProgressEnabled: 1 + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_ShowLightmapResolutionOverlay: 1 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..43369e3 --- /dev/null +++ b/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_LogWhenShaderIsCompiled: 0 + m_AllowEnlightenSupportForUpgradedProject: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..17c8f53 --- /dev/null +++ b/ProjectSettings/InputManager.asset @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 diff --git a/ProjectSettings/MemorySettings.asset b/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000..5b5face --- /dev/null +++ b/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..3b0b7c3 --- /dev/null +++ b/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..112a053 --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_EnablePackageDependencies: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -830 + m_OriginalInstanceId: -832 + m_LoadAssets: 0 diff --git a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json new file mode 100644 index 0000000..ad11087 --- /dev/null +++ b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json @@ -0,0 +1,7 @@ +{ + "m_Name": "Settings", + "m_Path": "ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json", + "m_Dictionary": { + "m_DictionaryValues": [] + } +} \ No newline at end of file diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..47880b1 --- /dev/null +++ b/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..cccf294 --- /dev/null +++ b/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,824 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 24 + productGUID: ea30a53eb3009b04aaeb889df042f99a + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: testUPM + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 1 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 1 + androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 1 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 1 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 0 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchMaxWorkerMultiple: 8 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 1 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 0.1 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + useHDRDisplay: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: + Android: com.DefaultCompany.testUPM + buildNumber: + Standalone: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 0 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 22 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 1 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 12.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 12.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea + templatePackageId: com.unity.template.3d@8.1.3 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 1 + AndroidTargetDevices: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidMinifyWithR8: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: + m_BuildTargetBatching: + - m_BuildTarget: Standalone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: tvOS + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: Android + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: iPhone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: WebGL + m_StaticBatching: 0 + m_DynamicBatching: 0 + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 1 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 1 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 1 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 1 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 1 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: + - m_BuildTarget: PS4Player + m_GraphicsJobMode: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobMode: 0 + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 1 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AppleTVSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: WebGLSupport + m_APIs: 0b000000 + m_Automatic: 1 + m_BuildTargetVRSettings: + - m_BuildTarget: Standalone + m_Enabled: 0 + m_Devices: + - Oculus + - OpenVR + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: + - m_BuildTarget: Android + m_EncodingQuality: 1 + - m_BuildTarget: iPhone + m_EncodingQuality: 1 + - m_BuildTarget: tvOS + m_EncodingQuality: 1 + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetNormalMapEncoding: + - m_BuildTarget: Android + m_Encoding: 1 + - m_BuildTarget: iPhone + m_Encoding: 1 + - m_BuildTarget: tvOS + m_Encoding: 1 + m_BuildTargetDefaultTextureCompressionFormat: + - m_BuildTarget: Android + m_Format: 3 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchUseGOLDLinker: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 1 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 1 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 0 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 16 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLPowerPreference: 2 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: + EmbeddedLinux: 1 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Lumin: 1 + Nintendo Switch: 1 + PS4: 1 + PS5: 1 + Stadia: 1 + WebGL: 1 + Windows Store Apps: 1 + XboxOne: 1 + iPhone: 1 + tvOS: 1 + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + enableRoslynAnalyzers: 1 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + assemblyVersionValidation: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Template_3D + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Template_3D + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: + UNet: 1 + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 3 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: + organizationId: + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + playerDataPath: + forceSRGBBlit: 1 + virtualTexturingSupportEnabled: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..cd32c29 --- /dev/null +++ b/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2021.3.30f1 +m_EditorVersionWithRevision: 2021.3.30f1 (b4360d7cdac4) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..36c0dad --- /dev/null +++ b/ProjectSettings/QualitySettings.asset @@ -0,0 +1,234 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + GameCoreScarlett: 5 + GameCoreXboxOne: 5 + Nintendo 3DS: 5 + Nintendo Switch: 5 + PS4: 5 + PS5: 5 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/ProjectSettings/SceneTemplateSettings.json b/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000..5e97f83 --- /dev/null +++ b/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,121 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "defaultInstantiationMode": 0 + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..a88bee0 --- /dev/null +++ b/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/ProjectSettings/boot.config b/ProjectSettings/boot.config new file mode 100644 index 0000000..e69de29

    3 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 z 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 z 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

    =eMjde{VDm*SM-^~r`im%bY)4` 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