From 4aa254486e7e570a81ce2aa8a9b18fdf3000dac7 Mon Sep 17 00:00:00 2001 From: Nick Nicholls Date: Thu, 22 Mar 2018 07:20:33 -0400 Subject: [PATCH] 4.0 Release The ShareFile.Api.Models namespace has moved to ShareFile.Api.Client.Models. Methods that took a CancellationToken? parameter now take CancellationToken. If you were passing a null value, pass default(CancellationToken) or omit the parameter. Classes, methods, and properties that were tagged Obsolete have been removed: PlatformFileStream, IPlatformFile, and the ShareFileClient.ZoneAuthentication property. If you were using PlatformFileStream: all methods/constructors that accepted PlatformFileStream now accept Stream. If you were using ShareFileClient.ZoneAuthentication: use ShareFileClient.CustomAuthentication. The ShareFile.Api.Client.Filesystem namespace has been removed. UploaderBase/DownloaderBase.OnTransferProgress is now an event. If you were assigning a value, use += and -=. TransferEventArgs and TransferProgress are now structs. Null-checking TransferEventArgs.Progress is no longer necessary. Upload and download progress is now reported over time intervals. The default interval is 100ms. This value is configurable at FileUploaderConfig/DownloaderConfig.ProgressReportInterval. --- .gitattributes | 79 +- .gitignore | 97 +- README.md | 2 +- ShareFile.Api.Client.DotNet.sln | 27 +- ShareFile.Api.Client.sln | 76 - .../ApiRequestTests.cs | 49 - .../ClientHashAuthenticationTests.cs | 99 - .../ClientHash/HmacSha256Provider.cs | 32 - .../OAuth2/OAuth2AuthenticationHelperTests.cs | 86 - .../WebAuthenticationHelperTests.cs | 104 - Tests/ShareFile.Api.Client.Tests/BaseTests.cs | 100 - .../Converters/ODataConverterTests.cs | 274 -- .../Extensions/BoolExtensionsTests.cs | 18 - .../Extensions/ContactExtensionsTests.cs | 19 - .../Extensions/ItemsEntityExtensionsTests.cs | 56 - .../Extensions/ODataObjectExtensionsTests.cs | 199 - .../Extensions/QueryExtensionTests.cs | 251 - .../Extensions/StringExtensionsTests.cs | 27 - .../Properties/AssemblyInfo.cs | 36 - .../Requests/ApiRequestTests.cs | 314 -- .../Requests/Filters/BooleanFilterTests.cs | 64 - .../Requests/Filters/DateFilterTests.cs | 65 - .../Requests/Filters/SubstringFilterTests.cs | 56 - .../Providers/RequestProviderTests.cs | 777 --- .../Requests/QueryTests.cs | 28 - .../ShareFile.Api.Client.Tests.csproj | 123 - .../Transfers/CompleteBytesTests.cs | 89 - .../Transfers/DownloaderTests.cs | 129 - .../Transfers/TransferBaseTests.cs | 64 - .../Transfers/UploaderTests.cs | 291 -- .../Uploaders/CompleteBytesTests.cs | 89 - .../Uploaders/UploaderTests.cs | 285 -- Tests/ShareFile.Api.Client.Tests/UserInfo.cs | 23 - .../packages.config | 10 - global.json | 6 - src/NuGetInfo.props | Bin 0 -> 1968 bytes .../ShareFile.Api.Client-net40.csproj | 99 - .../ShareFile.Api.Client-net45.csproj | 58 - src/ShareFile.Api.Client.Csproj/app.config | 15 - .../packages.config | 11 - src/ShareFile.Api.Client/Configuration.cs | 18 +- .../Converters/LoggingConverter.cs | 3 + .../Converters/ODataConverter.cs | 2 +- .../Converters/ODataFactory.cs | 66 +- .../Converters/SafeEnumConverter.cs | 2 +- .../Credentials/PlatformCredentialCache.cs | 2 +- .../Entities/AccessControlsEntity.cs | 103 +- .../Entities/AccountsEntity.cs | 226 +- .../Entities/AppsEntity.cs | 291 ++ .../Entities/AsyncOperationsEntity.cs | 44 +- .../Entities/CapabilitiesEntity.cs | 10 +- .../Entities/ConfigsEntity.cs | 54 - .../Entities/ConnectorGroupsEntity.cs | 98 +- .../Entities/DevicesEntity.cs | 32 +- .../Entities/EncryptedEmailsEntity.cs | 507 ++ .../Entities/FavoriteFoldersEntity.cs | 36 +- .../Entities/FavoritesEntity.cs | 218 + .../Entities/FileLockEntity.cs | 30 +- .../Entities/FolderTemplatesEntity.cs | 41 +- .../Entities/GroupsEntity.cs | 63 +- .../Entities/IrmClassificationsEntity.cs | 55 - .../Entities/ItemsEntity.cs | 303 +- .../Entities/MetadataEntity.cs | 50 +- .../Entities/PoliciesEntity.cs | 36 +- .../Entities/RemoteUploadsEntity.cs | 46 +- .../Entities/ReportsEntity.cs | 105 +- .../Entities/SamlMetadataEntity.cs | 41 + .../Entities/SessionsEntity.cs | 26 +- .../Entities/SharesEntity.cs | 151 +- .../Entities/StorageCentersEntity.cs | 46 +- .../Entities/UsersEntity.cs | 344 +- .../Entities/WebhookClientsEntity.cs | 106 + .../Entities/WebhookSubscriptionsEntity.cs | 163 + .../Entities/WorkflowsEntity.cs | 299 ++ .../Entities/ZonesEntity.cs | 54 +- .../Enums/AddressListType.cs | 2 +- src/ShareFile.Api.Client/Enums/SafeEnum.cs | 49 +- .../Events/ChangeDomainCallback.cs | 2 +- .../Events/EventHandlerResponse.cs | 2 +- .../Exceptions/ApiDownException.cs | 12 + .../AsyncOperationScheduledException.cs | 2 +- .../Exceptions/HttpsExpectedException.cs | 2 + .../Exceptions/ODataRequestException.cs | 7 +- .../Extensions/ContactExtensions.cs | 2 +- .../HttpRequestMessageExtensions.cs | 20 +- .../HttpResponseMessageExtensions.cs | 7 +- .../Extensions/ODataObjectExtensions.cs | 2 +- .../Extensions/ObjectExtensions.cs | 2 +- .../Extensions/QueryExtensions.cs | 10 +- .../Extensions/StringExtensions.cs | 19 + .../Extensions/TaskExtensions.cs | 8 - .../Extensions/UriExtensions.cs | 115 +- .../FileSystem/IPlatformFile.cs | 21 - .../FileSystem/PlatformFileInfo.cs | 54 - .../FileSystem/PlatformFileStream.cs | 89 - .../Logging/ActionStopwatch.cs | 5 +- .../Models/AccessControl.cs | 20 +- .../Models/AccessControlBulkResult.cs | 18 +- .../Models/AccessControlDomains.cs | 9 +- .../Models/AccessControlFailedEntry.cs | 10 +- .../Models/AccessControlFilter.cs | 20 +- .../Models/AccessControlParam.cs | 11 +- .../Models/AccessControlsBulkParams.cs | 10 +- .../Models/AccessControlsCloneParams.cs | 12 +- src/ShareFile.Api.Client/Models/Account.cs | 157 +- .../Models/AccountMessageCode.cs | 10 +- .../Models/AccountPreferences.cs | 204 +- .../Models/AccountSubType.cs | 8 +- .../Models/AccountUser.cs | 21 +- .../Models/AccountZoneUsage.cs | 8 +- .../Models/ActivationToken.cs | 49 + .../Models/ActivityReportFilter.cs | 49 + .../Models/AdvancedSearchResults.cs | 10 +- src/ShareFile.Api.Client/Models/AppCodes.cs | 27 +- .../Models/AsyncOperation.cs | 23 +- .../Models/AsyncOperationState.cs | 12 +- .../Models/AsyncOperationType.cs | 78 +- src/ShareFile.Api.Client/Models/Bandwidth.cs | 71 + .../Models/BaseAccountCreationParameters.cs | 97 + .../Models/BaseCspAccountParameters.cs | 49 + .../Models/BillingContact.cs | 67 + .../Models/BillingInfo.cs | 37 +- .../Models/BrandingLinks.cs | 23 +- .../Models/Cancellation.cs | 76 + src/ShareFile.Api.Client/Models/Capability.cs | 22 +- .../Models/CapabilityName.cs | 188 +- src/ShareFile.Api.Client/Models/ChunkType.cs | 8 +- .../Models/ClientCapability.cs | 20 +- .../Models/ClientUpgradeWeb.cs | 52 + .../Models/CompanyContactInformation.cs | 60 + .../Models/ConnectedApp.cs | 97 + .../Models/ConnectorGroup.cs | 12 +- .../Models/ConnectorGroupAccessControl.cs | 7 +- .../Models/ConnectorGroupKind.cs | 8 +- .../Models/ConnectorGroupZone.cs | 15 +- src/ShareFile.Api.Client/Models/Contact.cs | 37 +- .../Models/CreateWorkflowParams.cs | 98 + .../Models/CspTenantAccountParameters.cs | 58 + .../Models/CustomMessage.cs | 46 + .../Models/CustomWorkflowBundleType.cs | 20 + .../Models/DailyAvailability.cs | 70 + src/ShareFile.Api.Client/Models/Device.cs | 14 +- .../Models/DeviceActionInitiatorRole.cs | 8 +- .../Models/DeviceLogEntry.cs | 14 +- .../Models/DeviceLogEntryAction.cs | 12 +- .../Models/DeviceStatus.cs | 9 +- src/ShareFile.Api.Client/Models/DeviceUser.cs | 25 +- .../Models/DeviceUserWipe.cs | 10 +- .../Models/DeviceWipeReport.cs | 9 +- src/ShareFile.Api.Client/Models/DiskSpace.cs | 10 +- .../{LockType.cs => DistributionMethod.cs} | 13 +- src/ShareFile.Api.Client/Models/DlpStatus.cs | 24 +- .../Models/DocumentViewerPrinting.cs | 8 +- .../Models/DownloadSpecification.cs | 15 +- src/ShareFile.Api.Client/Models/ESignature.cs | 16 +- .../Models/ESignatureDocumentStatus.cs | 8 +- .../Models/EditingPlatform.cs | 12 +- .../Models/EditingPlatformInfo.cs | 9 +- .../Models/EmailAddress.cs | 58 + .../Models/EmailSupport.cs | 46 + .../Models/EncryptedEmail.cs | 142 + .../Models/EncryptedEmailCreateParams.cs | 61 + .../Models/EncryptedEmailParams.cs | 72 + .../Models/EncryptedEmailRecipient.cs | 97 + .../Models/EncryptedEmailReplyParams.cs | 70 + .../Models/EncryptedEmailSendParams.cs | 61 + .../Models/EnsEventType.cs | 12 +- .../Models/EnsSubscriberConfiguration.cs | 38 +- .../Models/EnsSubscriptionRequest.cs | 9 +- .../Models/EnsSubscriptionToken.cs | 9 +- .../Models/EntityTypeMap.cs | 106 +- .../Models/ExceptionReason.cs | 111 +- src/ShareFile.Api.Client/Models/Favorite.cs | 88 + .../Models/FavoriteFolder.cs | 17 +- src/ShareFile.Api.Client/Models/File.cs | 51 +- .../Models/FileAndFolderPolicy.cs | 11 +- .../Models/FileAndFolderSettingOptions.cs | 89 + .../Models/FileAndFolderSettings.cs | 32 +- src/ShareFile.Api.Client/Models/FileLock.cs | 11 +- .../Models/FileVirusStatus.cs | 24 +- .../Models/FindSubdomainParams.cs | 10 +- .../Models/FindSubdomainResult.cs | 12 +- src/ShareFile.Api.Client/Models/Folder.cs | 34 +- .../Models/FolderInvite.cs | 28 +- .../Models/FolderOption.cs | 8 +- .../Models/FolderTemplate.cs | 8 +- .../Models/FolderTemplateItem.cs | 7 +- .../Models/ForbiddenOAuthClientNameWords.cs | 49 + .../Models/GenericConfig.cs | 10 +- src/ShareFile.Api.Client/Models/Group.cs | 32 +- .../Models/Image32Action.cs | 8 +- .../Models/InboxMetadata.cs | 9 +- src/ShareFile.Api.Client/Models/Industry.cs | 5 +- .../Models/IntegrationProvider.cs | 11 +- .../Models/IrmClassification.cs | 12 +- .../Models/IrmPrimaryAccessRightParams.cs | 16 +- src/ShareFile.Api.Client/Models/Item.cs | 195 +- src/ShareFile.Api.Client/Models/ItemAction.cs | 8 +- .../Models/ItemDlpInfo.cs | 8 +- src/ShareFile.Api.Client/Models/ItemInfo.cs | 81 +- .../Models/ItemOperations.cs | 38 + .../Models/ItemOrderingMode.cs | 20 +- .../Models/ItemProtocolLink.cs | 6 +- src/ShareFile.Api.Client/Models/Link.cs | 12 +- .../Models/MarketAnalytics.cs | 8 +- src/ShareFile.Api.Client/Models/Metadata.cs | 10 +- .../Models/MobileSecuritySettings.cs | 14 +- src/ShareFile.Api.Client/Models/Note.cs | 11 +- .../Models/Notification.cs | 201 - .../Models/NotificationLocale.cs | 8 +- .../Models/NotifyUsersParams.cs | 6 +- src/ShareFile.Api.Client/Models/ODataFeed.cs | 7 +- .../Models/ODataObject.cs | 11 +- .../Models/ODataObjectType.cs | 8 +- .../Models/OutlookInformation.cs | 23 +- .../Models/OutlookInformationOptionBool.cs | 9 +- .../Models/OutlookInformationOptionInt.cs | 9 +- .../Models/OutlookInformationOptionString.cs | 9 +- .../Models/PasswordPolicy.cs | 16 +- .../Models/PhoneSupport.cs | 70 + .../Models/PinLockType.cs | 8 +- .../Models/PlanFeatures.cs | 39 +- src/ShareFile.Api.Client/Models/Policy.cs | 40 +- .../Models/PolicyUsage.cs | 6 +- src/ShareFile.Api.Client/Models/PowerTools.cs | 128 +- .../Models/PreviewPlatform.cs | 8 +- .../Models/PreviewPlatformInfo.cs | 9 +- .../Models/PreviewStatus.cs | 8 +- src/ShareFile.Api.Client/Models/Principal.cs | 11 +- .../Models/ProductDefaults.cs | 20 +- src/ShareFile.Api.Client/Models/Query.cs | 14 +- .../Models/QueryPaging.cs | 13 +- .../Models/QuerySorting.cs | 9 +- .../Models/Redirection.cs | 15 +- .../Models/RemoteUpload.cs | 13 +- .../Models/RemoteUploadRequestParams.cs | 5 +- src/ShareFile.Api.Client/Models/Report.cs | 118 +- .../Models/ReportDateOption.cs | 8 +- .../Models/ReportFilter.cs | 32 + .../Models/ReportObjectType.cs | 11 +- .../Models/ReportRecord.cs | 15 +- .../Models/ReportRunFrequency.cs | 8 +- .../Models/ReportRunStatus.cs | 8 +- src/ShareFile.Api.Client/Models/ReportType.cs | 15 +- .../Models/RequestedPlan.cs | 70 + .../Models/RequireSubdomainResult.cs | 8 +- .../Models/RequireWebPopResult.cs | 8 +- .../Models/ResetPasswordRequest.cs | 67 + src/ShareFile.Api.Client/Models/SFTool.cs | 8 +- .../Models/SSOAccountProvider.cs | 21 +- src/ShareFile.Api.Client/Models/SSOInfo.cs | 19 +- .../Models/SSOInfoEntry.cs | 9 +- .../Models/SalesTaxQuote.cs | 16 +- .../Models/SearchQuery.cs | 11 +- .../Models/SearchResult.cs | 34 +- .../Models/SearchResults.cs | 10 +- .../Models/SecurityQuestion.cs | 7 +- .../Models/SentNotification.cs | 58 + src/ShareFile.Api.Client/Models/Service.cs | 22 +- .../Models/ServicesCollection.cs | 19 +- src/ShareFile.Api.Client/Models/Session.cs | 13 +- src/ShareFile.Api.Client/Models/Share.cs | 147 +- .../Models/ShareAccessRight.cs | 9 +- .../Models/ShareAccessRightType.cs | 18 +- .../Models/ShareActionType.cs | 12 +- src/ShareFile.Api.Client/Models/ShareAlias.cs | 15 +- .../Models/ShareFileAccessRights.cs | 56 +- .../Models/ShareItemHistory.cs | 8 +- .../Models/ShareRequestParams.cs | 17 +- .../Models/ShareResendParams.cs | 13 +- .../Models/ShareSendParams.cs | 21 +- .../Models/ShareSettings.cs | 8 +- .../Models/ShareSubType.cs | 8 +- src/ShareFile.Api.Client/Models/ShareType.cs | 8 +- .../Models/SimpleQuery.cs | 15 +- .../Models/SimpleSearchQuery.cs | 11 +- .../Models/SortDirection.cs | 8 +- src/ShareFile.Api.Client/Models/SortField.cs | 8 +- .../Models/StorageCenter.cs | 21 +- .../Models/StorageCenterUrls.cs | 49 + .../Models/StoragePolicy.cs | 11 +- .../Models/StorageSettings.cs | 8 +- .../Models/SubdomainAvailabilityResult.cs | 52 + .../Models/SubscribedResourceEvent.cs | 61 + .../Models/SubscriptionContext.cs | 61 + src/ShareFile.Api.Client/Models/Support.cs | 94 + .../Models/SupportFeedback.cs | 52 + .../Models/SupportMethod.cs | 70 + .../Models/SymbolicLink.cs | 14 +- .../Models/TenantAccountCreationParameters.cs | 76 + .../Models/TenantZoneUsageReport.cs | 5 +- .../Models/ToolInformation.cs | 9 +- src/ShareFile.Api.Client/Models/TreeMode.cs | 8 +- .../Models/TwoFactorAuthApp.cs | 79 + .../Models/TwoFactorAuthPasscodeType.cs | 20 + src/ShareFile.Api.Client/Models/TypeOfTour.cs | 8 +- src/ShareFile.Api.Client/Models/UXMode.cs | 8 +- .../Models/UploadMethod.cs | 8 +- .../Models/UploadRequestParams.cs | 35 +- .../Models/UploadSpecification.cs | 18 +- src/ShareFile.Api.Client/Models/User.cs | 76 +- .../Models/UserAccessPolicy.cs | 11 +- .../Models/UserAccessSettings.cs | 175 +- .../Models/UserAuthenticationType.cs | 8 +- .../Models/UserBulkDowngradeRequest.cs | 61 + .../Models/UserBulkOperationRequest.cs | 52 + .../Models/UserConfirmRequirement.cs | 25 +- .../Models/UserConfirmationSettings.cs | 29 +- src/ShareFile.Api.Client/Models/UserInfo.cs | 12 +- src/ShareFile.Api.Client/Models/UserPolicy.cs | 19 +- .../Models/UserPreferences.cs | 34 +- src/ShareFile.Api.Client/Models/UserRole.cs | 18 +- .../Models/UserSecurity.cs | 24 +- .../Models/UserSummaryReportFilter.cs | 112 + src/ShareFile.Api.Client/Models/UserUsage.cs | 10 +- src/ShareFile.Api.Client/Models/VRootType.cs | 8 +- src/ShareFile.Api.Client/Models/Versioning.cs | 8 +- .../Models/WatermarkedDownloads.cs | 8 +- .../Models/WebhookCapabilities.cs | 46 + .../Models/WebhookClient.cs | 61 + .../Models/WebhookSignatureKeys.cs | 61 + .../Models/WebhookSubscription.cs | 72 + .../Models/WebhookSupportedContext.cs | 52 + .../Models/WebhookSupportedEvents.cs | 52 + src/ShareFile.Api.Client/Models/Workflow.cs | 121 + .../Models/WorkflowParticipant.cs | 73 + .../Models/WorkflowRole.cs | 28 + .../Models/WorkflowStatus.cs | 28 + .../Models/WorkflowType.cs | 24 + src/ShareFile.Api.Client/Models/Zone.cs | 63 +- .../Models/ZoneService.cs | 68 +- src/ShareFile.Api.Client/Models/ZoneType.cs | 8 +- .../Models/ZoneUsageBreakdown.cs | 5 +- src/ShareFile.Api.Client/NotNullAttribute.cs | 63 + .../Primitives/ShareFileId.cs | 746 +++ .../Properties/AssemblyInfo.cs | 7 +- .../Executors/AsyncRequestExecutor.cs | 4 +- .../Executors/IAsyncRequestExecutor.cs | 2 - .../Executors/RequestExecutorFactory.cs | 4 +- .../Requests/Filters/Filter.cs | 2 +- .../Requests/Filters/TypeFilter.cs | 10 +- src/ShareFile.Api.Client/Requests/IQuery.cs | 20 +- .../Providers/AsyncRequestProvider.cs | 52 +- .../Requests/Providers/BaseRequestProvider.cs | 35 +- .../Providers/IAsyncRequestProvider.cs | 12 +- .../Requests/Providers/Response.cs | 2 +- .../Requests/Providers/SyncRequestProvider.cs | 23 +- src/ShareFile.Api.Client/Requests/Query.cs | 48 +- .../Requests/QueryMetadata.cs | 16 + .../Authentication/OAuth2/OAuthService.cs | 12 +- .../Cryptography/HmacSha256Provider.cs | 2 +- .../ShareFile.Api.Client.csproj | 94 + .../ShareFile.Api.Client.xproj | 21 - .../ShareFileClient.Entities.cs | 29 +- src/ShareFile.Api.Client/ShareFileClient.cs | 212 +- .../Downloaders/AsyncDownloaderBase.cs | 78 + .../Downloaders/AsyncFileDownloader.cs | 199 +- .../AsyncMemoryMappedFileDownloader.cs | 210 + .../Transfers/Downloaders/DownloaderBase.cs | 60 +- .../Transfers/Downloaders/DownloaderConfig.cs | 12 +- .../Downloaders/ExpectedLengthStream.cs | 61 + .../Transfers/Downloaders/FileDownloader.cs | 65 +- .../Downloaders/SyncDownloaderBase.cs | 6 +- .../Transfers/ProgressStream.cs | 47 + .../Transfers/StreamWrapper.cs | 54 + .../Transfers/TransferEventArgs.cs | 7 +- .../Transfers/TransferProgress.cs | 60 +- .../Transfers/TransferProgressReporter.cs | 106 + .../Transfers/TransfererBase.cs | 44 +- .../Transfers/UploadSpecificationRequest.cs | 67 +- .../Transfers/Uploaders/ActiveUploadState.cs | 2 +- .../AsyncMemoryMappedFileUploader.cs | 335 ++ .../Uploaders/AsyncScalingFileUploader.cs | 45 +- .../Uploaders/AsyncStandardFileUploader.cs | 52 +- .../Transfers/Uploaders/AsyncUploaderBase.cs | 101 +- .../Buffers/NoncontiguousMemoryStream.cs | 162 + .../Uploaders/Buffers/PooledBuffer.cs | 51 + .../Buffers/PooledBufferAllocator.cs | 55 + .../Uploaders/ByteArrayContentWithProgress.cs | 41 +- .../Transfers/Uploaders/FilePart.cs | 30 +- .../Transfers/Uploaders/FileUploaderConfig.cs | 10 + .../Transfers/Uploaders/PartSizeCalculator.cs | 40 + .../Uploaders/ScalingFileUploader.cs | 32 +- .../Uploaders/ScalingPartUploader.cs | 337 +- .../Uploaders/StandardFileUploader.cs | 46 +- .../Uploaders/StreamContentWithProgress.cs | 86 +- .../Transfers/Uploaders/SyncUploaderBase.cs | 87 +- .../Transfers/Uploaders/UploaderBase.cs | 131 +- src/ShareFile.Api.Client/project.json | 101 - src/ShareFile.Api.Client/project.lock.json | 4251 ----------------- tools/NuGet/nuget.exe | Bin 1659904 -> 0 bytes tools/dnv.exe | Bin 49152 -> 0 bytes 392 files changed, 12216 insertions(+), 12645 deletions(-) delete mode 100644 ShareFile.Api.Client.sln delete mode 100644 Tests/ShareFile.Api.Client.Tests/ApiRequestTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/ClientHashAuthenticationTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/HmacSha256Provider.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Authentication/OAuth2/OAuth2AuthenticationHelperTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Authentication/WebAuthenticationHelperTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/BaseTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Converters/ODataConverterTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Extensions/BoolExtensionsTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Extensions/ContactExtensionsTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Extensions/ItemsEntityExtensionsTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Extensions/ODataObjectExtensionsTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Extensions/QueryExtensionTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Extensions/StringExtensionsTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Properties/AssemblyInfo.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Requests/ApiRequestTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Requests/Filters/BooleanFilterTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Requests/Filters/DateFilterTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Requests/Filters/SubstringFilterTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Requests/Providers/RequestProviderTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Requests/QueryTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/ShareFile.Api.Client.Tests.csproj delete mode 100644 Tests/ShareFile.Api.Client.Tests/Transfers/CompleteBytesTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Transfers/DownloaderTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Transfers/TransferBaseTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Transfers/UploaderTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Uploaders/CompleteBytesTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/Uploaders/UploaderTests.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/UserInfo.cs delete mode 100644 Tests/ShareFile.Api.Client.Tests/packages.config delete mode 100644 global.json create mode 100644 src/NuGetInfo.props delete mode 100644 src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net40.csproj delete mode 100644 src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net45.csproj delete mode 100644 src/ShareFile.Api.Client.Csproj/app.config delete mode 100644 src/ShareFile.Api.Client.Csproj/packages.config create mode 100644 src/ShareFile.Api.Client/Entities/AppsEntity.cs delete mode 100644 src/ShareFile.Api.Client/Entities/ConfigsEntity.cs create mode 100644 src/ShareFile.Api.Client/Entities/EncryptedEmailsEntity.cs create mode 100644 src/ShareFile.Api.Client/Entities/FavoritesEntity.cs delete mode 100644 src/ShareFile.Api.Client/Entities/IrmClassificationsEntity.cs create mode 100644 src/ShareFile.Api.Client/Entities/SamlMetadataEntity.cs create mode 100644 src/ShareFile.Api.Client/Entities/WebhookClientsEntity.cs create mode 100644 src/ShareFile.Api.Client/Entities/WebhookSubscriptionsEntity.cs create mode 100644 src/ShareFile.Api.Client/Entities/WorkflowsEntity.cs create mode 100644 src/ShareFile.Api.Client/Exceptions/ApiDownException.cs delete mode 100644 src/ShareFile.Api.Client/FileSystem/IPlatformFile.cs delete mode 100644 src/ShareFile.Api.Client/FileSystem/PlatformFileInfo.cs delete mode 100644 src/ShareFile.Api.Client/FileSystem/PlatformFileStream.cs create mode 100644 src/ShareFile.Api.Client/Models/ActivationToken.cs create mode 100644 src/ShareFile.Api.Client/Models/ActivityReportFilter.cs create mode 100644 src/ShareFile.Api.Client/Models/Bandwidth.cs create mode 100644 src/ShareFile.Api.Client/Models/BaseAccountCreationParameters.cs create mode 100644 src/ShareFile.Api.Client/Models/BaseCspAccountParameters.cs create mode 100644 src/ShareFile.Api.Client/Models/BillingContact.cs create mode 100644 src/ShareFile.Api.Client/Models/Cancellation.cs create mode 100644 src/ShareFile.Api.Client/Models/ClientUpgradeWeb.cs create mode 100644 src/ShareFile.Api.Client/Models/CompanyContactInformation.cs create mode 100644 src/ShareFile.Api.Client/Models/ConnectedApp.cs create mode 100644 src/ShareFile.Api.Client/Models/CreateWorkflowParams.cs create mode 100644 src/ShareFile.Api.Client/Models/CspTenantAccountParameters.cs create mode 100644 src/ShareFile.Api.Client/Models/CustomMessage.cs create mode 100644 src/ShareFile.Api.Client/Models/CustomWorkflowBundleType.cs create mode 100644 src/ShareFile.Api.Client/Models/DailyAvailability.cs rename src/ShareFile.Api.Client/Models/{LockType.cs => DistributionMethod.cs} (67%) create mode 100644 src/ShareFile.Api.Client/Models/EmailAddress.cs create mode 100644 src/ShareFile.Api.Client/Models/EmailSupport.cs create mode 100644 src/ShareFile.Api.Client/Models/EncryptedEmail.cs create mode 100644 src/ShareFile.Api.Client/Models/EncryptedEmailCreateParams.cs create mode 100644 src/ShareFile.Api.Client/Models/EncryptedEmailParams.cs create mode 100644 src/ShareFile.Api.Client/Models/EncryptedEmailRecipient.cs create mode 100644 src/ShareFile.Api.Client/Models/EncryptedEmailReplyParams.cs create mode 100644 src/ShareFile.Api.Client/Models/EncryptedEmailSendParams.cs create mode 100644 src/ShareFile.Api.Client/Models/Favorite.cs create mode 100644 src/ShareFile.Api.Client/Models/FileAndFolderSettingOptions.cs create mode 100644 src/ShareFile.Api.Client/Models/ForbiddenOAuthClientNameWords.cs create mode 100644 src/ShareFile.Api.Client/Models/ItemOperations.cs delete mode 100644 src/ShareFile.Api.Client/Models/Notification.cs create mode 100644 src/ShareFile.Api.Client/Models/PhoneSupport.cs create mode 100644 src/ShareFile.Api.Client/Models/ReportFilter.cs create mode 100644 src/ShareFile.Api.Client/Models/RequestedPlan.cs create mode 100644 src/ShareFile.Api.Client/Models/ResetPasswordRequest.cs create mode 100644 src/ShareFile.Api.Client/Models/SentNotification.cs create mode 100644 src/ShareFile.Api.Client/Models/StorageCenterUrls.cs create mode 100644 src/ShareFile.Api.Client/Models/SubdomainAvailabilityResult.cs create mode 100644 src/ShareFile.Api.Client/Models/SubscribedResourceEvent.cs create mode 100644 src/ShareFile.Api.Client/Models/SubscriptionContext.cs create mode 100644 src/ShareFile.Api.Client/Models/Support.cs create mode 100644 src/ShareFile.Api.Client/Models/SupportFeedback.cs create mode 100644 src/ShareFile.Api.Client/Models/SupportMethod.cs create mode 100644 src/ShareFile.Api.Client/Models/TenantAccountCreationParameters.cs create mode 100644 src/ShareFile.Api.Client/Models/TwoFactorAuthApp.cs create mode 100644 src/ShareFile.Api.Client/Models/TwoFactorAuthPasscodeType.cs create mode 100644 src/ShareFile.Api.Client/Models/UserBulkDowngradeRequest.cs create mode 100644 src/ShareFile.Api.Client/Models/UserBulkOperationRequest.cs create mode 100644 src/ShareFile.Api.Client/Models/UserSummaryReportFilter.cs create mode 100644 src/ShareFile.Api.Client/Models/WebhookCapabilities.cs create mode 100644 src/ShareFile.Api.Client/Models/WebhookClient.cs create mode 100644 src/ShareFile.Api.Client/Models/WebhookSignatureKeys.cs create mode 100644 src/ShareFile.Api.Client/Models/WebhookSubscription.cs create mode 100644 src/ShareFile.Api.Client/Models/WebhookSupportedContext.cs create mode 100644 src/ShareFile.Api.Client/Models/WebhookSupportedEvents.cs create mode 100644 src/ShareFile.Api.Client/Models/Workflow.cs create mode 100644 src/ShareFile.Api.Client/Models/WorkflowParticipant.cs create mode 100644 src/ShareFile.Api.Client/Models/WorkflowRole.cs create mode 100644 src/ShareFile.Api.Client/Models/WorkflowStatus.cs create mode 100644 src/ShareFile.Api.Client/Models/WorkflowType.cs create mode 100644 src/ShareFile.Api.Client/NotNullAttribute.cs create mode 100644 src/ShareFile.Api.Client/Primitives/ShareFileId.cs create mode 100644 src/ShareFile.Api.Client/Requests/QueryMetadata.cs create mode 100644 src/ShareFile.Api.Client/ShareFile.Api.Client.csproj delete mode 100644 src/ShareFile.Api.Client/ShareFile.Api.Client.xproj create mode 100644 src/ShareFile.Api.Client/Transfers/Downloaders/AsyncDownloaderBase.cs create mode 100644 src/ShareFile.Api.Client/Transfers/Downloaders/AsyncMemoryMappedFileDownloader.cs create mode 100644 src/ShareFile.Api.Client/Transfers/Downloaders/ExpectedLengthStream.cs create mode 100644 src/ShareFile.Api.Client/Transfers/ProgressStream.cs create mode 100644 src/ShareFile.Api.Client/Transfers/StreamWrapper.cs create mode 100644 src/ShareFile.Api.Client/Transfers/TransferProgressReporter.cs create mode 100644 src/ShareFile.Api.Client/Transfers/Uploaders/AsyncMemoryMappedFileUploader.cs create mode 100644 src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/NoncontiguousMemoryStream.cs create mode 100644 src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBuffer.cs create mode 100644 src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBufferAllocator.cs create mode 100644 src/ShareFile.Api.Client/Transfers/Uploaders/PartSizeCalculator.cs delete mode 100644 src/ShareFile.Api.Client/project.json delete mode 100644 src/ShareFile.Api.Client/project.lock.json delete mode 100644 tools/NuGet/nuget.exe delete mode 100644 tools/dnv.exe diff --git a/.gitattributes b/.gitattributes index 412eeda..5896c16 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,22 +1,63 @@ -# Auto detect text files and perform LF normalization +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### * text=auto -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index 4ead766..339fb7a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,38 +1,3 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. @@ -49,6 +14,11 @@ x64/ build/ [Bb]in/ [Oo]bj/ +.fake/ +artifacts/ + +# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets +!packages/*/build/ # MSTest test Results [Tt]est[Rr]esult*/ @@ -77,6 +47,7 @@ build/ *.pidb *.log *.scc +.vs/ # Visual C++ cache files ipch/ @@ -126,11 +97,10 @@ publish/ # Publish Web Output *.Publish.xml -*.pubxml # NuGet Packages Directory ## TODO: If you have NuGet Package Restore enabled, uncomment the next line -packages/ +#packages/ # Windows Azure Build Output csx @@ -140,6 +110,7 @@ csx AppPackages/ # Others +.cov/ sql/ *.Cache ClientBin/ @@ -165,9 +136,15 @@ UpgradeLog*.htm App_Data/*.mdf App_Data/*.ldf -############# -## Windows detritus -############# + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= # Windows image file caches Thumbs.db @@ -179,37 +156,13 @@ Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ -# Mac crap +# Mac desktop service store files .DS_Store +Core/packages/ +packages/ +packaging/* - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist/ -build/ -eggs/ -parts/ -var/ -sdist/ -develop-eggs/ -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg +coverage/ +coverage/* +TestResult.xml +**/project.lock.json diff --git a/README.md b/README.md index eab7f62..47871e5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ All code is licensed under the [MIT License](https://github.com/citrix/ShareFile-PowerShell/blob/master/ShareFileSnapIn/LICENSE.txt). ## Tooling requirements ## -* Building `ShareFile.Api.Client.DotNet.sln` requires Visual Studio 2015 Update 2 with .NET Core tooling. +* Building `ShareFile.Api.Client.DotNet.sln` requires Visual Studio 2017 with .NET Core tooling. ## Definitions ## diff --git a/ShareFile.Api.Client.DotNet.sln b/ShareFile.Api.Client.DotNet.sln index c9d3219..edf4947 100644 --- a/ShareFile.Api.Client.DotNet.sln +++ b/ShareFile.Api.Client.DotNet.sln @@ -1,15 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2005 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ShareFile.Api.Client", "src\ShareFile.Api.Client\ShareFile.Api.Client.xproj", "{5B517B21-7981-4DF2-8989-EBE79A850416}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{746B7023-5672-4B85-B592-287F87ADE6D3}" - ProjectSection(SolutionItems) = preProject - src\ShareFile.Api.Client\global.json = src\ShareFile.Api.Client\global.json - src\ShareFile.Api.Client.Internal\global.json = src\ShareFile.Api.Client.Internal\global.json - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShareFile.Api.Client", "src\ShareFile.Api.Client\ShareFile.Api.Client.csproj", "{5B517B21-7981-4DF2-8989-EBE79A850416}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,20 +15,11 @@ Global {5B517B21-7981-4DF2-8989-EBE79A850416}.Debug|Any CPU.Build.0 = Debug|Any CPU {5B517B21-7981-4DF2-8989-EBE79A850416}.Release|Any CPU.ActiveCfg = Release|Any CPU {5B517B21-7981-4DF2-8989-EBE79A850416}.Release|Any CPU.Build.0 = Release|Any CPU - {01DED15B-3BEA-4322-B202-E07380797CA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {01DED15B-3BEA-4322-B202-E07380797CA4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {01DED15B-3BEA-4322-B202-E07380797CA4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {01DED15B-3BEA-4322-B202-E07380797CA4}.Release|Any CPU.Build.0 = Release|Any CPU - {6C3BFAD2-8885-4959-A580-DDB3494E359C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C3BFAD2-8885-4959-A580-DDB3494E359C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C3BFAD2-8885-4959-A580-DDB3494E359C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C3BFAD2-8885-4959-A580-DDB3494E359C}.Release|Any CPU.Build.0 = Release|Any CPU - {0EAA8F56-DE6E-4BBA-AB9D-76086D19DAD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0EAA8F56-DE6E-4BBA-AB9D-76086D19DAD7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0EAA8F56-DE6E-4BBA-AB9D-76086D19DAD7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0EAA8F56-DE6E-4BBA-AB9D-76086D19DAD7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {95B84D3C-EDB7-4E23-AB87-FB8DD03E558F} + EndGlobalSection EndGlobal diff --git a/ShareFile.Api.Client.sln b/ShareFile.Api.Client.sln deleted file mode 100644 index 7c782cd..0000000 --- a/ShareFile.Api.Client.sln +++ /dev/null @@ -1,76 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShareFile.Api.Client.Tests", "tests\ShareFile.Api.Client.Tests\ShareFile.Api.Client.Tests.csproj", "{C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShareFile.Api.Client-net45", "src\ShareFile.Api.Client.Csproj\ShareFile.Api.Client-net45.csproj", "{5ADB6950-D609-4847-A842-0BDD6CDBBFB9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShareFile.Api.Client-net40", "src\ShareFile.Api.Client.Csproj\ShareFile.Api.Client-net40.csproj", "{ADF05D45-5BED-42C0-8801-4995A57B9896}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM = Debug|ARM - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM = Release|ARM - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|ARM.ActiveCfg = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|ARM.Build.0 = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|x64.ActiveCfg = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|x64.Build.0 = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|x86.ActiveCfg = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Debug|x86.Build.0 = Debug|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|Any CPU.Build.0 = Release|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|ARM.ActiveCfg = Release|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|ARM.Build.0 = Release|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|x64.ActiveCfg = Release|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|x64.Build.0 = Release|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|x86.ActiveCfg = Release|Any CPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88}.Release|x86.Build.0 = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|ARM.ActiveCfg = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|ARM.Build.0 = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|x64.ActiveCfg = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|x64.Build.0 = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|x86.ActiveCfg = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Debug|x86.Build.0 = Debug|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|Any CPU.Build.0 = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|ARM.ActiveCfg = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|ARM.Build.0 = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|x64.ActiveCfg = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|x64.Build.0 = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|x86.ActiveCfg = Release|Any CPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9}.Release|x86.Build.0 = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|ARM.ActiveCfg = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|ARM.Build.0 = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|x64.ActiveCfg = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|x64.Build.0 = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|x86.ActiveCfg = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Debug|x86.Build.0 = Debug|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|Any CPU.Build.0 = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|ARM.ActiveCfg = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|ARM.Build.0 = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|x64.ActiveCfg = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|x64.Build.0 = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|x86.ActiveCfg = Release|Any CPU - {ADF05D45-5BED-42C0-8801-4995A57B9896}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Tests/ShareFile.Api.Client.Tests/ApiRequestTests.cs b/Tests/ShareFile.Api.Client.Tests/ApiRequestTests.cs deleted file mode 100644 index 22a9d70..0000000 --- a/Tests/ShareFile.Api.Client.Tests/ApiRequestTests.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Linq; - -using NUnit.Framework; -using ShareFile.Api.Client.Enums; -using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.Requests; - -namespace ShareFile.Api.Client.Core.Tests -{ - [TestFixture] - public class ApiRequestTests : BaseTests - { - [TestCase("key=value")] - public void UriWithQueryString(string kvp) - { - var shareFileClient = GetShareFileClient(); - var initialUri = shareFileClient.Items.GetAlias(ItemAlias.Root); - var uriWithQueryString = new Uri(initialUri + "?" + kvp); - var query = shareFileClient.Items.Get(uriWithQueryString) - .Expand("Children") - .Select("*") - .QueryString("anotherKey", "anotherValue"); - - var request = ApiRequest.FromQuery(query); - var uri = request.GetComposedUri(); - - Assert.IsTrue(uri.Query.Contains(kvp)); - } - - [TestCase("%24key=value")] - public void UriWithEncodedQueryString(string kvp) - { - var shareFileClient = GetShareFileClient(); - var initialUri = shareFileClient.Items.GetAlias(ItemAlias.Root); - var uriWithQueryString = new Uri(initialUri + "?" + kvp); - - var query = shareFileClient.Items.Get(uriWithQueryString) - .Expand("Children") - .Select("*") - .QueryString("anotherKey", "anotherValue"); - - var request = ApiRequest.FromQuery(query); - var uri = request.GetComposedUri(); - - Assert.IsTrue(uri.Query.Contains(kvp)); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/ClientHashAuthenticationTests.cs b/Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/ClientHashAuthenticationTests.cs deleted file mode 100644 index 51300c9..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/ClientHashAuthenticationTests.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Text; -using System.Linq; -using System.Net.Http; -using ShareFile.Api.Models; -using ShareFile.Api.Client.Security; -using ShareFile.Api.Client.Security.Cryptography; -using Newtonsoft.Json; -using NUnit.Framework; -using FluentAssertions; - -namespace ShareFile.Api.Client.Core.Tests.Authentication.ClientHash -{ - [TestFixture] - public class ClientHashAuthenticationTests: BaseTests - { - protected ClientHashAuthentication ClientHashAuthentication; - protected InternalShareFileClient SfClient; - protected UserInfo UserInfo; - protected HttpRequestMessage TestRequest; - protected string TestRequestBody; - - - [TestFixtureSetUp] - public void SetUp() - { - UserInfo = GetUserInfo(); - SfClient = new InternalShareFileClient(string.Format("{0}{1}.{2}{3}","https://", UserInfo.Subdomain, UserInfo.Domain, "/sf/v3/")); - HmacSha256Provider.Register(); - ClientHashAuthentication = new ClientHashAuthentication(SfClient, UserInfo.ClientId, UserInfo.ClientSecret); - SfClient.CustomAuthentication = ClientHashAuthentication; - - var url = UserInfo.GetBaseUri() + "/sf/v3/Items"; - TestRequestBody = JsonConvert.SerializeObject(new Item { Id = GetId()}); - TestRequest = GetTestRequest(url, TestRequestBody); - } - - [Test] - public void VerifyHashedRequestHeader_Authorization() - { - var hashedRequest = ClientHashAuthentication.SignBody(TestRequestBody, TestRequest); - - var clientHashHeader = hashedRequest.Headers.Authorization.ToString(); - clientHashHeader.Should().Be("SFClientHash " + Hash(TestRequest.RequestUri.ToString(), TestRequestBody, UserInfo.ClientSecret)); - } - - [Test] - public void VerifyHashedRequesHeader_ClientId() - { - var hashedRequest = ClientHashAuthentication.SignBody(TestRequestBody, TestRequest); - - var clientIdHeader = hashedRequest.Headers.GetValues("X-SFAPI-ClientId").First(); - clientIdHeader.Should().Be(UserInfo.ClientId); - } - - [Test] - public void VerifyHashedRequesHeader_UserId() - { - var userId = GetId(); - ClientHashAuthentication.UserId = userId; - - var hashedRequest = ClientHashAuthentication.SignBody(TestRequestBody, TestRequest); - - var clientIdHeader = hashedRequest.Headers.GetValues("X-SFAPI-UserId").First(); - clientIdHeader.Should().Be(userId); - } - - [Test] - public void VerifyHashAuthentication() - { - var uri = SfClient.OAuthClients.GetEntityUriFromId(UserInfo.ClientId); - var response = SfClient.OAuthClients.Get(uri).Execute(); - response.Should().BeOfType(); - } - - private HttpRequestMessage GetTestRequest(string url, string body) - { - var request = new HttpRequestMessage(HttpMethod.Get, url); - request.Content = new StringContent(body); - - return request; - } - - /// - /// Hash function used by ShareFileAuthenticationAttribute.cs to hash a request - /// - private static string Hash(string url, string body, string secret) - { - var sb = new StringBuilder(); - sb.Append(new Uri(url).PathAndQuery); - if (body != null) sb.Append(body); - var clientSecret = Encoding.ASCII.GetBytes(secret); - System.Security.Cryptography.HMACSHA256 hmac = new System.Security.Cryptography.HMACSHA256(clientSecret); - byte[] hash = hmac.ComputeHash(new UTF8Encoding().GetBytes(sb.ToString())); - - return BitConverter.ToString(hash).Replace("-", "").ToLower(); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/HmacSha256Provider.cs b/Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/HmacSha256Provider.cs deleted file mode 100644 index f8723d2..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Authentication/ClientHash/HmacSha256Provider.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Security.Cryptography; -using ShareFile.Api.Client.Security.Cryptography; - -namespace ShareFile.Api.Client.Core.Tests.Authentication.ClientHash -{ - /// - /// HmacSha256Provider copied from the ShareFile.Api.Client.Net45 project - /// - public class HmacSha256Provider : IHmacSha256Provider - { - static HmacSha256Provider() - { - Register(); - } - - public static void Register() - { - HmacSha256ProviderFactory.Register(bytes => new HmacSha256Provider - { - Key = bytes - }); - } - - public byte[] Key { get; set; } - public byte[] ComputeHash(byte[] buffer) - { - var hmac = new HMACSHA256(Key); - - return hmac.ComputeHash(buffer); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Authentication/OAuth2/OAuth2AuthenticationHelperTests.cs b/Tests/ShareFile.Api.Client.Tests/Authentication/OAuth2/OAuth2AuthenticationHelperTests.cs deleted file mode 100644 index dfa2761..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Authentication/OAuth2/OAuth2AuthenticationHelperTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using FluentAssertions; -using NUnit.Framework; -using ShareFile.Api.Client.Security.Authentication.OAuth2; - -namespace ShareFile.Api.Client.Core.Tests.Authentication.OAuth2 -{ - [TestFixture] - public class OAuth2AuthenticationHelperTests : WebAuthenticationHelperTests - { - [TestCase(true, "code", "state", typeof(OAuthAuthorizationCode), Result = true, TestName = "GetAuthorizationCode_Success")] - [TestCase(false, "code", "state", typeof(OAuthAuthorizationCode), Result = false, TestName = "GetAuthorizationCode_Fail")] - [TestCase(true, "access_token", "refresh_token", typeof(OAuthToken), Result = true, TestName = "GetOAuthToken_Success")] - [TestCase(false, "access_token", "refresh_token", typeof(OAuthToken), Result = false, TestName = "GetOAuthToken_Fail")] - [TestCase(true, "error", "error_description", typeof(OAuthError), Result = true, TestName = "GetOAuthError_Success")] - [TestCase(false, "error", "error_description", typeof(OAuthError), Result = false, TestName = "GetOAuthError_Fail")] - [TestCase(true, "random1", "random2", typeof(OAuthResponseBase), Result = true, TestName = "OAuthResponseBase_Success")] - [TestCase(false, "random1", "random2", typeof(OAuthResponseBase), Result = false, TestName = "OAuthResponseBase_Fail")] - public bool GetOAuthResponse(bool includeCompleteUri, string key1, string key2, Type expectedType) - { - //Arrange - var oauth2AuthHelper = new OAuth2AuthenticationHelper(GetOAuthCompleteUri()); - var list = GetNavigationUris(); - - var dictionary = new Dictionary(); - dictionary.Add(key1, key1 + 123); - dictionary.Add(key2, key2 + 123); - - if (includeCompleteUri) - { - list.Add(GetOAuthCompleteUriWithParameters(dictionary)); - } - - //Act - bool found = false; - IOAuthResponse response = null; - - foreach (var uri in list) - { - if (oauth2AuthHelper.IsComplete(uri, out response)) - { - found = true; - break; - } - } - - return found && (response != null && response.GetType() == expectedType); - } - - [Test] - public void OAuthResponseBase_PropertiesMapped() - { - //Arrange - var oauth2AuthHelper = new OAuth2AuthenticationHelper(GetOAuthCompleteUri()); - var list = GetNavigationUris(1); - - var dictionary = new Dictionary(); - dictionary.Add("appcp", "sharefile.com"); - dictionary.Add("apicp", "sf-api.com"); - dictionary.Add("randomKey", "randomValue"); - - list.Add(GetOAuthCompleteUriWithParameters(dictionary)); - - //Act - bool found = false; - IOAuthResponse response = null; - - foreach (var uri in list) - { - if (oauth2AuthHelper.IsComplete(uri, out response)) - { - found = true; - break; - } - } - - response.GetType().Should().Be(typeof (OAuthResponseBase)); - response.Properties.Should().NotBeNull(); - var oauthResponseBase = response as OAuthResponseBase; - oauthResponseBase.ApiControlPlane.Should().Be("sf-api.com"); - oauthResponseBase.ApplicationControlPlane.Should().Be("sharefile.com"); - oauthResponseBase.Properties.Should().ContainKey("randomKey"); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Authentication/WebAuthenticationHelperTests.cs b/Tests/ShareFile.Api.Client.Tests/Authentication/WebAuthenticationHelperTests.cs deleted file mode 100644 index b88bc81..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Authentication/WebAuthenticationHelperTests.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FluentAssertions; -using NUnit.Framework; -using ShareFile.Api.Client.Security.Authentication; -using ShareFile.Api.Client.Security.Authentication.OAuth2; - -namespace ShareFile.Api.Client.Core.Tests.Authentication -{ - [TestFixture] - public class WebAuthenticationHelperTests - { - protected Uri GetOAuthCompleteUri() - { - return new Uri("https://secure.sharefile.com/oauth/oauthcomplete.aspx"); - } - - protected Uri GetOAuthCompleteUriWithParameters(Dictionary dictionary) - { - var baseOAuthComplete = GetOAuthCompleteUri(); - - var sb = new StringBuilder(baseOAuthComplete + "?"); - foreach (var kvp in dictionary) - { - sb.AppendFormat("{0}={1}&", kvp.Key, kvp.Value); - } - return new Uri(sb.ToString().TrimEnd(new char[] { '&' })); - } - - protected List GetNavigationUris(int count = 3) - { - var list = new List(); - - for (int i = 0; i < count; i++) - { - list.Add(new Uri(string.Format("https://secure.sharefile.com/oauth/oauthtest{0}.aspx", i))); - } - - return list; - } - - [Test] - public void GetWebAuthenticationResponse_Success() - { - //Arrange - var authHelper = new WebAuthenticationHelper(GetOAuthCompleteUri()); - var list = GetNavigationUris(); - - var dictionary = new Dictionary(); - dictionary.Add("test", "test123"); - dictionary.Add("test2", "test2123"); - - list.Add(GetOAuthCompleteUriWithParameters(dictionary)); - - //Act - bool found = false; - Dictionary response = null; - - foreach (var uri in list) - { - if (authHelper.IsComplete(uri, out response)) - { - found = true; - break; - } - } - - found.Should().BeTrue(); - response.Should().ContainKey("test"); - response.Should().ContainKey("test2"); - } - - [Test] - public void GetWebAuthenticationResponse_Fail() - { - //Arrange - var authHelper = new WebAuthenticationHelper(GetOAuthCompleteUri()); - var list = GetNavigationUris(1); - - var dictionary = new Dictionary(); - dictionary.Add("test", "test123"); - dictionary.Add("test2", "test2123"); - - //Act - bool found = false; - Dictionary response = null; - - foreach (var uri in list) - { - if (authHelper.IsComplete(uri, out response)) - { - found = true; - break; - } - } - - found.Should().BeFalse(); - (response == null).Should().BeTrue(); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/BaseTests.cs b/Tests/ShareFile.Api.Client.Tests/BaseTests.cs deleted file mode 100644 index f1a6fbb..0000000 --- a/Tests/ShareFile.Api.Client.Tests/BaseTests.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.IO; -using System.Net; -using System.Net.Http; -using System.Text; -using NUnit.Framework; -using FakeItEasy; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using ShareFile.Api.Client.Converters; -using ShareFile.Api.Client.Logging; -using ShareFile.Api.Client.Requests.Executors; - -namespace ShareFile.Api.Client.Core.Tests -{ - public abstract class BaseTests - { - protected const string BaseUriString = "https://release.sf-api.com/sf/v3/"; - protected IShareFileClient GetShareFileClient(bool registerFakeExecutors = false) - { - var config = Configuration.Default(); - var logger = new DefaultLoggingProvider - { - LogLevel = LogLevel.Debug | LogLevel.Error | LogLevel.Fatal | LogLevel.Info | LogLevel.Trace | - LogLevel.Warn - }; - - config.Logger = logger; - - var client = new ShareFileClient(BaseUriString, Configuration.Default()); - - if (registerFakeExecutors) - { - RequestExecutorFactory.RegisterAsyncRequestProvider(A.Fake()); - RequestExecutorFactory.RegisterSyncRequestProvider(A.Fake()); - } - - return client; - } - - protected UserInfo GetUserInfo() - { - try - { - using (var fileStream = System.IO.File.OpenRead("TestConfig.json")) - using (var streamReader = new StreamReader(fileStream)) - { - var info = streamReader.ReadToEnd(); - return JsonConvert.DeserializeObject(info); - } - } - catch (Exception exception) - { - Assert.Fail(string.Format("No UserInfo found in TestConfig.json. Exception: {0}", exception)); - throw; - } - } - - protected JsonSerializer GetSerializer() - { - return new JsonSerializer - { - ObjectCreationHandling = ObjectCreationHandling.Replace, - MissingMemberHandling = MissingMemberHandling.Ignore, - NullValueHandling = NullValueHandling.Ignore, - DateTimeZoneHandling = DateTimeZoneHandling.Local, - Converters = { new ODataConverter(), new StringEnumConverter(), new SafeEnumConverter() } - }; - } - - private Random Random = new Random(); - protected string RandomString(int length) - { - var builder = new StringBuilder(); - for (var i = 0; i < length; i++) - { - var ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * Random.NextDouble() + 65))); - builder.Append(ch); - } - return builder.ToString(); - } - - protected string GetId(int length = 36) - { - if (length > 36) length = 36; - return Guid.NewGuid().ToString().Substring(0, length); - } - - protected HttpResponseMessage GenerateODataObjectResponse(HttpRequestMessage requestMessage, string response) - { - var responseMessage = new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(response, Encoding.UTF8, "application/json"), - RequestMessage = requestMessage - }; - - return responseMessage; - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Converters/ODataConverterTests.cs b/Tests/ShareFile.Api.Client.Tests/Converters/ODataConverterTests.cs deleted file mode 100644 index b3ef924..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Converters/ODataConverterTests.cs +++ /dev/null @@ -1,274 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using FluentAssertions; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using NUnit.Framework; -using ShareFile.Api.Client.Converters; -using ShareFile.Api.Models; -using File = ShareFile.Api.Models.File; - -namespace ShareFile.Api.Client.Core.Tests.Converters -{ - [TestFixture] - public class ODataConverterTests : BaseTests - { - protected Folder GetFolder() - { - var folder = new Folder - { - Children = new List() - { - new File - { - FileName = "File 1.txt", - } - }, - FileName = "Folder 1" - }; - - return folder; - } - - [Test] - public void CreateFolderFromItem() - { - var folder = GetFolder(); - - folder.MetadataUrl = - "https://onprem.sharefile.local/sf/v3/$metadata#Items/ShareFile.Api.Models.Folder@Element"; - folder.Children.First().MetadataUrl = - "https://onprem.sharefile.local/sf/v3/$metadata#Items/ShareFile.Api.Models.File@Element"; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, folder); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize(jsonReader) as Item; - item.Should().NotBeNull(); - item.GetType().Should().Be(typeof (Folder)); - } - - [Test] - public void CreateFolder_OData_Type() - { - var folder = GetFolder(); - folder.__type = "ShareFile.Api.Models.Folder"; - folder.Children.First().__type = - "ShareFile.Api.Models.File"; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, folder); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize(jsonReader) as Item; - item.Should().NotBeNull(); - item.GetType().Should().Be(typeof(Folder)); - (item as Folder).Children.FirstOrDefault().GetType().Should().Be(typeof(File)); - } - - [Test] - public void CreateFolder_MalformedMetadata_ODataTypeFallback() - { - var folder = GetFolder(); - folder.__type = "ShareFile.Api.Models.Folder"; - folder.MetadataUrl = - "https://"; - - folder.Children.First().__type = - "ShareFile.Api.Models.File"; - folder.Children.First().MetadataUrl = - "https://"; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, folder); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize(jsonReader) as Item; - item.Should().NotBeNull(); - item.GetType().Should().Be(typeof(Folder)); - (item as Folder).Children.FirstOrDefault().GetType().Should().Be(typeof(File)); - } - - [Test] - public void CreateFolder_Entity_Cast() - { - var folder = GetFolder(); - folder.MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#Items/Folder"; - folder.Children.First().MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#Items/File"; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, folder); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize(jsonReader) as Item; - item.Should().NotBeNull(); - item.GetType().Should().Be(typeof(Folder)); - } - - [Test] - public void CreateAccessControlDomains_Entity_Garbage_Cast() - { - var acd = new AccessControlDomains - { - MetadataUrl = - "https://labs.sharefile.com/sf/v3/$metadata#Accounts/LoginAccessControlDomains/ShareFile.Api.Models.AccessControlDomains@Element" - }; - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, acd); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize(jsonReader); - item.Should().NotBeNull(); - item.GetType().Should().Be(typeof(AccessControlDomains)); - } - - [Test] - public void CreateFolder_Cast() - { - var folder = GetFolder(); - folder.MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.Folder"; - folder.Children.First().MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.File"; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, folder); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize(jsonReader) as Item; - item.Should().NotBeNull(); - item.GetType().Should().Be(typeof(Folder)); - } - - [Test] - public void CreateFeed_Cast() - { - var feed = new ODataFeed(); - feed.Feed = new List() - { - GetFolder() - }; - (feed.Feed.First()).MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.Folder"; - ((feed.Feed.First() as Folder).Children.First()).MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.File"; - feed.MetadataUrl = "https://labs.sf-api.com/sf/v3/$metadata#Items"; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, feed); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize>(jsonReader); - item.Should().NotBeNull(); - item.Feed.First().GetType().Should().Be(typeof (Folder)); - } - - [Test] - public void CreateFeed_NoMetadata() - { - var feed = new ODataFeed(); - feed.Feed = new List() - { - GetFolder() - }; - (feed.Feed.First()).MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.Folder"; - ((feed.Feed.First() as Folder).Children.First()).MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.File"; - feed.MetadataUrl = ""; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, feed); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize>(jsonReader); - item.Should().NotBeNull(); - item.Feed.First().GetType().Should().Be(typeof(Folder)); - } - - [Test] - public void CreateFeed_String_NoMetadata() - { - var jsonReader = - new JsonTextReader( - new StringReader( - "{\"odata.metadata\":\"\",\"odata.count\":1,\"value\":[{\"Name\":\"Shared Documents\",\"FileName\":\"Shared Documents\",\"ProgenyEditDate\":\"0001-01-01T08:00:00Z\",\"Path\":\"/c0cAkAjf7GCKmrm1PbIkf5yHgyrl8dE12wVNBsmmpgID!KT5OQ5n70eFAYRRRz8NpZH6mhSv42fmH7edX3dFsQ__\",\"StreamID\":\"cnNOPm!0FGJcAYd4eAAdU1P31k3hyDHxcmiWfjjpRm4k76FyeXZ-lztHSQuKpj3YTwLS9Ne0Hr6zoQ5hn2kiBllhe0bISQsws-Z678hkXCk_\",\"odata.metadata\":\"https://szqatest2.sharefiletest.com/sp/v3/$metadata#Items/ShareFile.Api.Models.Folder@Element\",\"Id\":\"cnNOPm!0FGJcAYd4eAAdU1P31k3hyDHxcmiWfjjpRm4k76FyeXZ-lztHSQuKpj3YTwLS9Ne0Hr6zoQ5hn2kiBllhe0bISQsws-Z678hkXCk_\",\"url\":\"https://szqatest2.sharefiletest.com/sp/v3/Items(cnNOPm!0FGJcAYd4eAAdU1P31k3hyDHxcmiWfjjpRm4k76FyeXZ-lztHSQuKpj3YTwLS9Ne0Hr6zoQ5hn2kiBllhe0bISQsws-Z678hkXCk_)\"}]}")); - - var serializer = GetSerializer(); - var item = serializer.Deserialize>(jsonReader); - item.Should().NotBeNull(); - item.Feed.First().GetType().Should().Be(typeof(Folder)); - } - - [Test] - public void ZoneServices_DeserializeFlags() - { - var jsonReader = - new JsonTextReader( - new StringReader( - "{\"odata.metadata\":\"\",\"odata.count\":1,\"value\":[{\"ZoneServices\":6,\"Version\":\"Fake Zone\",\"Secret\":\"Fake Zone Secret\",\"odata.metadata\":\"https://szqatest2.sharefiletest.com/sp/v3/$metadata#Zones/ShareFile.Api.Models.Zone@Element\",\"Id\":\"cnNOPm!0FGJcAYd4eAAdU1P31k3hyDHxcmiWfjjpRm4k76FyeXZ-lztHSQuKpj3YTwLS9Ne0Hr6zoQ5hn2kiBllhe0bISQsws-Z678hkXCk_\",\"url\":\"https://szqatest2.sharefiletest.com/sp/v3/Zone(cnNOPm!0FGJcAYd4eAAdU1P31k3hyDHxcmiWfjjpRm4k76FyeXZ-lztHSQuKpj3YTwLS9Ne0Hr6zoQ5hn2kiBllhe0bISQsws-Z678hkXCk_)\"}]}")); - - var serializer = GetSerializer(); - var zone = serializer.Deserialize>(jsonReader); - zone.Should().NotBeNull(); - zone.Feed.First().ZoneServices.Enum.Value.HasFlag(ZoneService.NetworkShareConnector).Should().BeTrue(); - zone.Feed.First().ZoneServices.Enum.Value.HasFlag(ZoneService.SharepointConnector).Should().BeTrue(); - } - - [Test] - public void VerifyTypeOverrideSupport() - { - var test = new ShareFileClient(BaseUriString); - test.RegisterType(); - - var folder = GetFolder(); - folder.MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.Folder"; - folder.Children.First().MetadataUrl = - "https://labs.sf-api.com/sf/v3/$metadata#ShareFile.Api.Models.File"; - - var serializer = GetSerializer(); - - StringWriter writer = new StringWriter(); - serializer.Serialize(writer, folder); - - var jsonReader = new JsonTextReader(new StringReader(writer.ToString())); - - var item = serializer.Deserialize(jsonReader); - item.GetType().Should().Be(typeof (FolderTestClass)); - } - - public class FolderTestClass : Folder - { - public string TestProp1 { get; set; } - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Extensions/BoolExtensionsTests.cs b/Tests/ShareFile.Api.Client.Tests/Extensions/BoolExtensionsTests.cs deleted file mode 100644 index 59fdb7f..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Extensions/BoolExtensionsTests.cs +++ /dev/null @@ -1,18 +0,0 @@ -using FluentAssertions; -using NUnit.Framework; -using ShareFile.Api.Client.Extensions; - -namespace ShareFile.Api.Client.Core.Tests.Extensions -{ - [TestFixture] - public class BoolExtensionsTests - { - [Test] - public void BoolExtensions_ToLowerCase() - { - bool trueBool = true; - - trueBool.ToLowerString().Should().Be("true"); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Extensions/ContactExtensionsTests.cs b/Tests/ShareFile.Api.Client.Tests/Extensions/ContactExtensionsTests.cs deleted file mode 100644 index 2204076..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Extensions/ContactExtensionsTests.cs +++ /dev/null @@ -1,19 +0,0 @@ -using NUnit.Framework; -using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Models; - -namespace ShareFile.Api.Client.Core.Tests.Extensions -{ - [TestFixture] - public class ContactExtensionsTests - { - [TestCase("g123456", Result = true, TestName = "ContactExtensions_IsDistributionGroup_Yes")] - [TestCase("a123456", Result = false, TestName = "ContactExtensions_IsDistributionGroup_No")] - public bool IsDistributionGroup(string id) - { - var contact = new Contact {Id = id}; - - return contact.IsDistributionGroup(); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Extensions/ItemsEntityExtensionsTests.cs b/Tests/ShareFile.Api.Client.Tests/Extensions/ItemsEntityExtensionsTests.cs deleted file mode 100644 index e9a713c..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Extensions/ItemsEntityExtensionsTests.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FluentAssertions; -using NUnit.Framework; -using ShareFile.Api.Client.Enums; -using ShareFile.Api.Client.Extensions; - -namespace ShareFile.Api.Client.Core.Tests.Extensions -{ - [TestFixture] - public class ItemsEntityExtensionsTests - { - [Test] - public void GetAliasWithItemAlias() - { - // Arrange - var alias = ItemAlias.Connectors; - - // Act - var sfClient = new ShareFileClient("https://secure.sf-api.com/sf/v3/"); - var uri = sfClient.Items.GetAlias(alias); - - // Assert - uri.ToString().Should().Be("https://secure.sf-api.com/sf/v3/Items(connectors)"); - } - - [TestCase(ItemAlias.SharepointConnectors, "c-sp", TestName = "GetAliasWithMappedAlias_SharePoint")] - [TestCase(ItemAlias.NetworkShareConnectors, "c-cifs", TestName = "GetAliasWithMappedAlias_NetworkShares")] - public void GetAliasWithMappedAlias(ItemAlias alias, string expectedValue) - { - // Act - var sfClient = new ShareFileClient("https://secure.sf-api.com/sf/v3/"); - var uri = sfClient.Items.GetAlias(alias); - - // Assert - uri.ToString().Should().Be("https://secure.sf-api.com/sf/v3/Items(" + expectedValue + ")"); - } - - [Test] - public void GetAliasWithItemId() - { - // Arrange - var alias = "randomId"; - - // Act - var sfClient = new ShareFileClient("https://secure.sf-api.com/sf/v3/"); - var uri = sfClient.Items.GetAlias(alias); - - // Assert - uri.ToString().Should().Be("https://secure.sf-api.com/sf/v3/Items(randomId)"); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Extensions/ODataObjectExtensionsTests.cs b/Tests/ShareFile.Api.Client.Tests/Extensions/ODataObjectExtensionsTests.cs deleted file mode 100644 index 0fedde8..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Extensions/ODataObjectExtensionsTests.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using System.Collections.Generic; -using FluentAssertions; -using NUnit.Framework; -using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Models; - -namespace ShareFile.Api.Client.Core.Tests.Extensions -{ - [TestFixture] - public class ODataObjectExtensionsTests : BaseTests - { - [Test] - public void GetObjectUri_WithStream() - { - // Arrange - var folderId = GetId(); - var folderStreamId = "st" + GetId().Substring(2); - var folder = new Folder - { - Id = folderId, - url = new Uri(BaseUriString + "Items(" + folderId + ")"), - StreamID = folderStreamId - }; - - // Act - var streamObjectUri = folder.GetObjectUri(true); - - // Assert - streamObjectUri.ToString().Should().Be(BaseUriString + "Items(" + folderStreamId + ")"); - } - - [Test] - public void GetObjectUri_WithNullStream() - { - // Arrange - var folderId = GetId(); - var folder = new Folder - { - Id = folderId, - url = new Uri(BaseUriString + "Items(" + folderId + ")") - }; - - // Act - var streamObjectUri = folder.GetObjectUri(true); - - // Assert - streamObjectUri.ToString().Should().Be(BaseUriString + "Items(" + folderId + ")"); - } - - [Test] - public void GetObjectUri_WithId() - { - // Arrange - var folderId = GetId(); - var folder = new Folder - { - Id = folderId, - url = new Uri(BaseUriString + "Items(" + folderId + ")"), - }; - - // Act - var streamObjectUri = folder.GetObjectUri(); - - // Assert - streamObjectUri.ToString().Should().Be(BaseUriString + "Items(" + folderId + ")"); - } - - [TestCase("Items(id)", "123", "Items(id)?root=123")] - [TestCase("Items(id)?test=123", "123", "Items(id)?test=123&root=123")] - [TestCase("Items(id)?test=123&", "123", "Items(id)?test=123&root=123")] - [TestCase("Items(id)?root=123", "123", "Items(id)?root=123")] - [TestCase("Items(id)", null, "Items(id)")] - [TestCase("Items(id)?test=123", null, "Items(id)?test=123")] - [TestCase("Items(id)?root=123", null, "Items(id)?root=123")] - public void RedirectionUri(string uriPath, string rootParameter, string expectedUri) - { - var redirection = new Redirection { Uri = new Uri(BaseUriString + uriPath), Root = rootParameter }; - - var uri = redirection.GetCalculatedUri(); - - uri.ToString().Should().Be(BaseUriString + expectedUri); - } - - public void SupportsUploadWithRequestParams_Null_False() - { - // Arrange - IEnumerable capabilities = null; - - // Act - var res = capabilities.SupportsUploadWithRequestParams(); - - // Assert - res.Should().BeFalse(); - } - - public void SupportsUploadWithRequestParams_Empty_False() - { - // Arrange - IEnumerable capabilities = new List(); - - // Act - var res = capabilities.SupportsUploadWithRequestParams(); - - // Assert - res.Should().BeFalse(); - } - - public void SupportsUploadWithRequestParams_False() - { - // Arrange - IEnumerable capabilities = new List - { - new Capability { Name = CapabilityName.ItemDescription }, - new Capability { Name = CapabilityName.Search } - }; - - // Act - var res = capabilities.SupportsUploadWithRequestParams(); - - // Assert - res.Should().BeFalse(); - } - - public void SupportsUploadWithRequestParams_True() - { - // Arrange - IEnumerable capabilities = new List - { - new Capability { Name = CapabilityName.ItemDescription }, - new Capability { Name = CapabilityName.Search }, - new Capability { Name = CapabilityName.UploadWithRequestParams } - }; - - // Act - var res = capabilities.SupportsUploadWithRequestParams(); - - // Assert - res.Should().BeFalse(); - } - - public void SupportsDownloadWithSpecificaton_Null_False() - { - // Arrange - IEnumerable capabilities = null; - - // Act - var res = capabilities.SupportsDownloadWithSpecificaton(); - - // Assert - res.Should().BeFalse(); - } - - public void SupportsDownloadWithSpecificaton_Empty_False() - { - // Arrange - IEnumerable capabilities = new List(); - - // Act - var res = capabilities.SupportsDownloadWithSpecificaton(); - - // Assert - res.Should().BeFalse(); - } - - public void SupportsDownloadWithSpecificaton_False() - { - // Arrange - IEnumerable capabilities = new List - { - new Capability { Name = CapabilityName.ItemDescription }, - new Capability { Name = CapabilityName.Search } - }; - - // Act - var res = capabilities.SupportsDownloadWithSpecificaton(); - - // Assert - res.Should().BeFalse(); - } - - public void SupportsDownloadWithSpecificaton_True() - { - // Arrange - IEnumerable capabilities = new List - { - new Capability { Name = CapabilityName.ItemDescription }, - new Capability { Name = CapabilityName.Search }, - new Capability { Name = CapabilityName.DownloadSpecification } - }; - - // Act - var res = capabilities.SupportsDownloadWithSpecificaton(); - - // Assert - res.Should().BeFalse(); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Extensions/QueryExtensionTests.cs b/Tests/ShareFile.Api.Client.Tests/Extensions/QueryExtensionTests.cs deleted file mode 100644 index e4a43db..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Extensions/QueryExtensionTests.cs +++ /dev/null @@ -1,251 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FluentAssertions; -using NUnit.Framework; -using ShareFile.Api.Client.Requests; -using ShareFile.Api.Models; -using ShareFile.Api.Client.Extensions; -using System.Linq.Expressions; - -namespace ShareFile.Api.Client.Core.Tests.Extensions -{ - [TestFixture] - public class QueryExtensionTests : BaseTests - { - private void AssertSelect(IQuery query, params string[] selects) where T : class - { - var apiRequest = ApiRequest.FromQuery((QueryBase)query); - string selectString = String.Join(",", selects.OrderBy(s => s.Length)); - apiRequest.QueryStringCollection.Should().Contain(odataParam => odataParam.Key == "$select" && odataParam.Value == selectString); - } - - private void AssertExpand(IQuery query, params string[] expands) where T : class - { - var apiRequest = ApiRequest.FromQuery((QueryBase)query); - string expandString = String.Join(",", expands.OrderBy(s => s.Length)); - apiRequest.QueryStringCollection.Should().Contain(odataParam => odataParam.Key == "$expand" && odataParam.Value == expandString); - } - - private IQuery BuildSessionQuery(Expression> lambda) - { - var query = GetShareFileClient().Sessions.Get(); - query = QueryExtensions.ApplySelectsAndExpands(query, lambda); - return query; - } - - [Test] - public void LambdaQuery_Select() - { - var query = BuildSessionQuery(session => session.IsAuthenticated); - - AssertSelect(query, "IsAuthenticated"); - } - - [Test] - public void LambdaQuery_DontSelect() - { - var query = BuildSessionQuery(session => session.Name.Length); - - AssertSelect(query, "Name"); //not Name/Length - } - - [Test] - public void LambdaQuery_Expand() - { - var query = BuildSessionQuery(session => session.Principal); - - AssertExpand(query, "Principal"); - } - - [Test] - public void LambdaQuery_SelectMultiple() - { - var query = BuildSessionQuery(session => new { Name = session.Name, Authenticated = session.IsAuthenticated }); - - AssertSelect(query, "Name", "IsAuthenticated"); - } - - [Test] - public void LambdaQuery_ExpandMultiple() - { - var query = BuildSessionQuery(session => new { Principal = session.Principal, DeviceUser = session.DeviceUser }); - - AssertExpand(query, "Principal", "DeviceUser"); - } - - [Test] - public void LambdaQuery_SelectExpandDeep() - { - var query = BuildSessionQuery(session => new - { - Email = session.Principal.Email, - Username = session.Principal.Name, - DeviceId = session.DeviceUser.Device.Id - }); - - AssertExpand(query, - "Principal", - "DeviceUser", - "DeviceUser/Device"); - - AssertSelect(query, - "Principal/Email", - "Principal/Name", - "DeviceUser/Device/Id"); - } - - [Test] - public void LambdaQuery_Cast() - { - var query = BuildSessionQuery(session => ((AccountUser)session.Principal).FullName); - - AssertExpand(query, "Principal"); - AssertSelect(query, "Principal/FullName"); - } - - [Test] - public void LambdaQuery_As() - { - var query = BuildSessionQuery(session => (session.Principal as AccountUser).FullName); - - AssertExpand(query, "Principal"); - AssertSelect(query, "Principal/FullName"); - } - - [Test] - public void LambdaQuery_Coalesce() - { - var query = BuildSessionQuery(session => (session.Principal ?? new Principal()).Email); - - AssertExpand(query, "Principal"); - AssertSelect(query, "Principal/Email"); - } - - [Test] - public void LambdaQuery_Collection() - { - var query = BuildSessionQuery(session => (session.Principal as AccountUser).FavoriteFolders); - - AssertExpand(query, "Principal", "Principal/FavoriteFolders"); - } - - [Test] - public void LambdaQuery_Sublambda() - { - var query = BuildSessionQuery(session => (session.Principal as AccountUser).FavoriteFolders.Where(fav => fav.FolderName.Length == 5)); - - AssertExpand(query, "Principal", "Principal/FavoriteFolders"); - AssertSelect(query, "Principal/FavoriteFolders/FolderName"); - } - - [Test] - public void LambdaQuery_MethodArg() - { - var query = BuildSessionQuery(session => BogusMethod(session.Principal.Name)); - - AssertExpand(query, "Principal"); - AssertSelect(query, "Principal/Name"); - } - - private int BogusMethod(object ignore) { return 2; } - - [Test] - public void LambdaQuery_ConstructorArg() - { - var query = BuildSessionQuery(session => new BogusClass(session.Principal.Name)); - - AssertExpand(query, "Principal"); - AssertSelect(query, "Principal/Name"); - } - - private class BogusClass { - public BogusClass(object ignore) { } - public object Foo { get; set; } - } - - [Test] - public void LambdaQuery_ConstructorInit() - { - var query = BuildSessionQuery(session => new BogusClass(session.Principal.Name) { Foo = session.DeviceUser.Device.Id }); - - AssertExpand(query, - "Principal", - "DeviceUser", - "DeviceUser/Device"); - - AssertSelect(query, - "Principal/Name", - "DeviceUser/Device/Id"); - } - - [Test] - public void LambdaQuery_CollectionInit() - { - var query = BuildSessionQuery(session => new List { - session.Principal.Name.Length, - (session.Principal as AccountUser).FavoriteFolders.Count() - }); - - AssertExpand(query, "Principal", "Principal/FavoriteFolders"); - AssertSelect(query, "Principal/Name"); - } - - [Test] - public void LambdaQuery_Nested() - { - var query = BuildSessionQuery(session => - session.Principal.As((AccountUser accountUser) => new - { - EnableSync = accountUser.Account.Preferences.EnableSync, - CanaryMaxVersion = accountUser.Account.ToolInformation.Single(toolInfo => toolInfo.ToolName == "WinSync").Version - }, - null)); - - AssertExpand(query, - "Principal", - "Principal/Account", - "Principal/Account/Preferences", - "Principal/Account/ToolInformation"); - - AssertSelect(query, - "Principal/Account/Preferences/EnableSync", - "Principal/Account/ToolInformation/ToolName", - "Principal/Account/ToolInformation/Version"); - } - - private static string StaticField; - private static string StaticProperty { get { return StaticField; } } - private static string StaticMethod() { return StaticField; } - - [Test] - public void LambdaQuery_StaticField() - { - var query = BuildSessionQuery(session => session.Id == QueryExtensionTests.StaticField); - AssertSelect(query, "Id"); - } - - [Test] - public void LambdaQuery_StaticProperty() - { - var query = BuildSessionQuery(session => session.Id == QueryExtensionTests.StaticProperty); - AssertSelect(query, "Id"); - } - - [Test] - public void LambdaQuery_StaticMethod() - { - var query = BuildSessionQuery(session => session.Id == QueryExtensionTests.StaticMethod()); - AssertSelect(query, "Id"); - } - - [Test] - public void LambdaQuery_NonStaticMethod() - { - var query = BuildSessionQuery(session => session.Id.ToString()); - AssertSelect(query, "Id"); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Extensions/StringExtensionsTests.cs b/Tests/ShareFile.Api.Client.Tests/Extensions/StringExtensionsTests.cs deleted file mode 100644 index ff51dc4..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Extensions/StringExtensionsTests.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Text; - -using FluentAssertions; -using ShareFile.Api.Client.Extensions; - -using NUnit.Framework; - -namespace ShareFile.Api.Client.Core.Tests.Extensions -{ - [TestFixture] - public class StringExtensionsTests : BaseTests - { - [TestCase] - public void VerifyIsBase64Encoded() - { - Convert.ToBase64String(Encoding.UTF8.GetBytes(RandomString(100))).IsBase64().Should().BeTrue(); - } - - [TestCase("YXNkZmdoamtscXdlcnR5dWlvcA==", ExpectedResult = "YXNkZmdoamtscXdlcnR5dWlvcA==")] - [TestCase("asdfghjklqwertyuiop", ExpectedResult = "YXNkZmdoamtscXdlcnR5dWlvcA==")] - public string Base64Encode(string val) - { - return val.ToBase64(); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Properties/AssemblyInfo.cs b/Tests/ShareFile.Api.Client.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 8503ecf..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ShareFile.Api.Client.Core.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ShareFile.Api.Client.Core.Tests")] -[assembly: AssemblyCopyright("Copyright © 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("37707aef-77e0-4166-a70a-925d44e02243")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Tests/ShareFile.Api.Client.Tests/Requests/ApiRequestTests.cs b/Tests/ShareFile.Api.Client.Tests/Requests/ApiRequestTests.cs deleted file mode 100644 index a1828d1..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Requests/ApiRequestTests.cs +++ /dev/null @@ -1,314 +0,0 @@ -using System; -using FluentAssertions; -using NUnit.Framework; -using ShareFile.Api.Client.Requests; -using ShareFile.Api.Models; - -namespace ShareFile.Api.Client.Core.Tests.Requests -{ - [TestFixture] - public class ApiRequestTests : BaseTests - { - [Test] - public void ApiRequest_FromQuery_WithId() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()); - query.From("Items") - .Id(id) - .Action("Download"); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - apiRequest.HttpMethod.Should().Be("GET"); - var expectedUri = "https://release.sf-api.com/sf/v3/Items(" + id + ")/Download"; - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_WithUri() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()); - query.Uri(new Uri("https://release.sf-api.com/sf/v3/Items(" + id + ")")) - .Action("Download"); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - apiRequest.HttpMethod.Should().Be("GET"); - var expectedUri = "https://release.sf-api.com/sf/v3/Items(" + id + ")/Download"; - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_MultipleCallsToFromQuery_WithUriParams() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()); - query.Uri(new Uri("https://release.sf-api.com/sf/v3/Items(" + id + ")?root=someroot")); - - // Act - ApiRequest.FromQuery(query); - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - apiRequest.HttpMethod.Should().Be("GET"); - var expectedUri = "https://release.sf-api.com/sf/v3/Items(" + id + ")?root=someroot"; - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_WithBody_AsPost() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()); - query.Uri(new Uri("https://release.sf-api.com/sf/v3/Items(" + id + ")")) - .Action("CreateFolder"); - query.HttpMethod = "POST"; - query.Body = new Folder(); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().Be(query.Body); - apiRequest.HttpMethod.Should().Be("POST"); - var expectedUri = "https://release.sf-api.com/sf/v3/Items(" + id + ")/CreateFolder"; - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_WithBody_AsGet() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()); - query.Uri(new Uri("https://release.sf-api.com/sf/v3/Items(" + id + ")")) - .Action("CreateFolder"); - query.Body = new Folder(); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().Be(query.Body); - apiRequest.HttpMethod.Should().NotBe("POST", "Just because body is defined, does not mean it should be a POST"); - var expectedUri = "https://release.sf-api.com/sf/v3/Items(" + id + ")/CreateFolder"; - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_WithQueryString() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()); - query.Uri(new Uri("https://release.sf-api.com/sf/v3/Items(" + id + ")")); - query.QueryString("key1", "value1"); - query.QueryString("key2", "value2"); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - var expectedUri = "https://release.sf-api.com/sf/v3/Items(" + id + ")?key1=value1&key2=value2"; - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_WithHeader() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()); - query.Uri(new Uri("https://release.sf-api.com/sf/v3/Items(" + id + ")")); - query.AddHeader("key1", "value1"); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - var expectedUri = "https://release.sf-api.com/sf/v3/Items(" + id + ")"; - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - apiRequest.HeaderCollection.Should().ContainKey("key1"); - apiRequest.HeaderCollection.Should().ContainValue("value1"); - } - - [Test] - public void ApiRequest_FromQuery_CompositeIds() - { - // Arrange - var id = GetId(); - var id2 = GetId(); - var query = new Query(GetShareFileClient()) - .From("Items") - .Ids("id", id) - .Ids("id2", id2); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - var expectedUri = string.Format("https://release.sf-api.com/sf/v3/Items(id={0},id2={1})", id, id2); - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_ODataPaging() - { - // Arrange - var query = - this.GetShareFileClient() - .Items.GetChildren(new Uri("https://release.sf-api.com/sf/v3/Items(" + this.GetId() + ")")) - .Top(5) - .Skip(10) - .OrderBy("FileName"); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - var top = Uri.EscapeDataString("$top") + "=5"; - var skip = Uri.EscapeDataString("$skip") + "=10"; - var orderby = Uri.EscapeDataString("$orderby") + "=FileName"; - - var uriString = apiRequest.GetComposedUri().ToString(); - Assert.IsTrue(uriString.Contains(top) || uriString.Contains("$top=5")); - Assert.IsTrue(uriString.Contains(skip) || uriString.Contains("$skip=10")); - Assert.IsTrue(uriString.Contains(orderby) || uriString.Contains("$orderby=FileName")); - } - - [Test] - public void ApiRequest_FromQuery_CompositeActionIds() - { - // Arrange - var id = GetId(); - var id2 = GetId(); - var query = new Query(GetShareFileClient()) - .From("Items") - .Action("Test") - .ActionIds("id", id) - .ActionIds("id2", id2); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - var expectedUri = string.Format("https://release.sf-api.com/sf/v3/Items/Test(id={0},id2={1})", id, id2); - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_CompositeSubActionIds() - { - // Arrange - var id = GetId(); - var id2 = GetId(); - var subid = GetId(16); - var subid2 = GetId(16); - var query = new Query(GetShareFileClient()) - .From("Items") - .Action("Test") - .ActionIds("id", id) - .ActionIds("id2", id2) - .SubAction("TestSubAction", "subid", subid) - .SubAction("TestSubAction", "subid2", subid2); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - var expectedUri = string.Format("https://release.sf-api.com/sf/v3/Items/Test(id={0},id2={1})/TestSubAction(subid={2},subid2={3})", id, id2, subid, subid2); - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_WithBaseUri() - { - // Arrange - var id = GetId(); - var query = new Query(GetShareFileClient()) - .From("Items") - .Action("Test") - .ActionIds("id", id) - .WithBaseUri(new Uri("https://test.sf-api.com/sf/v3/RandomEntity(folderId)")); - - // Act - var apiRequest = ApiRequest.FromQuery(query); - - // Assert - apiRequest.Body.Should().BeNull(); - var expectedUri = string.Format("https://test.sf-api.com/sf/v3/Items/Test(id={0})", id); - apiRequest.GetComposedUri().ToString().Should().Be(expectedUri); - } - - [Test] - public void ApiRequest_FromQuery_WithBaseUri_Fails() - { - // Arrange - var id = GetId(); - - try - { - // Act - var query = new Query(GetShareFileClient()) - .From("Items") - .Action("Test") - .ActionIds("id", id) - .WithBaseUri(new Uri("https://test.sf-api.com/sfItems(folderId)")); - } - catch (ArgumentException argumentException) - { - Assert.Pass(); - } - catch (Exception) - { - - } - - Assert.Fail(); - } - - [Test] - public void ApiRequest_FromQuery_WithQueryStringOnUri() - { - var query = new Query(GetShareFileClient()) - .Uri(new Uri("https://release.sf-api.com/sf/v3/Items(folder)?qsParam=1")) - .QueryString("testKey", "testValue"); - var apiRequest = ApiRequest.FromQuery(query); - - var composedUri = apiRequest.GetComposedUri().ToString(); - composedUri.Should().Contain("qsParam=1"); - composedUri.Should().Contain("testKey=testValue"); - } - - [Test] - public void ApiRequest_FromQuery_DateTimeFormat() - { - var dateTime = DateTime.Now; - var query = new Query(GetShareFileClient()) - .Uri(new Uri("https://release.sf-api.com/sf/v3/Items(folder)?qsParam=1")) - .QueryString("datetime", dateTime); - var apiRequest = ApiRequest.FromQuery(query); - - var composedUri = apiRequest.GetComposedUri().ToString(); - composedUri.Should().Contain("datetime=" + dateTime.ToString("O")); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Requests/Filters/BooleanFilterTests.cs b/Tests/ShareFile.Api.Client.Tests/Requests/Filters/BooleanFilterTests.cs deleted file mode 100644 index 8fbcac6..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Requests/Filters/BooleanFilterTests.cs +++ /dev/null @@ -1,64 +0,0 @@ -using NUnit.Framework; - -namespace ShareFile.Api.Client.Core.Tests.Requests.Filters -{ - using FluentAssertions; - - public class BooleanFilterTests - { - [Test] - public void VerifyAndBinaryOperator() - { - // Arrange - var leftHandSide = new Client.Requests.Filters.StartsWithFilter("Name", "test"); - var rightHandSide = new Client.Requests.Filters.EndsWithFilter("Name", "test"); - var andBinaryFilter = new Client.Requests.Filters.AndFilter(leftHandSide, rightHandSide); - - // Act - var computedFilter = andBinaryFilter.ToString(); - var leftHandSideComputed = leftHandSide.ToString(); - var rightHandSideComputed = rightHandSide.ToString(); - - // Assert - computedFilter.Should().Be(leftHandSideComputed + " and " + rightHandSideComputed); - } - - [Test] - public void VerifyOrBinaryOperator() - { - // Arrange - var leftHandSide = new Client.Requests.Filters.StartsWithFilter("Name", "test"); - var rightHandSide = new Client.Requests.Filters.EndsWithFilter("Name", "test"); - var orBinaryFilter = new Client.Requests.Filters.OrFilter(leftHandSide, rightHandSide); - - // Act - var computedFilter = orBinaryFilter.ToString(); - var leftHandSideComputed = leftHandSide.ToString(); - var rightHandSideComputed = rightHandSide.ToString(); - - // Assert - computedFilter.Should().Be(leftHandSideComputed + " or " + rightHandSideComputed); - } - - [Test] - public void VerifyCompoundBinaryOperator() - { - // Arrange - var orLeftHandSide = new Client.Requests.Filters.StartsWithFilter("Name", "test"); - var orRightHandSide = new Client.Requests.Filters.EndsWithFilter("Name", "test"); - var orBinaryFilter = new Client.Requests.Filters.OrFilter(orLeftHandSide, orRightHandSide); - - var andLeftHandSide = new Client.Requests.Filters.StartsWithFilter("Name", "test"); - var andRightHandSide = new Client.Requests.Filters.EndsWithFilter("Name", "test"); - var andBinaryFilter = new Client.Requests.Filters.AndFilter(andLeftHandSide, andRightHandSide); - - var compoundBinaryFilter = new Client.Requests.Filters.OrFilter(orBinaryFilter, andBinaryFilter); - - // Act - var computedFilter = compoundBinaryFilter.ToString(); - - // Assert - computedFilter.Should().Be(orBinaryFilter + " or " + andBinaryFilter); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Requests/Filters/DateFilterTests.cs b/Tests/ShareFile.Api.Client.Tests/Requests/Filters/DateFilterTests.cs deleted file mode 100644 index 5b422a4..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Requests/Filters/DateFilterTests.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; - -using FluentAssertions; - -using NUnit.Framework; - -using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.Requests.Filters; - -namespace ShareFile.Api.Client.Tests.Requests.Filters -{ - [TestFixture] - public class DateFilterTests - { - [TestCase] - public void DateGreaterThanFilter() - { - var dt = LocalDate(); - var filter = new GreaterThanFilter("creationdate", Filter.Function.Date(dt)); - - string expected = string.Format("creationdate gt date({0})", ExpectedSerialization(dt)); - filter.ToString().Should().Be(expected); - } - - [TestCase] - public void DateLessThanFilter() - { - var dt = LocalDate(); - var filter = new LessThanFilter("creationdate", Filter.Function.Date(dt)); - - string expected = string.Format("creationdate lt date({0})", ExpectedSerialization(dt)); - filter.ToString().Should().Be(expected); - } - - [TestCase] - public void TimeGreaterThanFilter() - { - var dt = LocalDate(); - var filter = new GreaterThanFilter("creationdate", Filter.Function.Time(dt)); - - string expected = string.Format("creationdate gt time({0})", ExpectedSerialization(dt)); - filter.ToString().Should().Be(expected); - } - - [TestCase] - public void TimeLessThanFilter() - { - var dt = LocalDate(); - var filter = new LessThanFilter("creationdate", Filter.Function.Time(dt)); - - string expected = string.Format("creationdate lt time({0})", ExpectedSerialization(dt)); - filter.ToString().Should().Be(expected); - } - - private DateTime LocalDate() - { - return new DateTime(2016, 1, 1, 0, 0, 0, 0, DateTimeKind.Local); - } - - private string ExpectedSerialization(DateTime dt) - { - return dt.ToUniversalTime().ToString("u"); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Requests/Filters/SubstringFilterTests.cs b/Tests/ShareFile.Api.Client.Tests/Requests/Filters/SubstringFilterTests.cs deleted file mode 100644 index a6d27d8..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Requests/Filters/SubstringFilterTests.cs +++ /dev/null @@ -1,56 +0,0 @@ -using FluentAssertions; - -using NUnit.Framework; - -using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.Requests.Filters; - -namespace ShareFile.Api.Client.Core.Tests.Requests.Filters -{ - [TestFixture] - public class EqualityFilterTests - { - [TestCase(true, TestName = "EndsWithFilter_IsEqual")] - [TestCase(false, TestName = "EndsWithFilter_IsNotEqual")] - public void EndsWithFilter(bool isEqual) - { - var filter = new EndsWithFilter("Name", "ShareFile", isEqual); - - filter.ToString().Should().Be("endswith(Name, 'ShareFile') eq " + isEqual.ToLowerString()); - } - - [TestCase(true, TestName = "StartsWithFilter_IsEqual")] - [TestCase(false, TestName = "StartsWithFilter_IsNotEqual")] - public void StartsWithFilter(bool isEqual) - { - var filter = new StartsWithFilter("Name", "ShareFile", isEqual); - - filter.ToString().Should().Be("startswith(Name, 'ShareFile') eq " + isEqual.ToLowerString()); - } - - [TestCase(true, TestName = "SubstringFilter_IsEqual")] - [TestCase(false, TestName = "SubstringFilter_IsNotEqual")] - public void SubstringFilter(bool isEqual) - { - var filter = new SubstringFilter("Name", "ShareFile", isEqual); - - filter.ToString().Should().Be("substringof('ShareFile', Name) eq " + isEqual.ToLowerString()); - } - - [Test] - public void NotEqualToFilter() - { - var filter = new NotEqualToFilter("Name", "ShareFile"); - - filter.ToString().Should().Be("Name ne 'ShareFile'"); - } - - [Test] - public void EqualToFilter() - { - var filter = new EqualToFilter("Name", "ShareFile"); - - filter.ToString().Should().Be("Name eq 'ShareFile'"); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Requests/Providers/RequestProviderTests.cs b/Tests/ShareFile.Api.Client.Tests/Requests/Providers/RequestProviderTests.cs deleted file mode 100644 index 7765d22..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Requests/Providers/RequestProviderTests.cs +++ /dev/null @@ -1,777 +0,0 @@ -using System; -using System.IO; -using System.Linq.Expressions; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Text; -using System.Threading; -using FakeItEasy; -using FluentAssertions; -using Newtonsoft.Json; -using NUnit.Framework; - -using ShareFile.Api.Client.Events; -using ShareFile.Api.Client.Exceptions; -using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.Requests; -using ShareFile.Api.Client.Requests.Executors; -using ShareFile.Api.Client.Requests.Filters; -using ShareFile.Api.Models; -using System.Collections.Generic; -using System.Linq; - -namespace ShareFile.Api.Client.Core.Tests.Requests.Providers -{ - public class RequestProviderTests : BaseTests - { - [TestCase(true, TestName = "GetStream_Async")] - [TestCase(false, TestName = "GetStream_Sync")] - public async void GetStream(bool async) - { - // Arrange - var query = this.GetThumbnailQuery(); - var streamMessage = Guid.NewGuid().ToString(); - ConfigureStreamResponse(streamMessage); - - Stream stream; - // Act - if (async) - { - stream = await query.ExecuteAsync(); - } - else - { - stream = query.Execute(); - } - - // Assert - Assert.IsNotNull(stream); - } - - [TestCase(true, TestName = "Query_ItemNotFound_Async")] - [TestCase(false, TestName = "Query_ItemNotFound_Sync")] - public async void Query_ItemNotFound(bool async) - { - // Arrange - var query = GetItemDeleteQuery(); - ConfigureNotFound(); - - // Act - try - { - if (async) - await query.ExecuteAsync(); - else query.Execute(); - } - // Assert - catch (ODataException exception) - { - Assert.IsTrue(exception.Code == HttpStatusCode.NotFound); - return; - } - - Assert.Fail(); - } - - [TestCase(true, TestName = "QueryT_ItemNotFound_Async")] - [TestCase(false, TestName = "QueryT_ItemNotFound_Sync")] - public async void QueryT_ItemNotFound(bool async) - { - var query = GetItemQuery(); - ConfigureNotFound(); - - try - { - if (async) - await query.ExecuteAsync(); - else query.Execute(); - } - catch (ODataException exception) - { - Assert.IsTrue(exception.Code == HttpStatusCode.NotFound); - return; - } - - Assert.Fail(); - } - - [TestCase(true, TestName = "QueryStream_ItemNotFound_Async")] - [TestCase(false, TestName = "QueryStream_ItemNotFound_Sync")] - public async void QueryStream_ItemNotFound(bool async) - { - var query = GetThumbnailQuery(); - ConfigureNotFound(); - - try - { - if (async) - await query.ExecuteAsync(); - else query.Execute(); - } - catch (ODataException exception) - { - Assert.IsTrue(exception.Code == HttpStatusCode.NotFound); - return; - } - - Assert.Fail(); - } - - [TestCase(true, TestName = "AsyncOperationScheduled_Async")] - [TestCase(false, TestName = "AsyncOperationScheduled_Sync")] - public async void AsyncOperationScheduled(bool async) - { - // Arrange - var shareFileClient = GetShareFileClient(true); - ConfigureAsyncOperationScheduled(); - - var newItem = new Models.File - { - Parent = new Folder - { - Id = "fo" + GetId(34) - } - }; - var query = shareFileClient.Items.Update(shareFileClient.Items.GetAlias("fi" + GetId(34)), newItem); - - // Act - try - { - if (async) - { - await query.ExecuteAsync(); - } - else query.Execute(); - } - // Assert - catch (AsyncOperationScheduledException asyncOperationScheduledException) - { - Assert.Pass(); - return; - } - - Assert.Fail(); - } - - [TestCase(true, TestName="ZoneUnavailableThrown_Async")] - [TestCase(false, TestName="ZoneUnavailableThrown_Sync")] - public async void ZoneUnvailableThrown(bool async) - { - var shareFileClient = GetShareFileClient(true); - ConfigureZoneUnavailableResponse(); - - var query = shareFileClient.Items.Get(shareFileClient.Items.GetAlias(GetId())); - - try - { - if (async) - await query.ExecuteAsync(); - else - query.Execute(); - Assert.Fail(); - } - catch(ZoneUnavailableException) - { - Assert.Pass(); - } - } - - [TestCase(true, null)] - [TestCase(false, null)] - [TestCase(true, "123")] - [TestCase(false, "123")] - public async void RedirectionWithRoot(bool async, string root) - { - // Arrange - var shareFileClient = GetShareFileClient(true); - ConfigureDomainChangedResponse(root); - - var changeDomainRaised = false; - shareFileClient.AddChangeDomainHandler((message, redirect) => - { - changeDomainRaised = true; - ConfigureItemResponse(root); - return EventHandlerResponse.Redirect(redirect); - }); - - var query = shareFileClient.Items.Get(shareFileClient.Items.GetAlias(GetId())); - - // Act - if (async) - { - await query.ExecuteAsync(); - } - else - { - query.Execute(); - } - - // Assert - changeDomainRaised.Should().BeTrue(); - } - - [TestCase(true, TestName = "OnDomainChangeRaise_Async")] - [TestCase(false, TestName = "OnDomainChangeRaise_Sync")] - public async void OnDomainChangeRaised(bool async) - { - // Arrange - var shareFileClient = GetShareFileClient(true); - ConfigureDomainChangedResponse(); - - var changeDomainRaised = false; - shareFileClient.AddChangeDomainHandler((message, redirect) => - { - changeDomainRaised = true; - ConfigureItemResponse(); - return EventHandlerResponse.Redirect(redirect); - }); - - var query = shareFileClient.Items.Get(shareFileClient.Items.GetAlias(GetId())); - - // Act - if (async) - { - await query.ExecuteAsync(); - } - else - { - query.Execute(); - } - - // Assert - changeDomainRaised.Should().BeTrue(); - } - - [TestCase(true)] - [TestCase(false)] - public async void DeleteRedirectionSupport(bool async) - { - // Arrange - var shareFileClient = GetShareFileClient(true); - ConfigureDomainChangedResponse(); - - var changeDomainRaised = false; - shareFileClient.AddChangeDomainHandler((message, redirect) => - { - changeDomainRaised = true; - ConfigureNoContentResponse(); - return EventHandlerResponse.Redirect(redirect); - }); - - var query = shareFileClient.Items.Delete(shareFileClient.Items.GetAlias(GetId())); - - // Act - if (async) - { - await query.ExecuteAsync(); - } - else - { - query.Execute(); - } - - // Assert - changeDomainRaised.Should().BeTrue(); - } - - [TestCase(true, TestName = "WebAuthenticationException_Async")] - [TestCase(false, TestName = "WebAuthenticationException_Sync")] - public async void WebAuthenticationException(bool async) - { - // Arrange - var query = GetItemQuery(); - ConfigureUnauthorizedResponse(); - - try - { - // Act - if (async) - { - await query.ExecuteAsync(); - } - else query.Execute(); - } - // Assert - catch (WebAuthenticationException exception) - { - Assert.Pass(); - return; - } - - Assert.Fail(); - } - - [TestCase] - public void EnsureImplicitAndFilter() - { - // Arrange - var client = this.GetShareFileClient(true); - var query = client.Items.GetChildren(client.Items.GetAlias("fileId")); - - // Act - var endsWithFilter = new EndsWithFilter("Property", "value"); - var startsWithFilter = new StartsWithFilter("Property", "value"); - query = query.Filter(endsWithFilter).Filter(startsWithFilter); - - var odataQuery = query as Query>; - var filter = odataQuery.GetFilter(); - - // Assert - filter.Should().BeOfType(); - (filter as AndFilter).Left.Should().Be(endsWithFilter); - (filter as AndFilter).Right.Should().Be(startsWithFilter); - } - - [TestCase(HttpStatusCode.Moved)] - [TestCase(HttpStatusCode.Redirect)] - public void HttpsToHttpRedirect(HttpStatusCode code) - { - // Arrange - var client = GetShareFileClient(true); - var response = new HttpResponseMessage(); - response.StatusCode = code; - response.Headers.Location = new Uri("http://example.com"); - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.Ignored, - A.Ignored, - A.Ignored)).Returns(response); - var query = client.Items.Get(); - - // Act - Action a = () => query.ExecuteAsync().Wait(); - a.ShouldThrow().WithInnerException(); - } - - [TestCase(HttpStatusCode.Moved)] - [TestCase(HttpStatusCode.Redirect)] - public void FollowRelativeUrlRedirect(HttpStatusCode code) - { - // Arrange - var client = GetShareFileClient(registerFakeExecutors: true); - Uri requestedItemUri = client.Items.GetAlias(Enums.ItemAlias.Home); - Uri relativeItemUri = new Uri("/item", UriKind.Relative); - Uri absoluteItemUri = new Uri(requestedItemUri, relativeItemUri); - var response = new HttpResponseMessage(); - response.StatusCode = code; - response.Headers.Location = relativeItemUri; - response.RequestMessage = new HttpRequestMessage(HttpMethod.Get, requestedItemUri); - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.That.Matches(i => i.RequestUri != absoluteItemUri), - A.Ignored, - A.Ignored)).Returns(response); - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.That.Matches( - i => - i.Method == HttpMethod.Get - && i.RequestUri == absoluteItemUri), - A.Ignored, - A.Ignored)) - .Returns(GenerateODataObjectResponse(new HttpRequestMessage(), - @"{ ""Name"":""file.jpg"", - ""odata.metadata"":""https://citrix.sf-api.com/sf/v3/$metadata#Items/ShareFile.Api.Models.File@Element"", - ""odata.type"":""ShareFile.Api.Models.File"",}")); - - // Act - var item = client.Items.Get(requestedItemUri).ExecuteAsync().Result; - - // Assert - item.Name.Should().Be("file.jpg"); - } - - [TestCase(HttpStatusCode.Moved)] - [TestCase(HttpStatusCode.Redirect)] - public void FollowRedirect(HttpStatusCode code) - { - // Arrange - var client = GetShareFileClient(true); - var response = new HttpResponseMessage(); - response.StatusCode = code; - response.Headers.Location = new Uri("https://example.com"); - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.That.Matches(i => i.RequestUri != new Uri("https://example.com")), - A.Ignored, - A.Ignored)).Returns(response); - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.That.Matches( - i => - i.Method == HttpMethod.Get - && i.RequestUri == new Uri("https://example.com")), - A.Ignored, - A.Ignored)) - .Returns(GenerateODataObjectResponse(new HttpRequestMessage(), - @"{ ""Name"":""file.jpg"", - ""odata.metadata"":""https://citrix.sf-api.com/sf/v3/$metadata#Items/ShareFile.Api.Models.File@Element"", - ""odata.type"":""ShareFile.Api.Models.File"",}")); - - // Act - var item = client.Items.Get().ExecuteAsync().Result; - - // Assert - item.Name.Should().Be("file.jpg"); - } - - [TestCase(HttpStatusCode.Moved)] - [TestCase(HttpStatusCode.Redirect)] - public void ExceedMaximumRedirectionCount(HttpStatusCode code) - { - // Arrange - var client = GetShareFileClient(true); - var response = new HttpResponseMessage(); - response.StatusCode = code; - response.Headers.Location = new Uri("https://example.com"); - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.Ignored, - A.Ignored, - A.Ignored)).Returns(response); - - // Act - Action a = () => client.Items.Get().ExecuteAsync().Wait(); - - // Assert - a.ShouldThrow().WithInnerException().WithInnerMessage("Exceeded maximum number of allowed redirects."); - } - - protected IQuery GetItemDeleteQuery() - { - var client = GetShareFileClient(true); - return client.Items.Delete(client.Items.GetAlias("fileId")); - } - - protected IQuery GetItemQuery() - { - var client = GetShareFileClient(true); - return client.Items.Get(client.Items.GetAlias("fileId")); - } - - protected IQuery GetThumbnailQuery() - { - var client = GetShareFileClient(true); - return client.Items.GetThumbnail(client.Items.GetAlias("fileId")); - } - - protected void ConfigureNotFound() - { - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Returns(GenerateODataRequestException(HttpStatusCode.NotFound, "Items: NotFound")); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Returns(GenerateODataRequestException(HttpStatusCode.NotFound, "Items: NotFound")); - } - - protected void ConfigureStreamResponse(string responseContent) - { - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Returns(this.GenerateStreamResponse(responseContent)); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Returns(this.GenerateStreamResponse(responseContent)); - } - - protected void ConfigureAsyncOperationScheduled() - { - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Returns(GenerateAsyncOperationScheduled()); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Returns(GenerateAsyncOperationScheduled()); - } - - protected void ConfigureDomainChangedResponse(string root = null) - { - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Returns(GenerateRedirectionResponse(root)); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Returns(GenerateRedirectionResponse(root)); - } - - protected void ConfigureZoneUnavailableResponse() - { - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Returns(GenerateRedirectionUnavailableResponse()); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Returns(GenerateRedirectionUnavailableResponse()); - } - - protected void ConfigureItemResponse(string root = null) - { - HttpRequestMessage requestMessage = null; - - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.That.Matches( - message => root == null || message.RequestUri.ToString().Contains("root=" + root)), A.Ignored, - A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options, CancellationToken token) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateItemResponse(requestMessage)); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.That.Matches( - message => root == null || message.RequestUri.ToString().Contains("root=" + root)), A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateItemResponse(requestMessage)); - } - - protected void ConfigureUnauthorizedResponse() - { - HttpRequestMessage requestMessage = null; - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options, CancellationToken token) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateUnauthorizedResponse(requestMessage)); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateUnauthorizedResponse(requestMessage)); - } - - protected void ConfigureODataObjectResponse(string response) - { - HttpRequestMessage requestMessage = null; - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options, CancellationToken token) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateODataObjectResponse(requestMessage, response)); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateODataObjectResponse(requestMessage, response)); - } - - protected void ConfigureNoContentResponse() - { - HttpRequestMessage requestMessage = null; - A.CallTo(() => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync(A.Ignored, A.Ignored, A.Ignored, - A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options, CancellationToken token) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateNoContentResponse(requestMessage)); - - A.CallTo(() => - RequestExecutorFactory.GetSyncRequestExecutor() - .Send(A.Ignored, A.Ignored, A.Ignored)) - .Invokes((HttpClient client, HttpRequestMessage message, HttpCompletionOption options) => - { - requestMessage = message; - }) - .ReturnsLazily(() => GenerateNoContentResponse(requestMessage)); - } - - protected HttpResponseMessage GenerateODataRequestException(HttpStatusCode statusCode, string message) - { - return new HttpResponseMessage(statusCode) - { - RequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri("https://secure.sf-api.com/sf/v3/")), - Content = new StringContent(SerializeObject(new ODataRequestException - { - Code = statusCode, - Message = new ODataExceptionMessage { Language = "en-US", Message = message } - }), Encoding.UTF8, "application/json") - }; - } - - private HttpResponseMessage streamResponse; - protected HttpResponseMessage GenerateStreamResponse(string message) - { - if (this.streamResponse == null) - { - this.streamResponse = new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(message), - }; - } - - return this.streamResponse; - } - - protected HttpResponseMessage GenerateAsyncOperationScheduled() - { - var operations = new ODataFeed(); - operations.Feed = new List - { - new AsyncOperation - { - BatchID = GetId(10), - BatchSourceID = GetId(), - BatchProgress = 0, - BatchState = AsyncOperationState.Scheduled - } - }; - - return new HttpResponseMessage(HttpStatusCode.Accepted) - { - RequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri("https://secure.sf-api.com/sf/v3/")), - Content = new StringContent(SerializeObject(operations), Encoding.UTF8, "application/json") - }; - } - - protected HttpResponseMessage GenerateRedirectionResponse(string root = null) - { - var baseUri = "https://newhost.sharefile.com/sf/v3/"; - var redirection = new Redirection - { - Available = true, - Uri = new Uri(baseUri), - Root = root - }; - - redirection.MetadataUrl = "https://newhost.sharefile.com/sf/v3/$metadata#ShareFile.Api.Models.Redirection@Element"; - - return new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(SerializeObject(redirection), Encoding.UTF8, "application/json"), - RequestMessage = new HttpRequestMessage(HttpMethod.Get, new Uri("https://secure.sf-api.com/sf/v3/Items(" + GetId() + ")")) - }; - } - - protected HttpResponseMessage GenerateRedirectionUnavailableResponse() - { - var redirection = new Redirection - { - Uri = null - }; - - redirection.MetadataUrl = "https://newhost.sharefile.com/sf/v3/$metadata#ShareFile.Api.Models.Redirection@Element"; - - return new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(SerializeObject(redirection), Encoding.UTF8, "application/json"), - RequestMessage = new HttpRequestMessage(HttpMethod.Get, new Uri("https://secure.sf-api.com/sf/v3/Items(" + GetId() + ")")) - }; - - } - - protected HttpResponseMessage GenerateItemResponse(HttpRequestMessage requestMessage) - { - return new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(SerializeObject(new - { - Id = GetId(), - Name = "Test Item", - odatatype = "ShareFile.Api.Models.Item" - }).Replace("odatatype", "odata.type"), Encoding.UTF8, "application/json"), - RequestMessage = requestMessage - }; - } - - protected HttpResponseMessage GenerateUnauthorizedResponse(HttpRequestMessage requestMessage) - { - var responseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized) - { - Content = new StringContent(SerializeObject(new ODataRequestException - { - Code = HttpStatusCode.Unauthorized, - Message = new ODataExceptionMessage { Language = "en-US", Message = "Unauthorized" } - }), Encoding.UTF8, "application/json"), - RequestMessage = requestMessage - }; - - responseMessage.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Bearer")); - - return responseMessage; - } - - protected HttpResponseMessage GenerateNoContentResponse(HttpRequestMessage requestMessage) - { - var responseMessage = new HttpResponseMessage(HttpStatusCode.NoContent) - { - RequestMessage = requestMessage - }; - - return responseMessage; - } - - protected string SerializeObject(object obj) - { - var serializer = GetSerializer(); - - var writer = new StringWriter(); - serializer.Serialize(writer, obj); - - return writer.ToString(); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Requests/QueryTests.cs b/Tests/ShareFile.Api.Client.Tests/Requests/QueryTests.cs deleted file mode 100644 index 4b7bb59..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Requests/QueryTests.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -using NUnit.Framework; -using ShareFile.Api.Client.Requests; -using FakeItEasy; - -using FluentAssertions; - -namespace ShareFile.Api.Client.Core.Tests.Requests -{ - [TestFixture] - public class QueryTests : BaseTests - { - [Test] - public void WithBaseUri() - { - // Arrange - var client = A.Fake(); - var query = new Query(client); - - // Act - query.WithBaseUri(new Uri("https://secure.sf-api.com/sf/v3")); - - // Assert - query.GetBaseUri().Should().Be(new Uri("https://secure.sf-api.com/sf/v3/")); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/ShareFile.Api.Client.Tests.csproj b/Tests/ShareFile.Api.Client.Tests/ShareFile.Api.Client.Tests.csproj deleted file mode 100644 index ec07f4e..0000000 --- a/Tests/ShareFile.Api.Client.Tests/ShareFile.Api.Client.Tests.csproj +++ /dev/null @@ -1,123 +0,0 @@ - - - - - Debug - AnyCPU - {C0ED01C3-56BF-4F15-BD51-A7588CAB8C88} - Library - Properties - ShareFile.Api.Client.Tests - ShareFile.Api.Client.Tests - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\..\packages\FakeItEasy.1.22.0\lib\net40\FakeItEasy.dll - - - False - ..\..\packages\FluentAssertions.3.0.107\lib\net45\FluentAssertions.dll - - - False - ..\..\packages\FluentAssertions.3.0.107\lib\net45\FluentAssertions.Core.dll - - - ..\..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll - True - - - False - ..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll - - - - - - - ..\..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Extensions.dll - - - False - ..\..\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Primitives.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - - - {5adb6950-d609-4847-a842-0bdd6cdbbfb9} - ShareFile.Api.Client-net45 - - - - - - - - - - \ No newline at end of file diff --git a/Tests/ShareFile.Api.Client.Tests/Transfers/CompleteBytesTests.cs b/Tests/ShareFile.Api.Client.Tests/Transfers/CompleteBytesTests.cs deleted file mode 100644 index a47f1c9..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Transfers/CompleteBytesTests.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; - -using FluentAssertions; - -using NUnit.Framework; - -using ShareFile.Api.Client.Core.Tests; -using ShareFile.Api.Client.Transfers.Uploaders; - -namespace ShareFile.Api.Client.Tests.Uploaders -{ - [TestFixture] - public class CompleteBytesTests : BaseTests - { - [Test] - public void Add_InOrder() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(10, 10); - state.Add(20, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(30); - } - - [Test] - public void Add_SkipSomeBytes() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(40, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(10); - } - - [Test] - public void Add_NonZeroStart() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(40, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(0); - } - - [Test] - public void Add_OutOfOrderAndSkipped() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(40, 10); - state.Add(20, 10); - state.Add(10, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(30); - } - - [Test] - public void Add_OutOfOrder() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(30, 10); - state.Add(20, 10); - state.Add(10, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(40); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Transfers/DownloaderTests.cs b/Tests/ShareFile.Api.Client.Tests/Transfers/DownloaderTests.cs deleted file mode 100644 index 0894b0a..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Transfers/DownloaderTests.cs +++ /dev/null @@ -1,129 +0,0 @@ -using NUnit.Framework; -using ShareFile.Api.Client.Tests.Transfers; -using ShareFile.Api.Client.Transfers; -using ShareFile.Api.Client.Transfers.Downloaders; -using System; -using System.IO; -using System.Linq; - -namespace ShareFile.Api.Client.Core.Tests -{ - [TestFixture] - public class DownloaderTests : TransferBaseTests - { - private IShareFileClient shareFileClient; - private ShareFile.Api.Models.Folder testFolder; - private Models.Item file; - - [SetUp] - public void Setup() - { - shareFileClient = GetShareFileClient(); - var rootFolder = shareFileClient.Items.Get().Execute(); - testFolder = new ShareFile.Api.Models.Folder { Name = RandomString(30) }; - testFolder = shareFileClient.Items.CreateFolder(rootFolder.url, testFolder).Execute(); - - var fileToUpload = GetFileToUpload(4 * 1024 * 1024, false); - var uploadSpec = new UploadSpecificationRequest - { - FileName = fileToUpload.Name, - FileSize = fileToUpload.Length, - Parent = testFolder.url - }; - - var uploader = shareFileClient.GetFileUploader(uploadSpec, fileToUpload); - UploadResponse uploadResponse = uploader.Upload(); - file = shareFileClient.Items.Get(shareFileClient.Items.GetEntityUriFromId(uploadResponse.First().Id)).Execute(); - } - - [TearDown] - public void TearDown() - { - shareFileClient.Items.Delete(testFolder.url).Execute(); - } - - [TestCase(false)] - [TestCase(true)] - public async void DownloadRangeRequest_Async(bool supportsDLSpec) - { - // Arrange - var downloader = shareFileClient.GetAsyncFileDownloader(file); - var destinationStream = new MemoryStream(4 * 1024 * 1024); - var rangeRequests = Enumerable.Range(1, 4).Select(x => new RangeRequest - { - Begin = (x - 1) * 1024 * 1024, - End = x * 1024 * 1024 - }); - - await downloader.PrepareDownloadAsync(); - - foreach (var rangeRequest in rangeRequests) - { - // Act - await downloader.DownloadToAsync(destinationStream, rangeRequest: rangeRequest); - - // Assert - Assert.GreaterOrEqual(destinationStream.Position, rangeRequest.End.GetValueOrDefault()); - } - } - - [Test] - public void DownloadRangeRequest_Async_ThrowsIfNotPrepared() - { - // Arrange - var downloader = shareFileClient.GetAsyncFileDownloader(file); - var destinationStream = new MemoryStream(4 * 1024 * 1024); - var rangeRequests = Enumerable.Range(1, 4).Select(x => new RangeRequest - { - Begin = (x - 1) * 1024 * 1024, - End = x * 1024 * 1024 - }); - var rangeRequest = rangeRequests.First(); - - // Act / Assert - Assert.Throws(async () => await downloader.DownloadToAsync(destinationStream, rangeRequest: rangeRequest)); - } - - [TestCase(false)] - [TestCase(true)] - public void DownloadRangeRequest_Sync(bool supportsDLSpec) - { - // Arrange - var downloader = shareFileClient.GetFileDownloader(file); - var destinationStream = new MemoryStream(4 * 1024 * 1024); - var rangeRequests = Enumerable.Range(1, 4).Select(x => new RangeRequest - { - Begin = (x - 1) * 1024 * 1024, - End = x * 1024 * 1024 - }); - - downloader.PrepareDownload(); - - foreach (var rangeRequest in rangeRequests) - { - // Act - downloader.DownloadTo(destinationStream, rangeRequest: rangeRequest); - - // Assert - Assert.GreaterOrEqual(destinationStream.Position, rangeRequest.End.GetValueOrDefault()); - } - } - - [Test] - public void DownloadRangeRequest_Sync_ThrowsIfNotPrepared() - { - // Arrange - var downloader = shareFileClient.GetFileDownloader(file); - var destinationStream = new MemoryStream(4 * 1024 * 1024); - var rangeRequests = Enumerable.Range(1, 4).Select(x => new RangeRequest - { - Begin = (x - 1) * 1024 * 1024, - End = x * 1024 * 1024 - }); - var rangeRequest = rangeRequests.First(); - - // Act / Assert - Assert.Throws(() => downloader.DownloadTo(destinationStream, rangeRequest: rangeRequest)); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Transfers/TransferBaseTests.cs b/Tests/ShareFile.Api.Client.Tests/Transfers/TransferBaseTests.cs deleted file mode 100644 index 131c8a8..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Transfers/TransferBaseTests.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Newtonsoft.Json; -using NUnit.Framework; -using ShareFile.Api.Client.Core.Tests; -using ShareFile.Api.Client.FileSystem; -using ShareFile.Api.Client.Security.Authentication.OAuth2; -using System; -using System.IO; -using System.Security.Cryptography; - -namespace ShareFile.Api.Client.Tests.Transfers -{ - public abstract class TransferBaseTests : BaseTests - { - private object oauthTokenLock = new object(); - private OAuthToken token = null; - - protected IShareFileClient GetShareFileClient() - { - try - { - using (var fileStream = System.IO.File.OpenRead("TestConfig.json")) - using (var streamReader = new StreamReader(fileStream)) - { - var info = streamReader.ReadToEnd(); - var userInfo = JsonConvert.DeserializeObject(info); - - var sfClient = new ShareFileClient(userInfo.GetBaseUri().ToString()); - lock (oauthTokenLock) - { - if (token == null) - { - var oauthService = new OAuthService(sfClient, userInfo.ClientId, userInfo.ClientSecret); - token = oauthService.GetPasswordGrantRequestQuery(userInfo.Email, userInfo.Password, userInfo.Subdomain, userInfo.Domain).Execute(); - } - } - - sfClient.BaseUri = token.GetUri(); - sfClient.AddOAuthCredentials(token); - return sfClient; - } - } - catch (Exception exception) - { - Assert.Inconclusive(string.Format("No UserInfo found in TestConfig.json. Exception: {0}", exception)); - throw; - } - } - - protected PlatformFileStream GetFileToUpload(int size, bool useNonAsciiFilename) - { - var bytes = new byte[size]; - - RandomNumberGenerator.Create().GetBytes(bytes); - - return new PlatformFileStream(new MemoryStream(bytes), (long)size, - useNonAsciiFilename ? GetNonAsciiFilename() : RandomString(20)); - } - - private string GetNonAsciiFilename() - { - return @"nonascii_貴社ますますご盛栄のこととお慶び申し上げます。平素は格別のご高配を賜り、厚く御礼申し上げます。.txt"; - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Transfers/UploaderTests.cs b/Tests/ShareFile.Api.Client.Tests/Transfers/UploaderTests.cs deleted file mode 100644 index c1bc217..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Transfers/UploaderTests.cs +++ /dev/null @@ -1,291 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; - -using FakeItEasy; - -using FluentAssertions; -using NUnit.Framework; - -using ShareFile.Api.Client.Exceptions; -using ShareFile.Api.Client.Requests.Executors; -using ShareFile.Api.Client.Transfers.Uploaders; -using ShareFile.Api.Models; -using ShareFile.Api.Client.Transfers; -using ShareFile.Api.Client.Tests.Transfers; - -namespace ShareFile.Api.Client.Core.Tests -{ - public class UploaderTests : TransferBaseTests - { - [TestCase(UploadMethod.Standard, 1, true, false, true)] - [TestCase(UploadMethod.Standard, 1, false, false, true)] - [TestCase(UploadMethod.Threaded, 1, true, false, true)] - [TestCase(UploadMethod.Threaded, 1, false, false, true)] - [TestCase(UploadMethod.Standard, 4, true, false, true)] - [TestCase(UploadMethod.Standard, 4, false, false, true)] - [TestCase(UploadMethod.Threaded, 4, true, false, true)] - [TestCase(UploadMethod.Threaded, 4, false, false, true)] - [TestCase(UploadMethod.Standard, 1, false, true, true)] - [TestCase(UploadMethod.Standard, 1, true, true, true)] - [TestCase(UploadMethod.Threaded, 1, false, true, true)] - [TestCase(UploadMethod.Threaded, 1, true, true, true)] - [TestCase(UploadMethod.Standard, 1, true, false, false)] - [TestCase(UploadMethod.Standard, 1, false, false, false)] - [TestCase(UploadMethod.Threaded, 1, true, false, false)] - [TestCase(UploadMethod.Threaded, 1, false, false, false)] - [TestCase(UploadMethod.Standard, 4, true, false, false)] - [TestCase(UploadMethod.Standard, 4, false, false, false)] - [TestCase(UploadMethod.Threaded, 4, true, false, false)] - [TestCase(UploadMethod.Threaded, 4, false, false, false)] - [TestCase(UploadMethod.Standard, 1, false, true, false)] - [TestCase(UploadMethod.Standard, 1, true, true, false)] - [TestCase(UploadMethod.Threaded, 1, false, true, false)] - [TestCase(UploadMethod.Threaded, 1, true, true, false)] - public async void Upload(UploadMethod uploadMethod, int megabytes, bool useAsync, bool useNonAsciiFilename, bool useRaw) - { - var shareFileClient = GetShareFileClient(); - var rootFolder = shareFileClient.Items.Get().Execute(); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - - testFolder = shareFileClient.Items.CreateFolder(rootFolder.url, testFolder).Execute(); - var file = GetFileToUpload(1024 * 1024 * megabytes, useNonAsciiFilename); - //var uploadSpec = new UploadSpecificationRequest(file.Name, file.Length, testFolder.url, uploadMethod); - var uploadSpec = new UploadSpecificationRequest - { - FileName = file.Name, - FileSize = file.Length, - Parent = testFolder.url, - Method = uploadMethod, - Raw = useRaw - }; - UploaderBase uploader; - - if (useAsync) - { - uploader = shareFileClient.GetAsyncFileUploader(uploadSpec, file); - } - else - { - uploader = shareFileClient.GetFileUploader(uploadSpec, file); - } - Assert.AreEqual(uploadSpec.Raw, useRaw); - - var progressInvocations = 0; - var bytesTransferred = 0L; - uploader.OnTransferProgress += (sender, args) => - { - bytesTransferred = args.Progress.BytesTransferred; - progressInvocations++; - }; - - UploadResponse uploadResponse; - - if (useAsync) - { - uploadResponse = await ((AsyncUploaderBase)uploader).UploadAsync(); - } - else - { - uploadResponse = ((SyncUploaderBase)uploader).Upload(); - } - - shareFileClient.Items.Delete(testFolder.url); - - uploadResponse.FirstOrDefault().Should().NotBeNull(); - var expectedInvocations = Math.Ceiling((double)file.Length / UploaderBase.DefaultBufferLength) + 1; - - bytesTransferred.Should().Be(1024 * 1024 * megabytes); - - if (uploadMethod == UploadMethod.Standard) - { - progressInvocations.Should().Be((int)expectedInvocations, "Standard should be predictable for number of progress callbacks"); - } - else if (uploadMethod == UploadMethod.Threaded) - { - progressInvocations.Should() - .BeLessOrEqualTo( - (int)expectedInvocations, - "Threaded scales, therefore byte ranges vary and are less predictable. We should see no more expectedInvoations"); - } - } - - - [TestCase(10, true, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(10, false, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(ScalingFileUploader))] - [TestCase(10, true, new[] { CapabilityName.StandardUploadForms, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(10, false, new[] { CapabilityName.StandardUploadForms, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(ScalingFileUploader))] - [TestCase(10, true, null, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(10, false, null, ExpectedResult = typeof(ScalingFileUploader))] - [TestCase(1, true, new[] { CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(1, false, new[] { CapabilityName.AdvancedSearch }, ExpectedResult = typeof(ScalingFileUploader))] - [TestCase(1, true, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncStandardFileUploader))] - [TestCase(1, false, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(StandardFileUploader))] - [TestCase(1, true, new[] { CapabilityName.StandardUploadForms, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncStandardFileUploader))] - [TestCase(1, false, new[] { CapabilityName.StandardUploadForms, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(StandardFileUploader))] - [TestCase(1, true, null, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(1, false, null, ExpectedResult = typeof(ScalingFileUploader))] - public Type VerifyUploader(int megabytes, bool useAsync, CapabilityName[] capabilityNames) - { - var shareFileClient = GetShareFileClient(); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - var file = GetFileToUpload(1024 * 1024 * megabytes, false); - var useRaw = !(capabilityNames != null && (capabilityNames.Contains(CapabilityName.StandardUploadForms))); - var uploadSpec = new UploadSpecificationRequest - { - FileName = file.Name, - FileSize = file.Length, - Parent = testFolder.url, - Raw=useRaw, - }; - if (capabilityNames != null) - { - uploadSpec.ProviderCapabilities = - new List(capabilityNames.Select(x => new Capability { Name = x })); - } - - UploaderBase uploader; - - if (useAsync) - { - uploader = shareFileClient.GetAsyncFileUploader(uploadSpec, file); - } - else - { - uploader = shareFileClient.GetFileUploader(uploadSpec, file); - } - return uploader.GetType(); - } - - private AsyncScalingFileUploader SetupUploader(int serverMaxThreadsd, int userMaxThreads, int fileSize, bool useRaw) - { - var client = (ShareFileClient)GetShareFileClient(true); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - testFolder.url = new Uri("https://sf-api.com/sf/v3/Items(parent)"); - var file = GetFileToUpload(1024 * 1024 * fileSize, false); - var uploadState = new ActiveUploadState(new UploadSpecification { MaxNumberOfThreads = serverMaxThreadsd }, 0); - uploadState.UploadSpecification.ChunkUri = new Uri("http://localhost/"); - //var uploadSpec = new UploadSpecificationRequest(file.Name, file.Length, testFolder.url); - var uploadSpec = new UploadSpecificationRequest - { - FileName = file.Name, - FileSize = file.Length, - Parent = testFolder.url, - Raw = useRaw - }; - Assert.AreEqual(uploadSpec.Raw, useRaw); - var config = new FileUploaderConfig { NumberOfThreads = userMaxThreads }; - var uploader = new AsyncScalingFileUploader(client, uploadState, uploadSpec, file, config); - // Setup the call in PrepareAsync that makes sure the folder is available - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.That.Matches(i => i.RequestUri.ToString().StartsWith("https://sf-api.com/sf/v3/Items(parent)")), - A.Ignored, - A.Ignored)) - .Returns(GenerateODataObjectResponse(new HttpRequestMessage(), - @"{ ""Name"":""file.jpg"", - ""odata.metadata"":""https://citrix.sf-api.com/sf/v3/$metadata#Items/ShareFile.Api.Models.File@Element"", - ""odata.type"":""ShareFile.Api.Models.File"",}")); - return uploader; - } - - [TestCase(0, 0, 1, true)] - [TestCase(0, 4, 1, true)] - [TestCase(4, 2, 2, true)] - [TestCase(4, 8, 4, true)] - [TestCase(4, 0, 1, true)] - [TestCase(0, 0, 1, false)] - [TestCase(0, 4, 1, false)] - [TestCase(4, 2, 2, false)] - [TestCase(4, 8, 4, false)] - [TestCase(4, 0, 1, false)] - public async void AsyncScalingFileUploader_LimitThreads(int max, int specified, int expected, bool useRaw) - { - // Arrange - var uploader = SetupUploader(max, specified, 10, useRaw); - - // Act - await uploader.PrepareAsync(); - - // Assert - uploader.PartUploader.NumberOfThreads.Should().Be(expected); - } - - [TestCase(true,1, ExpectedResult = 1)] - [TestCase(true,7, ExpectedResult = 1)] - [TestCase(true,8, ExpectedResult = 2)] - [TestCase(true,15, ExpectedResult = 2)] - [TestCase(true,16, ExpectedResult = 3)] - [TestCase(true,24, ExpectedResult = 4)] - [TestCase(true,50, ExpectedResult = 4)] - [TestCase(false,1, ExpectedResult = 1)] - [TestCase(false,7, ExpectedResult = 1)] - [TestCase(false,8, ExpectedResult = 2)] - [TestCase(false,15, ExpectedResult = 2)] - [TestCase(false,16, ExpectedResult = 3)] - [TestCase(false,24, ExpectedResult = 4)] - [TestCase(false,50, ExpectedResult = 4)] - public async Task AsyncScalingFileUploader_LimitThreadsBasedOnFileSize(bool useRaw, int fileSize) - { - // Arrange - var uploader = SetupUploader(4, 4, fileSize, useRaw); - - // Act - try - { - await uploader.UploadAsync(); - } - catch (UploadException) - { - // Didn't setup the actual API calls, but we don't need that part to succeed - } - - // Assert - return uploader.PartUploader.NumberOfThreads; - } - - [TestCase(0, 0, 1, true)] - [TestCase(0, 4, 1, true)] - [TestCase(4, 2, 2, true)] - [TestCase(4, 8, 4, true)] - [TestCase(4, 0, 1, true)] - [TestCase(0, 0, 1, false)] - [TestCase(0, 4, 1, false)] - [TestCase(4, 2, 2, false)] - [TestCase(4, 8, 4, false)] - [TestCase(4, 0, 1, false)] - public void ScalingFileUploader_ChangeNumberOfThreads(int max, int specified, int expected, bool useRaw) - { - // Arrange - var client = (ShareFileClient)GetShareFileClient(); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - testFolder.url = new Uri("https://sf-api.com/sf/v3/Items(parent)"); - var file = GetFileToUpload(1024 * 1024 * 10, false); - var uploadState = new ActiveUploadState(new UploadSpecification { MaxNumberOfThreads = max }, 0); - //var uploadSpec = new UploadSpecificationRequest(file.Name, file.Length, testFolder.url); - var uploadSpec = new UploadSpecificationRequest - { - FileName = file.Name, - FileSize = file.Length, - Parent = testFolder.url, - Raw = useRaw - }; - - var config = new FileUploaderConfig { NumberOfThreads = specified }; - var uploader = new ScalingFileUploader(client, uploadState, uploadSpec, file, config); - Assert.AreEqual(uploadSpec.Raw, useRaw); - // Act - // The upload part is not fully setup, but we don't need to get that far, so let it throw - Assert.Throws(() => uploader.Upload()); - - // Assert - uploader.PartUploader.NumberOfThreads.Should().Be(expected); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Uploaders/CompleteBytesTests.cs b/Tests/ShareFile.Api.Client.Tests/Uploaders/CompleteBytesTests.cs deleted file mode 100644 index a47f1c9..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Uploaders/CompleteBytesTests.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; - -using FluentAssertions; - -using NUnit.Framework; - -using ShareFile.Api.Client.Core.Tests; -using ShareFile.Api.Client.Transfers.Uploaders; - -namespace ShareFile.Api.Client.Tests.Uploaders -{ - [TestFixture] - public class CompleteBytesTests : BaseTests - { - [Test] - public void Add_InOrder() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(10, 10); - state.Add(20, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(30); - } - - [Test] - public void Add_SkipSomeBytes() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(40, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(10); - } - - [Test] - public void Add_NonZeroStart() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(40, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(0); - } - - [Test] - public void Add_OutOfOrderAndSkipped() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(40, 10); - state.Add(20, 10); - state.Add(10, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(30); - } - - [Test] - public void Add_OutOfOrder() - { - // Arrange - var state = new CompletedBytes(); - - // Act - state.Add(0, 10); - state.Add(30, 10); - state.Add(20, 10); - state.Add(10, 10); - - // Assert - state.CompletedThroughPosition.Should().Be(40); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/Uploaders/UploaderTests.cs b/Tests/ShareFile.Api.Client.Tests/Uploaders/UploaderTests.cs deleted file mode 100644 index 1397fc8..0000000 --- a/Tests/ShareFile.Api.Client.Tests/Uploaders/UploaderTests.cs +++ /dev/null @@ -1,285 +0,0 @@ -using System.Diagnostics; -using System.Security.Cryptography; - -using ShareFile.Api.Client.FileSystem; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -using FakeItEasy; - -using FluentAssertions; -using NUnit.Framework; -using Newtonsoft.Json; - -using ShareFile.Api.Client.Exceptions; -using ShareFile.Api.Client.Logging; -using ShareFile.Api.Client.Requests.Executors; -using ShareFile.Api.Client.Security.Authentication.OAuth2; -using ShareFile.Api.Client.Transfers.Uploaders; -using ShareFile.Api.Models; -using ShareFile.Api.Client.Transfers; - -namespace ShareFile.Api.Client.Core.Tests.Uploaders -{ - public class UploaderTests : BaseTests - { - private object oauthTokenLock = new object(); - private OAuthToken token = null; - - protected IShareFileClient GetShareFileClient() - { - try - { - using (var fileStream = System.IO.File.OpenRead("TestConfig.json")) - using (var streamReader = new StreamReader(fileStream)) - { - var info = streamReader.ReadToEnd(); - var userInfo = JsonConvert.DeserializeObject(info); - - var sfClient = new ShareFileClient(userInfo.GetBaseUri().ToString()); - lock (oauthTokenLock) - { - if (token == null) - { - var oauthService = new OAuthService(sfClient, userInfo.ClientId, userInfo.ClientSecret); - token = oauthService.GetPasswordGrantRequestQuery(userInfo.Email, userInfo.Password, userInfo.Subdomain, userInfo.Domain).Execute(); - } - } - - sfClient.BaseUri = token.GetUri(); - sfClient.AddOAuthCredentials(token); - return sfClient; - } - } - catch (Exception exception) - { - Assert.Inconclusive(string.Format("No UserInfo found in TestConfig.json. Exception: {0}", exception)); - throw; - } - } - - protected PlatformFileStream GetFileToUpload(int size, bool useNonAsciiFilename) - { - var bytes = new byte[size]; - - RandomNumberGenerator.Create().GetBytes(bytes); - - return new PlatformFileStream(new MemoryStream(bytes), (long)size, - useNonAsciiFilename ? GetNonAsciiFilename() : RandomString(20)); - } - - [TestCase(UploadMethod.Standard, 1, true, false)] - [TestCase(UploadMethod.Standard, 1, false, false)] - [TestCase(UploadMethod.Threaded, 1, true, false)] - [TestCase(UploadMethod.Threaded, 1, false, false)] - [TestCase(UploadMethod.Standard, 4, true, false)] - [TestCase(UploadMethod.Standard, 4, false, false)] - [TestCase(UploadMethod.Threaded, 4, true, false)] - [TestCase(UploadMethod.Threaded, 4, false, false)] - [TestCase(UploadMethod.Standard, 1, false, true)] - [TestCase(UploadMethod.Standard, 1, true, true)] - [TestCase(UploadMethod.Threaded, 1, false, true)] - [TestCase(UploadMethod.Threaded, 1, true, true)] - public async void Upload(UploadMethod uploadMethod, int megabytes, bool useAsync, bool useNonAsciiFilename) - { - var shareFileClient = GetShareFileClient(); - var rootFolder = shareFileClient.Items.Get().Execute(); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - - testFolder = shareFileClient.Items.CreateFolder(rootFolder.url, testFolder).Execute(); - var file = GetFileToUpload(1024 * 1024 * megabytes, useNonAsciiFilename); - var uploadSpec = new UploadSpecificationRequest(file.Name, file.Length, testFolder.url, uploadMethod); - - UploaderBase uploader; - - if (useAsync) - { - uploader = shareFileClient.GetAsyncFileUploader(uploadSpec, file); - } - else - { - uploader = shareFileClient.GetFileUploader(uploadSpec, file); - } - - var progressInvocations = 0; - var bytesTransferred = 0L; - uploader.OnTransferProgress += (sender, args) => - { - bytesTransferred = args.Progress.BytesTransferred; - progressInvocations++; - }; - - UploadResponse uploadResponse; - - if (useAsync) - { - uploadResponse = await ((AsyncUploaderBase)uploader).UploadAsync(); - } - else - { - uploadResponse = ((SyncUploaderBase)uploader).Upload(); - } - - shareFileClient.Items.Delete(testFolder.url); - - uploadResponse.FirstOrDefault().Should().NotBeNull(); - var expectedInvocations = Math.Ceiling((double)file.Length / UploaderBase.DefaultBufferLength) + 1; - - bytesTransferred.Should().Be(1024 * 1024 * megabytes); - - if (uploadMethod == UploadMethod.Standard) - { - progressInvocations.Should().Be((int)expectedInvocations, "Standard should be predictable for number of progress callbacks"); - } - else if (uploadMethod == UploadMethod.Threaded) - { - progressInvocations.Should() - .BeLessOrEqualTo( - (int)expectedInvocations, - "Threaded scales, therefore byte ranges vary and are less predictable. We should see no more expectedInvoations"); - } - } - - [TestCase(10, true, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(10, false, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(ScalingFileUploader))] - [TestCase(10, true, null, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(10, false, null, ExpectedResult = typeof(ScalingFileUploader))] - [TestCase(1, true, new[] { CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(1, false, new[] { CapabilityName.AdvancedSearch }, ExpectedResult = typeof(ScalingFileUploader))] - [TestCase(1, true, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(AsyncStandardFileUploader))] - [TestCase(1, false, new[] { CapabilityName.StandardUploadRaw, CapabilityName.AdvancedSearch }, ExpectedResult = typeof(StandardFileUploader))] - [TestCase(1, true, null, ExpectedResult = typeof(AsyncScalingFileUploader))] - [TestCase(1, false, null, ExpectedResult = typeof(ScalingFileUploader))] - public Type VerifyUploader(int megabytes, bool useAsync, CapabilityName[] capabilityNames) - { - var shareFileClient = GetShareFileClient(); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - var file = GetFileToUpload(1024 * 1024 * megabytes, false); - var uploadSpec = new UploadSpecificationRequest(file.Name, file.Length, testFolder.url); - if (capabilityNames != null) - { - uploadSpec.ProviderCapabilities = - new List(capabilityNames.Select(x => new Capability { Name = x })); - } - - UploaderBase uploader; - - if (useAsync) - { - uploader = shareFileClient.GetAsyncFileUploader(uploadSpec, file); - } - else - { - uploader = shareFileClient.GetFileUploader(uploadSpec, file); - } - - return uploader.GetType(); - } - - private AsyncScalingFileUploader SetupUploader(int serverMaxThreadsd, int userMaxThreads, int fileSize) - { - var client = (ShareFileClient)GetShareFileClient(true); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - testFolder.url = new Uri("https://sf-api.com/sf/v3/Items(parent)"); - var file = GetFileToUpload(1024 * 1024 * fileSize, false); - var uploadState = new ActiveUploadState(new UploadSpecification { MaxNumberOfThreads = serverMaxThreadsd }, 0); - uploadState.UploadSpecification.ChunkUri = new Uri("http://localhost/"); - var uploadSpec = new UploadSpecificationRequest(file.Name, file.Length, testFolder.url); - var config = new FileUploaderConfig { NumberOfThreads = userMaxThreads }; - var uploader = new AsyncScalingFileUploader(client, uploadState, uploadSpec, file, config); - // Setup the call in PrepareAsync that makes sure the folder is available - A.CallTo( - () => - RequestExecutorFactory.GetAsyncRequestExecutor() - .SendAsync( - A.Ignored, - A.That.Matches(i => i.RequestUri.ToString().StartsWith("https://sf-api.com/sf/v3/Items(parent)")), - A.Ignored, - A.Ignored)) - .Returns(GenerateODataObjectResponse(new HttpRequestMessage(), - @"{ ""Name"":""file.jpg"", - ""odata.metadata"":""https://citrix.sf-api.com/sf/v3/$metadata#Items/ShareFile.Api.Models.File@Element"", - ""odata.type"":""ShareFile.Api.Models.File"",}")); - return uploader; - } - - [TestCase(0, 0, 1)] - [TestCase(0, 4, 1)] - [TestCase(4, 2, 2)] - [TestCase(4, 8, 4)] - [TestCase(4, 0, 1)] - public async void AsyncScalingFileUploader_LimitThreads(int max, int specified, int expected) - { - // Arrange - var uploader = SetupUploader(max, specified, 10); - - // Act - await uploader.PrepareAsync(); - - // Assert - uploader.PartUploader.NumberOfThreads.Should().Be(expected); - } - - [TestCase(1, ExpectedResult = 1)] - [TestCase(7, ExpectedResult = 1)] - [TestCase(8, ExpectedResult = 2)] - [TestCase(15, ExpectedResult = 2)] - [TestCase(16, ExpectedResult = 3)] - [TestCase(24, ExpectedResult = 4)] - [TestCase(50, ExpectedResult = 4)] - public async Task AsyncScalingFileUploader_LimitThreadsBasedOnFileSize(int fileSize) - { - // Arrange - var uploader = SetupUploader(4, 4, fileSize); - - // Act - try - { - await uploader.UploadAsync(); - } - catch (UploadException) - { - // Didn't setup the actual API calls, but we don't need that part to succeed - } - - // Assert - return uploader.PartUploader.NumberOfThreads; - } - - [TestCase(0, 0, 1)] - [TestCase(0, 4, 1)] - [TestCase(4, 2, 2)] - [TestCase(4, 8, 4)] - [TestCase(4, 0, 1)] - public void ScalingFileUploader_ChangeNumberOfThreads(int max, int specified, int expected) - { - // Arrange - var client = (ShareFileClient)GetShareFileClient(); - var testFolder = new Folder { Name = RandomString(30) + ".txt" }; - testFolder.url = new Uri("https://sf-api.com/sf/v3/Items(parent)"); - var file = GetFileToUpload(1024 * 1024 * 10, false); - var uploadState = new ActiveUploadState(new UploadSpecification { MaxNumberOfThreads = max }, 0); - var uploadSpec = new UploadSpecificationRequest(file.Name, file.Length, testFolder.url); - var config = new FileUploaderConfig { NumberOfThreads = specified }; - var uploader = new ScalingFileUploader(client, uploadState, uploadSpec, file, config); - - // Act - // The upload part is not fully setup, but we don't need to get that far, so let it throw - Assert.Throws(() => uploader.Upload()); - - // Assert - uploader.PartUploader.NumberOfThreads.Should().Be(expected); - } - - private string GetNonAsciiFilename() - { - return @"nonascii_貴社ますますご盛栄のこととお慶び申し上げます。平素は格別のご高配を賜り、厚く御礼申し上げます。.txt"; - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/UserInfo.cs b/Tests/ShareFile.Api.Client.Tests/UserInfo.cs deleted file mode 100644 index cf4ffa8..0000000 --- a/Tests/ShareFile.Api.Client.Tests/UserInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ShareFile.Api.Client.Core.Tests -{ - public class UserInfo - { - public string Email { get; set; } - public string Password { get; set; } - public string Subdomain { get; set; } - public string Domain { get; set; } - public string ClientId { get; set; } - public string ClientSecret { get; set; } - - public Uri GetBaseUri() - { - return new Uri(string.Format("https://{0}.{1}", Subdomain, Domain)); - } - } -} diff --git a/Tests/ShareFile.Api.Client.Tests/packages.config b/Tests/ShareFile.Api.Client.Tests/packages.config deleted file mode 100644 index 2e679cd..0000000 --- a/Tests/ShareFile.Api.Client.Tests/packages.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/global.json b/global.json deleted file mode 100644 index b51e28b..0000000 --- a/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "projects": [ "src", "test" ], - "sdk": { - "version": "1.0.0-preview1-002702" - } -} diff --git a/src/NuGetInfo.props b/src/NuGetInfo.props new file mode 100644 index 0000000000000000000000000000000000000000..abb26b45963c668b49726fa5d57bbf88ae79b22b GIT binary patch literal 1968 zcmchYTWi}u5QWckp#Q=2y;f-ZRMLQOnovkWXfE%zEMFS=f+Uyt&$s<%HX?Sc*cOH$ zq?LAO&p9)5B>nq)q8sI!>9QQT!E)w%Pg%*AB=lQBWZn3XAeT7KUn(xR6<4?xKo z+q%{d-N6&R$+W6IXo^u(fIT7O47@v-O72p0)oH3&TI#H*GR|#Cb-W9BMy|bptK+;@ znJ04DWDX4Ldp1!Y(4CV{sH}M=r9Osvs;^Y&*iXaS7P*OgL$wnQ!#$cHxu=EE`gY?r*I0c^cVjo}_5QfcHFx|^v~({H d{i||#ZTG`m)oP9pZ^+w!x0jgeza0L0{{fv4R>J@Q literal 0 HcmV?d00001 diff --git a/src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net40.csproj b/src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net40.csproj deleted file mode 100644 index 30521e9..0000000 --- a/src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net40.csproj +++ /dev/null @@ -1,99 +0,0 @@ - - - - - Debug - AnyCPU - {ADF05D45-5BED-42C0-8801-4995A57B9896} - Library - Properties - ShareFile.Api.Client - ShareFile.Api.Client - v4.0 - 512 - Client - ..\ - true - - - true - full - false - bin\Net40\Debug\ - TRACE;DEBUG;Net40;NO_CALLERMEMBER - prompt - 4 - - - pdbonly - true - bin\Net40\Release\ - TRACE;Net40;NO_CALLERMEMBER - prompt - 4 - - - - $(SolutionDir)packages\Newtonsoft.Json.8.0.2\lib\net40\Newtonsoft.Json.dll - True - - - - - $(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.IO.dll - - - - False - $(SolutionDir)packages\Microsoft.Net.Http.2.2.29\lib\net40\System.Net.Http.dll - - - False - $(SolutionDir)packages\Microsoft.Net.Http.2.2.29\lib\net40\System.Net.Http.Extensions.dll - - - False - $(SolutionDir)packages\Microsoft.Net.Http.2.2.29\lib\net40\System.Net.Http.Primitives.dll - - - False - $(SolutionDir)packages\Microsoft.Net.Http.2.2.29\lib\net40\System.Net.Http.WebRequest.dll - - - $(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.Runtime.dll - - - $(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.Threading.Tasks.dll - - - - - - - - - - %(RecursiveDir)%(Filename)%(Extension) - - - - - Designer - - - - - - - diff --git a/src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net45.csproj b/src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net45.csproj deleted file mode 100644 index 307fde7..0000000 --- a/src/ShareFile.Api.Client.Csproj/ShareFile.Api.Client-net45.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - AnyCPU - {5ADB6950-D609-4847-A842-0BDD6CDBBFB9} - Library - Properties - ShareFile.Api.Client - ShareFile.Api.Client - v4.5 - 512 - ..\ - - - true - full - false - bin\Net45\Debug\ - TRACE;DEBUG;ASYNC - prompt - 4 - bin\Net45\Debug\\ShareFile.Api.Client.XML - - - pdbonly - true - bin\Net45\Release\ - TRACE;ASYNC - prompt - 4 - bin\Net45\Release\\ShareFile.Api.Client.XML - - - - $(SolutionDir)packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll - True - - - - - - - - - %(RecursiveDir)%(Filename)%(Extension) - - - - - diff --git a/src/ShareFile.Api.Client.Csproj/app.config b/src/ShareFile.Api.Client.Csproj/app.config deleted file mode 100644 index 0195a71..0000000 --- a/src/ShareFile.Api.Client.Csproj/app.config +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ShareFile.Api.Client.Csproj/packages.config b/src/ShareFile.Api.Client.Csproj/packages.config deleted file mode 100644 index 11b34d8..0000000 --- a/src/ShareFile.Api.Client.Csproj/packages.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/ShareFile.Api.Client/Configuration.cs b/src/ShareFile.Api.Client/Configuration.cs index d5a3afd..6fd98c5 100644 --- a/src/ShareFile.Api.Client/Configuration.cs +++ b/src/ShareFile.Api.Client/Configuration.cs @@ -1,11 +1,15 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net; +using System.Net.Http; using System.Reflection; +using ShareFile.Api.Client.Credentials; using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Logging; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; +using System.Buffers; namespace ShareFile.Api.Client { @@ -26,6 +30,11 @@ public class Configuration /// public int HttpTimeout { get; set; } + /// + /// Optional. If set, all non-upload API requests use the HttpClient instance provided by this factory + /// + public Func HttpClientFactory { get; set; } + /// /// Register ProxyConfiguration to be used for all requests /// @@ -115,7 +124,7 @@ public static Configuration Default() LogPersonalInformation = false, LogFullResponse = false, UserAgent = "NET Client SDK/" + GetDefaultToolVersion(), - AlwaysPresentCredentials = false + AlwaysPresentCredentials = false, }; } @@ -147,5 +156,8 @@ public static string GetDefaultToolVersion() return _defaultToolVersion; } + + // must be less than 85k to avoid LOH allocation + internal const int BufferSize = 64 * 1024; } } diff --git a/src/ShareFile.Api.Client/Converters/LoggingConverter.cs b/src/ShareFile.Api.Client/Converters/LoggingConverter.cs index 9ab8ec1..2a202f0 100644 --- a/src/ShareFile.Api.Client/Converters/LoggingConverter.cs +++ b/src/ShareFile.Api.Client/Converters/LoggingConverter.cs @@ -40,6 +40,9 @@ public LoggingConverter(ShareFileClient client) _piiBlacklist.Add("CreatorLastName"); _piiBlacklist.Add("CreatorNameShort"); _piiBlacklist.Add("Company"); + _piiBlacklist.Add("Emails"); + _piiBlacklist.Add("Body"); + _piiBlacklist.Add("Message"); } public override bool CanConvert(Type objectType) diff --git a/src/ShareFile.Api.Client/Converters/ODataConverter.cs b/src/ShareFile.Api.Client/Converters/ODataConverter.cs index b451983..a37d6e5 100644 --- a/src/ShareFile.Api.Client/Converters/ODataConverter.cs +++ b/src/ShareFile.Api.Client/Converters/ODataConverter.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Converters { diff --git a/src/ShareFile.Api.Client/Converters/ODataFactory.cs b/src/ShareFile.Api.Client/Converters/ODataFactory.cs index c1fa1eb..e87df19 100644 --- a/src/ShareFile.Api.Client/Converters/ODataFactory.cs +++ b/src/ShareFile.Api.Client/Converters/ODataFactory.cs @@ -5,7 +5,7 @@ using System.Text.RegularExpressions; using Newtonsoft.Json; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; using Group = System.Text.RegularExpressions.Group; namespace ShareFile.Api.Client.Converters @@ -26,6 +26,8 @@ public static ODataFactory GetInstance() private static ODataFactory _instance = null; private static readonly Type ODataObjectType = typeof(ODataObject); + internal const string PlaftormODataObjectNamespace = "ShareFile.Api.Models."; + internal const string ClientODataObjectNamespace = "ShareFile.Api.Client.Models."; private static readonly Type ODataFeedType = typeof(ODataFeed<>); private ODataFactory() @@ -146,44 +148,22 @@ public ODataObject Create(string cast) var type = FindModelType(null, cast); return InvokeConstructor(type, null, null); } - - private static readonly Type UserType = typeof(User); - private static readonly Type PrincipalType = typeof(Principal); - - private static readonly Type ItemType = typeof(Item); - private static readonly Dictionary> ItemSubTypes = new Dictionary> - { - { typeof(File), id => id.StartsWith("fi") }, - { typeof(SymbolicLink), id => id.StartsWith("for") }, - { typeof(Folder), id => id.StartsWith("fo") || id.StartsWith("a") }, - { typeof(Note), id => id.StartsWith("n") }, - { typeof(Link), id => id.StartsWith("l") }, - { typeof(Group), id => id.StartsWith("g") } - }; public Type FindModelType(Type knownType, string cast) { Type type = knownType; // Normalize cast, remove namespaces - if (cast != null) - { - string namesp = ODataObjectType.Namespace; - if (cast.StartsWith(namesp)) cast = cast.Substring(namesp.Length + 1); - } - // If knownType is unknown, type to infer from the Cast string - if ((type == null || type == typeof(ODataObject)) && cast != null) + cast = FindAndTrimNamespace(cast); + + Type castType; + if (cast != null && _entityTypeMap.TryGetValue(cast, out castType)) { - type = _entityTypeMap.ContainsKey(cast) ? _entityTypeMap[cast] : null; + type = castType; } - if (type != null && type != typeof(ODataObject)) + else if (type == null) { - // Try the Cast string - if (cast != null && (type == ItemType || type == PrincipalType)) - { - type = _entityTypeMap.ContainsKey(cast) ? _entityTypeMap[cast] : type; - } + type = ODataObjectType; } - else type = ODataObjectType; if (_typeMap.ContainsKey(type)) { @@ -192,6 +172,26 @@ public Type FindModelType(Type knownType, string cast) return type; } + private string FindAndTrimNamespace(string cast) + { + if (cast == null) + { + return null; + } + + if (cast.StartsWith(PlaftormODataObjectNamespace)) + { + return cast.Substring(PlaftormODataObjectNamespace.Length); + } + + if (cast.StartsWith(ClientODataObjectNamespace)) + { + return cast.Substring(ClientODataObjectNamespace.Length); + } + + return cast; + } + /// /// Creates a new instance of ODataObject of the specified type. /// @@ -255,7 +255,7 @@ public ODataObject CreateFromUrl(string Url, ODataObject oDataObject, JsonSerial internal class JsonLightMetadataParser { internal static char[] SplitChars = {'/'}; - internal static string Namespace = ODataObjectType.Namespace + "."; + internal static string Namespace = PlaftormODataObjectNamespace; internal JsonLightMetadataParserResult Parse(string metadataUri) { @@ -378,9 +378,9 @@ public ODataObject CreateFromType(string type, Type knownType, ODataObject odata throw new ArgumentNullException("type"); } - if (type.StartsWith(ODataObjectType.Namespace, StringComparison.OrdinalIgnoreCase)) + if (type.StartsWith(PlaftormODataObjectNamespace, StringComparison.OrdinalIgnoreCase)) { - var typeWithoutNamespace = type.Substring(ODataObjectType.Namespace.Length + 1); + var typeWithoutNamespace = type.Substring(PlaftormODataObjectNamespace.Length); if (_entityTypeMap.ContainsKey(typeWithoutNamespace)) { return Create(knownType, typeWithoutNamespace, odataObject, serializer); diff --git a/src/ShareFile.Api.Client/Converters/SafeEnumConverter.cs b/src/ShareFile.Api.Client/Converters/SafeEnumConverter.cs index 53fb865..5fd3afb 100644 --- a/src/ShareFile.Api.Client/Converters/SafeEnumConverter.cs +++ b/src/ShareFile.Api.Client/Converters/SafeEnumConverter.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using Newtonsoft.Json; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Converters { diff --git a/src/ShareFile.Api.Client/Credentials/PlatformCredentialCache.cs b/src/ShareFile.Api.Client/Credentials/PlatformCredentialCache.cs index 47aa679..1f67ef7 100644 --- a/src/ShareFile.Api.Client/Credentials/PlatformCredentialCache.cs +++ b/src/ShareFile.Api.Client/Credentials/PlatformCredentialCache.cs @@ -1,4 +1,4 @@ -#if NET45 +#if NET45 || NET462 namespace ShareFile.Api.Client.Credentials { public class PlatformCredentialCache : System.Net.CredentialCache, ICredentialCache diff --git a/src/ShareFile.Api.Client/Entities/AccessControlsEntity.cs b/src/ShareFile.Api.Client/Entities/AccessControlsEntity.cs index b2e3c9e..5b6739e 100644 --- a/src/ShareFile.Api.Client/Entities/AccessControlsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/AccessControlsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -66,6 +66,8 @@ public interface IAccessControlsEntity : IEntityBase /// If CanDownload is set to true, CanView will automatically be set to true. /// If CanDownload is set to false, CanDelete will be set to false. /// In order for a user/group to be able to manage permissions, they must be able to upload, download, and delete. Otherwise it will be set to false. + /// + /// This endpoint can return an AsyncOperation if the request is to be fulfilled asynchronously /// /// /// @@ -73,7 +75,7 @@ public interface IAccessControlsEntity : IEntityBase /// /// /// - /// the created or modified AccessControl instance + /// the created or modified AccessControl instance, or AsyncOperation /// IQuery CreateByItem(Uri url, AccessControl accessControl, bool recursive = false, bool sendDefaultNotification = false, string message = null); @@ -94,12 +96,14 @@ public interface IAccessControlsEntity : IEntityBase /// Updates an existing Access Controls of a given Item. The Principal element cannot be modified, it is provided /// in the Body to identity the AccessControl element to be modified. You can provide an ID, Email or URL on the /// Principal object. + /// + /// This endpoint can return an AsyncOperation if the request is to be fulfilled asynchronously /// /// /// /// /// - /// the created or modified AccessControl instance + /// the created or modified AccessControl instance, or AsyncOperation /// IQuery UpdateByItem(Uri url, AccessControl accessControl, bool recursive = false); @@ -246,7 +250,7 @@ public interface IAccessControlsEntity : IEntityBase /// Delete multiple access controls /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// @@ -256,7 +260,7 @@ public interface IAccessControlsEntity : IEntityBase /// Delete multiple access controls for principal /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// @@ -266,12 +270,10 @@ public interface IAccessControlsEntity : IEntityBase /// Notify users that they have access to the parent folder /// /// - /// [ /// { /// UserIds: ["id1", "id2"], /// CustomMessage: "Message content goes here" /// } - /// ] /// /// /// All users should have access to the parent folder @@ -279,6 +281,13 @@ public interface IAccessControlsEntity : IEntityBase /// /// IQuery NotifyUsers(Uri folderUrl, NotifyUsersParams notifyUsersParams); + + /// + /// Shows preview of the folder user email + /// + /// + /// + IQuery NotifyUsersPreview(Uri folderUrl, NotifyUsersParams notifyUsersParams); } public class AccessControlsEntity : EntityBase, IAccessControlsEntity @@ -302,7 +311,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -318,10 +327,10 @@ public IQuery Get(Uri url) public IQuery> GetByItem(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -346,6 +355,8 @@ public IQuery> GetByItem(Uri url) /// If CanDownload is set to true, CanView will automatically be set to true. /// If CanDownload is set to false, CanDelete will be set to false. /// In order for a user/group to be able to manage permissions, they must be able to upload, download, and delete. Otherwise it will be set to false. + /// + /// This endpoint can return an AsyncOperation if the request is to be fulfilled asynchronously /// /// /// @@ -353,19 +364,19 @@ public IQuery> GetByItem(Uri url) /// /// /// - /// the created or modified AccessControl instance + /// the created or modified AccessControl instance, or AsyncOperation /// public IQuery CreateByItem(Uri url, AccessControl accessControl, bool recursive = false, bool sendDefaultNotification = false, string message = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(url); sfApiQuery.QueryString("recursive", recursive); sfApiQuery.QueryString("sendDefaultNotification", sendDefaultNotification); accessControl.AddProperty("Message", message); sfApiQuery.Body = accessControl; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -385,22 +396,24 @@ public IQuery CreateByItem(Uri url, AccessControl accessControl, /// Updates an existing Access Controls of a given Item. The Principal element cannot be modified, it is provided /// in the Body to identity the AccessControl element to be modified. You can provide an ID, Email or URL on the /// Principal object. + /// + /// This endpoint can return an AsyncOperation if the request is to be fulfilled asynchronously /// /// /// /// /// - /// the created or modified AccessControl instance + /// the created or modified AccessControl instance, or AsyncOperation /// public IQuery UpdateByItem(Uri url, AccessControl accessControl, bool recursive = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(url); sfApiQuery.QueryString("recursive", recursive); sfApiQuery.Body = accessControl; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -415,7 +428,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -476,12 +489,12 @@ public IQuery Delete(Uri url) public IQuery BulkSet(Uri url, AccessControlsBulkParams bulkParams) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(url); sfApiQuery.SubAction("BulkSet"); sfApiQuery.Body = bulkParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -537,12 +550,12 @@ public IQuery BulkSet(Uri url, AccessControlsBulkParams public IQuery BulkSetForPrincipal(AccessControlsBulkParams bulkParams, string principalId) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("AccessControls"); - sfApiQuery.Action("BulkSetForPrincipal"); + sfApiQuery.From("AccessControls"); + sfApiQuery.Action("BulkSetForPrincipal"); sfApiQuery.QueryString("principalId", principalId); sfApiQuery.Body = bulkParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -567,61 +580,59 @@ public IQuery BulkSetForPrincipal(AccessControlsBulkPar public IQuery Clone(AccessControlsCloneParams accessControlsCloneParams) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("AccessControls"); - sfApiQuery.Action("Clone"); + sfApiQuery.From("AccessControls"); + sfApiQuery.Action("Clone"); sfApiQuery.Body = accessControlsCloneParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// /// Delete multiple access controls /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// public IQuery BulkDelete(Uri folderUrl, IEnumerable principalIds) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(folderUrl); sfApiQuery.SubAction("BulkDelete"); sfApiQuery.Body = principalIds; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// /// Delete multiple access controls for principal /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// public IQuery BulkDeleteForPrincipal(IEnumerable folderIds, string principalId) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("AccessControls"); - sfApiQuery.Action("BulkDeleteForPrincipal"); + sfApiQuery.From("AccessControls"); + sfApiQuery.Action("BulkDeleteForPrincipal"); sfApiQuery.QueryString("principalId", principalId); sfApiQuery.Body = folderIds; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// /// Notify users that they have access to the parent folder /// /// - /// [ /// { /// UserIds: ["id1", "id2"], /// CustomMessage: "Message content goes here" /// } - /// ] /// /// /// All users should have access to the parent folder @@ -631,12 +642,28 @@ public IQuery BulkDeleteForPrincipal(IEnumerable folderIds, string princ public IQuery NotifyUsers(Uri folderUrl, NotifyUsersParams notifyUsersParams) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(folderUrl); sfApiQuery.SubAction("NotifyUsers"); sfApiQuery.Body = notifyUsersParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; + } + + /// + /// Shows preview of the folder user email + /// + /// + /// + public IQuery NotifyUsersPreview(Uri folderUrl, NotifyUsersParams notifyUsersParams) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("AccessControls"); + sfApiQuery.Uri(folderUrl); + sfApiQuery.SubAction("NotifyUsersPreview"); + sfApiQuery.Body = notifyUsersParams; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/AccountsEntity.cs b/src/ShareFile.Api.Client/Entities/AccountsEntity.cs index 98dc016..d2d0749 100644 --- a/src/ShareFile.Api.Client/Entities/AccountsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/AccountsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -64,10 +64,11 @@ public interface IAccountsEntity : IEntityBase /// Retrives the list of Employees in the Account /// Employees are named users in the Account. /// + /// /// /// A Feed containing all Employees Contacts in the account /// - IQuery> GetEmployees(); + IQuery> GetEmployees(bool withRightSignature = false); /// /// Get List of current Account Clients @@ -175,10 +176,11 @@ public interface IAccountsEntity : IEntityBase /// /// /// + /// /// /// The list of Accounts associated with this username/password. /// - IQuery> GetByUser(ODataObject parameters, string username, bool employeesonly = false, bool requirehomefolders = false, bool singleplane = false); + IQuery> GetByUser(ODataObject parameters, string username, bool employeesonly = false, bool requirehomefolders = false, bool singleplane = false, string clientId = null); /// /// Email List of Accounts to User @@ -220,7 +222,7 @@ public interface IAccountsEntity : IEntityBase /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// IQuery GetFolderAccessControlDomains(); @@ -231,7 +233,7 @@ public interface IAccountsEntity : IEntityBase /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -247,7 +249,7 @@ public interface IAccountsEntity : IEntityBase /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -263,7 +265,7 @@ public interface IAccountsEntity : IEntityBase /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -282,7 +284,7 @@ public interface IAccountsEntity : IEntityBase /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -302,7 +304,7 @@ public interface IAccountsEntity : IEntityBase /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -321,7 +323,7 @@ public interface IAccountsEntity : IEntityBase /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -439,10 +441,10 @@ public AccountsEntity (IShareFileClient client) public IQuery Get(string id = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); + sfApiQuery.From("Accounts"); sfApiQuery.QueryString("id", id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -458,10 +460,10 @@ public IQuery Get(string id = null) public IQuery GetBranding() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Branding"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Branding"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -477,11 +479,11 @@ public IQuery GetBranding() public IQuery UpdateBranding(Account account) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Branding"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Branding"); sfApiQuery.Body = account; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -491,16 +493,18 @@ public IQuery UpdateBranding(Account account) /// Retrives the list of Employees in the Account /// Employees are named users in the Account. /// + /// /// /// A Feed containing all Employees Contacts in the account /// - public IQuery> GetEmployees() + public IQuery> GetEmployees(bool withRightSignature = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Employees"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Employees"); + sfApiQuery.QueryString("withRightSignature", withRightSignature); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -517,10 +521,10 @@ public IQuery> GetEmployees() public IQuery> GetClients() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Clients"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Clients"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -539,12 +543,12 @@ public IQuery> GetClients() public IQuery> GetAddressBook(string type = "personal", string searchTerm = "") { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("AddressBook"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("AddressBook"); sfApiQuery.QueryString("type", type); sfApiQuery.QueryString("searchTerm", searchTerm); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -559,10 +563,10 @@ public IQuery> GetAddressBook(string type = "personal", strin public IQuery GetMobileSecuritySettings() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("MobileSecuritySettings"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("MobileSecuritySettings"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -574,10 +578,10 @@ public IQuery GetMobileSecuritySettings() public IQuery GetProductDefaults() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("ProductDefaults"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("ProductDefaults"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -589,10 +593,10 @@ public IQuery GetProductDefaults() public IQuery GetPreferences() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Preferences"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Preferences"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -606,12 +610,12 @@ public IQuery GetPreferences() public IQuery GetSSO(string provider = "saml", string idpEntityId = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("SSO"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("SSO"); sfApiQuery.QueryString("provider", provider); sfApiQuery.QueryString("idpEntityId", idpEntityId); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -637,12 +641,12 @@ public IQuery GetSSO(string provider = "saml", string idpEnt public IQuery UpdateSSO(SSOAccountProvider sso, string provider = "saml") { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("SSO"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("SSO"); sfApiQuery.QueryString("provider", provider); sfApiQuery.Body = sso; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -664,21 +668,23 @@ public IQuery UpdateSSO(SSOAccountProvider sso, string provi /// /// /// + /// /// /// The list of Accounts associated with this username/password. /// - public IQuery> GetByUser(ODataObject parameters, string username, bool employeesonly = false, bool requirehomefolders = false, bool singleplane = false) + public IQuery> GetByUser(ODataObject parameters, string username, bool employeesonly = false, bool requirehomefolders = false, bool singleplane = false, string clientId = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("GetByUser"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("GetByUser"); parameters.AddProperty("username", username); parameters.AddProperty("employeesonly", employeesonly); parameters.AddProperty("requirehomefolders", requirehomefolders); parameters.AddProperty("singleplane", singleplane); + parameters.AddProperty("clientId", clientId); sfApiQuery.Body = parameters; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -692,11 +698,11 @@ public IQuery> GetByUser(ODataObject parameters, string usern public IQuery SendToEmail(string email) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("SendToEmail"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("SendToEmail"); sfApiQuery.QueryString("email", email); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -714,10 +720,10 @@ public IQuery SendToEmail(string email) public IQuery GetLoginAccessControlDomains() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("LoginAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("LoginAccessControlDomains"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -736,16 +742,16 @@ public IQuery GetLoginAccessControlDomains() /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// public IQuery GetFolderAccessControlDomains() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("FolderAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("FolderAccessControlDomains"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -754,7 +760,7 @@ public IQuery GetFolderAccessControlDomains() /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -765,11 +771,11 @@ public IQuery GetFolderAccessControlDomains() public IQuery CreateLoginAccessControlDomains(AccessControlDomains accessControlDomains) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("LoginAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("LoginAccessControlDomains"); sfApiQuery.Body = accessControlDomains; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -778,7 +784,7 @@ public IQuery CreateLoginAccessControlDomains(AccessContro /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -789,11 +795,11 @@ public IQuery CreateLoginAccessControlDomains(AccessContro public IQuery CreateFolderAccessControlDomains(AccessControlDomains accessControlDomains) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("FolderAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("FolderAccessControlDomains"); sfApiQuery.Body = accessControlDomains; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -802,7 +808,7 @@ public IQuery CreateFolderAccessControlDomains(AccessContr /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -816,11 +822,11 @@ public IQuery CreateFolderAccessControlDomains(AccessContr public IQuery UpdateLoginAccessControlDomains(AccessControlDomains accessControlDomains) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("LoginAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("LoginAccessControlDomains"); sfApiQuery.Body = accessControlDomains; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -829,7 +835,7 @@ public IQuery UpdateLoginAccessControlDomains(AccessContro /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -844,11 +850,11 @@ public IQuery UpdateLoginAccessControlDomains(AccessContro public IQuery UpdateFolderAccessControlDomains(AccessControlDomains accessControlDomains) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("FolderAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("FolderAccessControlDomains"); sfApiQuery.Body = accessControlDomains; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -857,7 +863,7 @@ public IQuery UpdateFolderAccessControlDomains(AccessContr /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -871,11 +877,11 @@ public IQuery UpdateFolderAccessControlDomains(AccessContr public IQuery DeleteLoginAccessControlDomains(AccessControlDomains accessControlDomains) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("LoginAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("LoginAccessControlDomains"); sfApiQuery.Body = accessControlDomains; sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -884,7 +890,7 @@ public IQuery DeleteLoginAccessControlDomains(AccessControlDomains accessControl /// /// { /// "AccessControlType" : "AllowedDomains", - /// "Domains": ["domainA", "domainB", ...] + /// "Domains": ["domainA", "domainB"] /// } /// /// @@ -898,11 +904,11 @@ public IQuery DeleteLoginAccessControlDomains(AccessControlDomains accessControl public IQuery DeleteFolderAccessControlDomains(AccessControlDomains accessControlDomains) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("FolderAccessControlDomains"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("FolderAccessControlDomains"); sfApiQuery.Body = accessControlDomains; sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -917,13 +923,13 @@ public IQuery DeleteFolderAccessControlDomains(AccessControlDomains accessContro public IQuery RequireWebPop(string subdomain, string username = null, bool singlePlane = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("RequireWebPop"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("RequireWebPop"); sfApiQuery.QueryString("subdomain", subdomain); sfApiQuery.QueryString("username", username); sfApiQuery.QueryString("singlePlane", singlePlane); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -937,12 +943,12 @@ public IQuery RequireWebPop(string subdomain, string userna public IQuery RequireSubdomain(string username, bool singlePlane = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("RequireSubdomain"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("RequireSubdomain"); sfApiQuery.QueryString("username", username); sfApiQuery.QueryString("singlePlane", singlePlane); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -966,12 +972,12 @@ public IQuery RequireSubdomain(string username, bool sin public IQuery FindSubdomain(FindSubdomainParams findSubdomainParams, bool singlePlane = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("FindSubdomain"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("FindSubdomain"); sfApiQuery.QueryString("singlePlane", singlePlane); sfApiQuery.Body = findSubdomainParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -983,10 +989,10 @@ public IQuery FindSubdomain(FindSubdomainParams findSubdoma public IQuery GetOutlookInformation() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("OutlookInformation"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("OutlookInformation"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -999,11 +1005,11 @@ public IQuery GetOutlookInformation() public IQuery GetSSOInfo(string subdomain) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("SSOInfo"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("SSOInfo"); sfApiQuery.QueryString("subdomain", subdomain); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1015,19 +1021,19 @@ public IQuery GetSSOInfo(string subdomain) public IQuery> GetTenants() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Tenants"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Tenants"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } public IQuery GetTenants(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Tenants"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Tenants"); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1040,12 +1046,12 @@ public IQuery GetTenants(string id) public IQuery> GetZones(string parentid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("Tenants"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("Tenants"); sfApiQuery.ActionIds(parentid); sfApiQuery.SubAction("Zones"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1057,10 +1063,10 @@ public IQuery> GetZones(string parentid) public IQuery WebAppAdmin() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Accounts"); - sfApiQuery.Action("WebAppAdmin"); + sfApiQuery.From("Accounts"); + sfApiQuery.Action("WebAppAdmin"); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/AppsEntity.cs b/src/ShareFile.Api.Client/Entities/AppsEntity.cs new file mode 100644 index 0000000..9ff815b --- /dev/null +++ b/src/ShareFile.Api.Client/Entities/AppsEntity.cs @@ -0,0 +1,291 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using ShareFile.Api.Client; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; + + +namespace ShareFile.Api.Client.Entities +{ + public interface IAppsEntity : IEntityBase + { + + /// + /// Get Apps for Current User + /// + /// + /// A feed of ConnectedApp objects + /// + IQuery> Get(); + + /// + /// Get Apps for given User + /// + /// + /// + /// A feed of ConnectedApp objects + /// + IQuery> GetByUser(Uri userUrl); + IQuery Get(Uri url); + + /// + /// Get App by ID + /// + /// + /// + /// + /// ConnectedApp + /// + IQuery GetByUser(Uri userUrl, string appid); + + /// + /// Revoke App access for Current User + /// + /// + /// + /// + /// no data on success + /// + IQuery Delete(Uri appUrl); + + /// + /// Revoke App access for a given User + /// + /// + /// + /// + /// no data on success + /// + IQuery DeleteByUser(Uri userUrl, string appid); + + /// + /// Get all Two Factor Authentication Apps for the Current User + /// + /// + /// A feed of TwoFactorAuthApp objects + /// + IQuery> TFA(); + IQuery> GetTFAByUser(Uri url); + + /// + /// Get Two Factor Authentication App by ID for the Current User + /// + /// + /// + /// TwoFactorAuthApp + /// + IQuery TFA(string appid); + IQuery GetTFAByUser(Uri url, string tfaAppId); + + /// + /// Revoke Two Factor Auth App by ID + /// + /// + /// + /// no data on success + /// + IQuery DeleteTFA(string tfaAppId); + + /// + /// Revoke Two Factor Auth App by ID + /// + /// + /// + /// + /// no data on success + /// + IQuery DeleteTFA(Uri userUrl, string tfaAppId); + } + + public class AppsEntity : EntityBase, IAppsEntity + { + public AppsEntity (IShareFileClient client) + : base (client, "Apps") + { } + + + /// + /// Get Apps for Current User + /// + /// + /// A feed of ConnectedApp objects + /// + public IQuery> Get() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.From("Apps"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get Apps for given User + /// + /// + /// + /// A feed of ConnectedApp objects + /// + public IQuery> GetByUser(Uri userUrl) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.Action("Apps"); + sfApiQuery.Uri(userUrl); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + public IQuery Get(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get App by ID + /// + /// + /// + /// + /// ConnectedApp + /// + public IQuery GetByUser(Uri userUrl, string appid) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Apps"); + sfApiQuery.Uri(userUrl); + sfApiQuery.ActionIds(appid); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Revoke App access for Current User + /// + /// + /// + /// + /// no data on success + /// + public IQuery Delete(Uri appUrl) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(appUrl); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + + /// + /// Revoke App access for a given User + /// + /// + /// + /// + /// no data on success + /// + public IQuery DeleteByUser(Uri userUrl, string appid) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Apps"); + sfApiQuery.Uri(userUrl); + sfApiQuery.ActionIds(appid); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + + /// + /// Get all Two Factor Authentication Apps for the Current User + /// + /// + /// A feed of TwoFactorAuthApp objects + /// + public IQuery> TFA() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.From("Apps"); + sfApiQuery.Action("TFA"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + public IQuery> GetTFAByUser(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.Action("TFA"); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get Two Factor Authentication App by ID for the Current User + /// + /// + /// + /// TwoFactorAuthApp + /// + public IQuery TFA(string appid) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("Apps"); + sfApiQuery.Action("TFA"); + sfApiQuery.ActionIds(appid); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + public IQuery GetTFAByUser(Uri url, string tfaAppId) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("TFA"); + sfApiQuery.Uri(url); + sfApiQuery.ActionIds(tfaAppId); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Revoke Two Factor Auth App by ID + /// + /// + /// + /// no data on success + /// + public IQuery DeleteTFA(string tfaAppId) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("Apps"); + sfApiQuery.Action("TFA"); + sfApiQuery.ActionIds(tfaAppId); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + + /// + /// Revoke Two Factor Auth App by ID + /// + /// + /// + /// + /// no data on success + /// + public IQuery DeleteTFA(Uri userUrl, string tfaAppId) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("TFA"); + sfApiQuery.Uri(userUrl); + sfApiQuery.ActionIds(tfaAppId); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + } +} diff --git a/src/ShareFile.Api.Client/Entities/AsyncOperationsEntity.cs b/src/ShareFile.Api.Client/Entities/AsyncOperationsEntity.cs index e1fe15d..257e581 100644 --- a/src/ShareFile.Api.Client/Entities/AsyncOperationsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/AsyncOperationsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -144,7 +144,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -160,11 +160,11 @@ public IQuery Get(Uri url) public IQuery> GetByBatch(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("AsyncOperations"); - sfApiQuery.Action("GetByBatch"); + sfApiQuery.From("AsyncOperations"); + sfApiQuery.Action("GetByBatch"); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -180,11 +180,11 @@ public IQuery> GetByBatch(string id) public IQuery GetBatch(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("AsyncOperations"); - sfApiQuery.Action("GetBatch"); + sfApiQuery.From("AsyncOperations"); + sfApiQuery.Action("GetBatch"); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -201,19 +201,19 @@ public IQuery GetBatch(string id) public IQuery> GetByFolder(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("AsyncOperations"); - sfApiQuery.Action("GetByFolder"); + sfApiQuery.From("AsyncOperations"); + sfApiQuery.Action("GetByFolder"); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } public IQuery Create(AsyncOperation asyncOp) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("AsyncOperations"); + sfApiQuery.From("AsyncOperations"); sfApiQuery.Body = asyncOp; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -229,10 +229,10 @@ public IQuery Create(AsyncOperation asyncOp) public IQuery Cancel(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Cancel"); + sfApiQuery.Action("Cancel"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -247,7 +247,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -264,11 +264,11 @@ public IQuery Delete(Uri url) public IQuery> CancelBatch(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("AsyncOperations"); - sfApiQuery.Action("CancelBatch"); + sfApiQuery.From("AsyncOperations"); + sfApiQuery.Action("CancelBatch"); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -291,7 +291,7 @@ public IQuery Update(Uri url, AsyncOperation newAsyncOp) sfApiQuery.Uri(url); sfApiQuery.Body = newAsyncOp; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/CapabilitiesEntity.cs b/src/ShareFile.Api.Client/Entities/CapabilitiesEntity.cs index cfd0a86..9c32db6 100644 --- a/src/ShareFile.Api.Client/Entities/CapabilitiesEntity.cs +++ b/src/ShareFile.Api.Client/Entities/CapabilitiesEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -62,9 +62,9 @@ public CapabilitiesEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Capabilities"); + sfApiQuery.From("Capabilities"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/ConfigsEntity.cs b/src/ShareFile.Api.Client/Entities/ConfigsEntity.cs deleted file mode 100644 index 0349c13..0000000 --- a/src/ShareFile.Api.Client/Entities/ConfigsEntity.cs +++ /dev/null @@ -1,54 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. -// -// ------------------------------------------------------------------------------ -using System; -using System.Collections.Generic; -using ShareFile.Api.Models; -using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; -using ShareFile.Api.Client.Extensions; - - -namespace ShareFile.Api.Client.Entities -{ - public interface IConfigsEntity : IEntityBase - { - - /// - /// Get Configs - /// - /// - /// List of GenericConfg - /// - IQuery> Get(); - } - - public class ConfigsEntity : EntityBase, IConfigsEntity - { - public ConfigsEntity (IShareFileClient client) - : base (client, "Configs") - { } - - - /// - /// Get Configs - /// - /// - /// List of GenericConfg - /// - public IQuery> Get() - { - var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Configs"); - sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; - } - } -} diff --git a/src/ShareFile.Api.Client/Entities/ConnectorGroupsEntity.cs b/src/ShareFile.Api.Client/Entities/ConnectorGroupsEntity.cs index 3afb3a6..f2af268 100644 --- a/src/ShareFile.Api.Client/Entities/ConnectorGroupsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/ConnectorGroupsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -95,16 +95,16 @@ public interface IConnectorGroupsEntity : IEntityBase /// /// /// { - /// "Zones":[ + /// "Zones":[ { /// "Zone": {"Id":"ZoneId"}, - /// "StorageCenter": [ { "Id":"StorageCenterId" }, { ... } ], + /// "StorageCenter": [ { "Id":"StorageCenterId001" }, { "Id":"StorageCenterId002" } ], /// "ApiVersionMin":"v3", /// "ApiVersionMax":"v3", /// "IconUrl":"https://domain/icons", /// "FormUrl":"https://domain/forms" - /// ], + /// } ], /// "Id":"ServiceId", - /// "Name":""Name, + /// "Name":"Name", /// "Provider":"svc" /// } /// @@ -121,12 +121,12 @@ public interface IConnectorGroupsEntity : IEntityBase IQuery Create(ConnectorGroup connectorGroup); /// - /// Associates a Zone to an existing Connecto Group + /// Associates a Zone with an existing Connector Group /// /// /// { /// "Zone": {"Id":"ZoneId"}, - /// "StorageCenter": [ { "Id":"StorageCenterId" }, { ... } ], + /// "StorageCenter": [ { "Id":"StorageCenterId001" }, { "Id":"StorageCenterId002" } ], /// "ApiVersionMin":"v3", /// "ApiVersionMax":"v3", /// "IconUrl":"https://domain/icons", @@ -139,7 +139,7 @@ public interface IConnectorGroupsEntity : IEntityBase /// /// /// - /// the created or modified AccessControl instance + /// the created or modified ConnectorGroupZone instance /// IQuery CreateZones(Uri url, ConnectorGroupZone connectorGroupZone); @@ -176,7 +176,7 @@ public interface IConnectorGroupsEntity : IEntityBase /// /// /// - /// the created or modified AccessControl instance + /// the created or modified ConnectorGroupZone instance /// IQuery UpdateZones(Uri url, string zoneId, ConnectorGroupZone connectorGroupZone); @@ -263,9 +263,9 @@ public ConnectorGroupsEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("ConnectorGroups"); + sfApiQuery.From("ConnectorGroups"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -283,7 +283,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -296,11 +296,11 @@ public IQuery Get(Uri url) public IQuery ByProvider(string provider) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("ConnectorGroups"); - sfApiQuery.Action("ByProvider"); + sfApiQuery.From("ConnectorGroups"); + sfApiQuery.Action("ByProvider"); sfApiQuery.QueryString("provider", provider); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -316,11 +316,11 @@ public IQuery ByProvider(string provider) public IQuery GetZones(Uri url, string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Zones"); + sfApiQuery.Action("Zones"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -337,11 +337,11 @@ public IQuery GetZones(Uri url, string id) public IQuery GetAccessControls(Uri parentUrl, string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(parentUrl); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -357,11 +357,11 @@ public IQuery GetAccessControls(Uri parentUrl, stri public IQuery> GetByZone(string zoneid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("ConnectorGroups"); - sfApiQuery.Action("GetByZone"); + sfApiQuery.From("ConnectorGroups"); + sfApiQuery.Action("GetByZone"); sfApiQuery.ActionIds(zoneid); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -369,16 +369,16 @@ public IQuery> GetByZone(string zoneid) /// /// /// { - /// "Zones":[ + /// "Zones":[ { /// "Zone": {"Id":"ZoneId"}, - /// "StorageCenter": [ { "Id":"StorageCenterId" }, { ... } ], + /// "StorageCenter": [ { "Id":"StorageCenterId001" }, { "Id":"StorageCenterId002" } ], /// "ApiVersionMin":"v3", /// "ApiVersionMax":"v3", /// "IconUrl":"https://domain/icons", /// "FormUrl":"https://domain/forms" - /// ], + /// } ], /// "Id":"ServiceId", - /// "Name":""Name, + /// "Name":"Name", /// "Provider":"svc" /// } /// @@ -395,19 +395,19 @@ public IQuery> GetByZone(string zoneid) public IQuery Create(ConnectorGroup connectorGroup) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("ConnectorGroups"); + sfApiQuery.From("ConnectorGroups"); sfApiQuery.Body = connectorGroup; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// - /// Associates a Zone to an existing Connecto Group + /// Associates a Zone with an existing Connector Group /// /// /// { /// "Zone": {"Id":"ZoneId"}, - /// "StorageCenter": [ { "Id":"StorageCenterId" }, { ... } ], + /// "StorageCenter": [ { "Id":"StorageCenterId001" }, { "Id":"StorageCenterId002" } ], /// "ApiVersionMin":"v3", /// "ApiVersionMax":"v3", /// "IconUrl":"https://domain/icons", @@ -420,16 +420,16 @@ public IQuery Create(ConnectorGroup connectorGroup) /// /// /// - /// the created or modified AccessControl instance + /// the created or modified ConnectorGroupZone instance /// public IQuery CreateZones(Uri url, ConnectorGroupZone connectorGroupZone) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Zones"); + sfApiQuery.Action("Zones"); sfApiQuery.Uri(url); sfApiQuery.Body = connectorGroupZone; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -450,11 +450,11 @@ public IQuery CreateZones(Uri url, ConnectorGroupZone connec public IQuery CreateAccessControls(Uri url, ConnectorGroupAccessControl connectorGroupAcl) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(url); sfApiQuery.Body = connectorGroupAcl; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -473,17 +473,17 @@ public IQuery CreateAccessControls(Uri url, Connect /// /// /// - /// the created or modified AccessControl instance + /// the created or modified ConnectorGroupZone instance /// public IQuery UpdateZones(Uri url, string zoneId, ConnectorGroupZone connectorGroupZone) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Zones"); + sfApiQuery.Action("Zones"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(zoneId); sfApiQuery.Body = connectorGroupZone; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -498,7 +498,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -513,11 +513,11 @@ public IQuery Delete(Uri url) public IQuery DeleteZones(Uri serviceUrl, string zoneid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Zones"); + sfApiQuery.Action("Zones"); sfApiQuery.Uri(serviceUrl); sfApiQuery.ActionIds(zoneid); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -532,11 +532,11 @@ public IQuery DeleteZones(Uri serviceUrl, string zoneid) public IQuery DeleteAccessControls(Uri serviceUrl, string zoneid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("AccessControls"); + sfApiQuery.Action("AccessControls"); sfApiQuery.Uri(serviceUrl); sfApiQuery.ActionIds(zoneid); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -553,12 +553,12 @@ public IQuery DeleteAccessControls(Uri serviceUrl, string zoneid) public IQuery> GetStorageCenters(Uri url, string zoneid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Zones"); + sfApiQuery.Action("Zones"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(zoneid); sfApiQuery.SubAction("StorageCenters"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -581,13 +581,13 @@ public IQuery> GetStorageCenters(Uri url, string zoneid public IQuery> CreateStorageCenters(Uri url, string zoneid, StorageCenter storageCenter) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Zones"); + sfApiQuery.Action("Zones"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(zoneid); sfApiQuery.SubAction("StorageCenters"); sfApiQuery.Body = storageCenter; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/DevicesEntity.cs b/src/ShareFile.Api.Client/Entities/DevicesEntity.cs index cc0f050..9a86252 100644 --- a/src/ShareFile.Api.Client/Entities/DevicesEntity.cs +++ b/src/ShareFile.Api.Client/Entities/DevicesEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -104,9 +104,9 @@ public DevicesEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Devices"); + sfApiQuery.From("Devices"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -121,7 +121,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -134,10 +134,10 @@ public IQuery Get(Uri url) public IQuery> GetByUser(Uri parentUrl) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Devices"); + sfApiQuery.Action("Devices"); sfApiQuery.Uri(parentUrl); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -151,11 +151,11 @@ public IQuery> GetByUser(Uri parentUrl) public IQuery DeleteByUser(Uri parentUrl, string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Devices"); + sfApiQuery.Action("Devices"); sfApiQuery.Uri(parentUrl); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -169,11 +169,11 @@ public IQuery DeleteByUser(Uri parentUrl, string id) public IQuery Wipe(Uri deviceUrl, string userid = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Wipe"); + sfApiQuery.Action("Wipe"); sfApiQuery.Uri(deviceUrl); sfApiQuery.QueryString("userid", userid); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -187,11 +187,11 @@ public IQuery Wipe(Uri deviceUrl, string userid = null) public IQuery Lock(Uri deviceUrl, string userid = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Lock"); + sfApiQuery.Action("Lock"); sfApiQuery.Uri(deviceUrl); sfApiQuery.QueryString("userid", userid); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -205,11 +205,11 @@ public IQuery Lock(Uri deviceUrl, string userid = null) public IQuery Unlock(Uri deviceUrl, string userid = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Unlock"); + sfApiQuery.Action("Unlock"); sfApiQuery.Uri(deviceUrl); sfApiQuery.QueryString("userid", userid); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/EncryptedEmailsEntity.cs b/src/ShareFile.Api.Client/Entities/EncryptedEmailsEntity.cs new file mode 100644 index 0000000..ef69e66 --- /dev/null +++ b/src/ShareFile.Api.Client/Entities/EncryptedEmailsEntity.cs @@ -0,0 +1,507 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using ShareFile.Api.Client; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; + + +namespace ShareFile.Api.Client.Entities +{ + public interface IEncryptedEmailsEntity : IEntityBase + { + + /// + /// Get EncryptedEmail + /// + /// + /// Get EncryptedEmail by Id. If EncryptedEmail.RequireUserInfo is true, the user info query parameters are required. + /// + /// + /// EncryptedEmail with corresponding Id + /// + IQuery Get(Uri url, string firstName = null, string lastName = null, string email = null, string company = null); + + /// + /// Get EncryptedEmail Message Thread + /// + /// + /// Get list of EncryptedEmail objects in a single email thread.Only messages to which the current logged in User has access are returned.If EncryptedEmail.RequireUserInfo is true, the user info query parameters are required. + /// + /// + /// Feed of EncryptedEmail objects + /// + IQuery> Thread(Uri url, string firstName = null, string lastName = null, string email = null, string company = null); + + /// + /// Get EncryptedEmail by Share Id + /// + /// + /// Gets the EncryptedEmail associated with the Share. + /// + /// + /// + /// Associated EncryptedEmail + /// + IQuery GetEncryptedEmailByShare(Uri shareUrl); + + /// + /// Get Received EncryptedEmails + /// GET https://account.sf-api.com/sf/v3/EncryptedEmails/Received + /// + /// + /// Get list of EncryptedEmails received by the current User. + /// + /// + /// Feed of EncryptedEmails + /// + IQuery> Received(); + + /// + /// Get Sent EncryptedEmails + /// GET https://account.sf-api.com/sf/v3/EncryptedEmails/Sent + /// + /// + /// Get list of EncryptedEmails sent by the current User. + /// + /// + /// Feed of EncryptedEmails + /// + IQuery> Sent(); + + /// + /// Create EncryptedEmail + /// + /// + /// { + /// "ToRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "CcRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "Subject": "Email Subject", + /// "NotifyOnUse": true, + /// "ExpirationDays":180, + /// "RequireUserInfo": false, + /// "RequireLogin": true + /// } + /// + /// + /// Create a new empty EncryptedEmail without a body or attachments. This request does not Send the EncryptedEmail, + /// see the "Send EncryptedEmail" endpoint for steps to send a new EncryptedEmail + /// + /// + /// + /// EncryptedEmail + /// + IQuery Create(EncryptedEmailCreateParams encryptedEmailParams); + + /// + /// Reply to an EncryptedEmail + /// + /// + /// { + /// "ToRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "CcRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "Subject": "Email Subject", + /// "NotifyOnUse": true, + /// "ExpirationDays":180 + /// } + /// + /// + /// Create a new EncryptedEmail in reply to another EncryptedEmail. This request does not Send the EncryptedEmail, + /// see the "Send EncryptedEmail" endpoint for steps to send a new EncryptedEmail + /// + /// + /// + /// + /// Created EncryptedEmail + /// + IQuery Reply(Uri url, EncryptedEmailReplyParams encryptedEmailParams); + + /// + /// Reply to all EncryptedEmail Recipients + /// + /// + /// { + /// "Subject":"subject", + /// "ExpirationDays":180 + /// } + /// + /// + /// Create EncryptedEmail in Reply to all recipients in the EncryptedEmail identified by the provided Id, including + /// ToRecipients, CcRecipients, and BccRecipients. This request does not Send the EncryptedEmail, + /// see the "Send EncryptedEmail" endpoint for steps to send a new EncryptedEmail + /// + /// + /// + /// + /// Create EncryptedEmail + /// + IQuery ReplyAll(Uri url, EncryptedEmailParams encryptedEmailParams); + + /// + /// Send EncryptedEmail + /// + /// + /// { + /// "Message": {"Id": "messageFileId"}, + /// "Attachments": [{"Id": "id1"}, {"Id": "id2"}], + /// } + /// + /// + /// Sending an EncryptedEmail is a multi-step process:1. Create an empty EncryptedEmail using the "Create EncryptedEmail" or "Reply to EncryptedEmail" endpoints 2. Upload the message body as raw text or a text file using the "Upload EncryptedEmail Message" endpoint 3. Send the EncryptedEmail using the "Send EncryptedEmail" endpoint, providing the fileId uploaded in step 2 as + /// the "Message" Item parameter. Provide a list of optional Item attachments during this step as well + /// + /// + /// + IQuery Send(Uri url, EncryptedEmailSendParams encryptedEmailSendParams); + + /// + /// Upload EncryptedEmail Message + /// + /// + /// { + /// "Method":"Standard", + /// "Raw": true, + /// "FileName":"message.txt", + /// "FileSize": 0 + /// } + /// + /// + /// Upload EncryptedEmail message. For simplicity, it is recommended to send the request with the body parameter + /// "Raw": true. The Api endpoint will respond with an UploadSpecification object with a ChunkUri value, which is the url + /// to which the message body can be POSTed as a file. The "Raw" flag allows you to POST the EncryptedEmail body as a text + /// string in the Http request, instead of the traditional multi-part file approach, which is preferable for a simple text file. + /// This endpoint behaves the same way as Items(id)/Upload2, which can be referenced for more details + /// + /// + /// + /// + /// + /// UploadSpecification object + /// + IQuery Upload2(Uri parentUrl, UploadRequestParams uploadParams, int? expirationDays = null); + + /// + /// Download EncryptedEmail Message + /// + /// + /// + /// + /// + /// File if redirect=true, DownloadSpecification object otherwise + /// + IQuery Message(Uri url, string aliasId = null, bool redirect = true); + + /// + /// Delete EncryptedEmail + /// + /// + /// Access to message and attachments via created ShareAliases will be revoked as well. + /// + /// + IQuery Delete(Uri url); + } + + public class EncryptedEmailsEntity : EntityBase, IEncryptedEmailsEntity + { + public EncryptedEmailsEntity (IShareFileClient client) + : base (client, "EncryptedEmails") + { } + + + /// + /// Get EncryptedEmail + /// + /// + /// Get EncryptedEmail by Id. If EncryptedEmail.RequireUserInfo is true, the user info query parameters are required. + /// + /// + /// EncryptedEmail with corresponding Id + /// + public IQuery Get(Uri url, string firstName = null, string lastName = null, string email = null, string company = null) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.QueryString("firstName", firstName); + sfApiQuery.QueryString("lastName", lastName); + sfApiQuery.QueryString("email", email); + sfApiQuery.QueryString("company", company); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get EncryptedEmail Message Thread + /// + /// + /// Get list of EncryptedEmail objects in a single email thread.Only messages to which the current logged in User has access are returned.If EncryptedEmail.RequireUserInfo is true, the user info query parameters are required. + /// + /// + /// Feed of EncryptedEmail objects + /// + public IQuery> Thread(Uri url, string firstName = null, string lastName = null, string email = null, string company = null) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.Action("Thread"); + sfApiQuery.Uri(url); + sfApiQuery.QueryString("firstName", firstName); + sfApiQuery.QueryString("lastName", lastName); + sfApiQuery.QueryString("email", email); + sfApiQuery.QueryString("company", company); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get EncryptedEmail by Share Id + /// + /// + /// Gets the EncryptedEmail associated with the Share. + /// + /// + /// + /// Associated EncryptedEmail + /// + public IQuery GetEncryptedEmailByShare(Uri shareUrl) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("EncryptedEmail"); + sfApiQuery.Uri(shareUrl); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get Received EncryptedEmails + /// GET https://account.sf-api.com/sf/v3/EncryptedEmails/Received + /// + /// + /// Get list of EncryptedEmails received by the current User. + /// + /// + /// Feed of EncryptedEmails + /// + public IQuery> Received() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.From("EncryptedEmails"); + sfApiQuery.Action("Received"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get Sent EncryptedEmails + /// GET https://account.sf-api.com/sf/v3/EncryptedEmails/Sent + /// + /// + /// Get list of EncryptedEmails sent by the current User. + /// + /// + /// Feed of EncryptedEmails + /// + public IQuery> Sent() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.From("EncryptedEmails"); + sfApiQuery.Action("Sent"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Create EncryptedEmail + /// + /// + /// { + /// "ToRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "CcRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "Subject": "Email Subject", + /// "NotifyOnUse": true, + /// "ExpirationDays":180, + /// "RequireUserInfo": false, + /// "RequireLogin": true + /// } + /// + /// + /// Create a new empty EncryptedEmail without a body or attachments. This request does not Send the EncryptedEmail, + /// see the "Send EncryptedEmail" endpoint for steps to send a new EncryptedEmail + /// + /// + /// + /// EncryptedEmail + /// + public IQuery Create(EncryptedEmailCreateParams encryptedEmailParams) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("EncryptedEmails"); + sfApiQuery.Body = encryptedEmailParams; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Reply to an EncryptedEmail + /// + /// + /// { + /// "ToRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "CcRecipients":[{"Email":"email@domain.com"}, {"Email":"email2@domain.com"}], + /// "Subject": "Email Subject", + /// "NotifyOnUse": true, + /// "ExpirationDays":180 + /// } + /// + /// + /// Create a new EncryptedEmail in reply to another EncryptedEmail. This request does not Send the EncryptedEmail, + /// see the "Send EncryptedEmail" endpoint for steps to send a new EncryptedEmail + /// + /// + /// + /// + /// Created EncryptedEmail + /// + public IQuery Reply(Uri url, EncryptedEmailReplyParams encryptedEmailParams) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Reply"); + sfApiQuery.Uri(url); + sfApiQuery.Body = encryptedEmailParams; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Reply to all EncryptedEmail Recipients + /// + /// + /// { + /// "Subject":"subject", + /// "ExpirationDays":180 + /// } + /// + /// + /// Create EncryptedEmail in Reply to all recipients in the EncryptedEmail identified by the provided Id, including + /// ToRecipients, CcRecipients, and BccRecipients. This request does not Send the EncryptedEmail, + /// see the "Send EncryptedEmail" endpoint for steps to send a new EncryptedEmail + /// + /// + /// + /// + /// Create EncryptedEmail + /// + public IQuery ReplyAll(Uri url, EncryptedEmailParams encryptedEmailParams) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("ReplyAll"); + sfApiQuery.Uri(url); + sfApiQuery.Body = encryptedEmailParams; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Send EncryptedEmail + /// + /// + /// { + /// "Message": {"Id": "messageFileId"}, + /// "Attachments": [{"Id": "id1"}, {"Id": "id2"}], + /// } + /// + /// + /// Sending an EncryptedEmail is a multi-step process:1. Create an empty EncryptedEmail using the "Create EncryptedEmail" or "Reply to EncryptedEmail" endpoints 2. Upload the message body as raw text or a text file using the "Upload EncryptedEmail Message" endpoint 3. Send the EncryptedEmail using the "Send EncryptedEmail" endpoint, providing the fileId uploaded in step 2 as + /// the "Message" Item parameter. Provide a list of optional Item attachments during this step as well + /// + /// + /// + public IQuery Send(Uri url, EncryptedEmailSendParams encryptedEmailSendParams) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Send"); + sfApiQuery.Uri(url); + sfApiQuery.Body = encryptedEmailSendParams; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Upload EncryptedEmail Message + /// + /// + /// { + /// "Method":"Standard", + /// "Raw": true, + /// "FileName":"message.txt", + /// "FileSize": 0 + /// } + /// + /// + /// Upload EncryptedEmail message. For simplicity, it is recommended to send the request with the body parameter + /// "Raw": true. The Api endpoint will respond with an UploadSpecification object with a ChunkUri value, which is the url + /// to which the message body can be POSTed as a file. The "Raw" flag allows you to POST the EncryptedEmail body as a text + /// string in the Http request, instead of the traditional multi-part file approach, which is preferable for a simple text file. + /// This endpoint behaves the same way as Items(id)/Upload2, which can be referenced for more details + /// + /// + /// + /// + /// + /// UploadSpecification object + /// + public IQuery Upload2(Uri parentUrl, UploadRequestParams uploadParams, int? expirationDays = null) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Upload2"); + sfApiQuery.Uri(parentUrl); + sfApiQuery.QueryString("expirationDays", expirationDays); + sfApiQuery.Body = uploadParams; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Download EncryptedEmail Message + /// + /// + /// + /// + /// + /// File if redirect=true, DownloadSpecification object otherwise + /// + public IQuery Message(Uri url, string aliasId = null, bool redirect = true) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Message"); + sfApiQuery.Uri(url); + sfApiQuery.QueryString("aliasId", aliasId); + sfApiQuery.QueryString("redirect", redirect); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Delete EncryptedEmail + /// + /// + /// Access to message and attachments via created ShareAliases will be revoked as well. + /// + /// + public IQuery Delete(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + } +} diff --git a/src/ShareFile.Api.Client/Entities/FavoriteFoldersEntity.cs b/src/ShareFile.Api.Client/Entities/FavoriteFoldersEntity.cs index f310122..d8b0403 100644 --- a/src/ShareFile.Api.Client/Entities/FavoriteFoldersEntity.cs +++ b/src/ShareFile.Api.Client/Entities/FavoriteFoldersEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -137,10 +137,10 @@ public FavoriteFoldersEntity (IShareFileClient client) public IQuery> GetByUser(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("FavoriteFolders"); + sfApiQuery.Action("FavoriteFolders"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -157,11 +157,11 @@ public IQuery> GetByUser(Uri url) public IQuery GetByUser(Uri itemUrl, string userid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FavoriteFolders"); + sfApiQuery.Action("FavoriteFolders"); sfApiQuery.Uri(itemUrl); sfApiQuery.ActionIds(userid); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -177,10 +177,10 @@ public IQuery GetByUser(Uri itemUrl, string userid) public IQuery GetFavoriteFolderByItem(Uri parentUrl) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FavoriteFolder"); + sfApiQuery.Action("FavoriteFolder"); sfApiQuery.Uri(parentUrl); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -197,7 +197,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -220,11 +220,11 @@ public IQuery Get(Uri url) public IQuery CreateByUser(Uri url, FavoriteFolder folder) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FavoriteFolders"); + sfApiQuery.Action("FavoriteFolders"); sfApiQuery.Uri(url); sfApiQuery.Body = folder; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -245,11 +245,11 @@ public IQuery CreateByUser(Uri url, FavoriteFolder folder) public IQuery PatchByUser(Uri url, IEnumerable favoriteFolderList) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FavoriteFolders"); + sfApiQuery.Action("FavoriteFolders"); sfApiQuery.Uri(url); sfApiQuery.Body = favoriteFolderList; sfApiQuery.HttpMethod = "PUT"; - return sfApiQuery; + return sfApiQuery; } /// @@ -263,20 +263,20 @@ public IQuery PatchByUser(Uri url, IEnumerable favoriteFolderLis public IQuery Delete(Uri url, string itemid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FavoriteFolders"); + sfApiQuery.Action("FavoriteFolders"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(itemid); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } public IQuery DeleteByUser(Uri url, string itemId) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FavoriteFolders"); + sfApiQuery.Action("FavoriteFolders"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(itemId); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/FavoritesEntity.cs b/src/ShareFile.Api.Client/Entities/FavoritesEntity.cs new file mode 100644 index 0000000..4d285ad --- /dev/null +++ b/src/ShareFile.Api.Client/Entities/FavoritesEntity.cs @@ -0,0 +1,218 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using ShareFile.Api.Client; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; + + +namespace ShareFile.Api.Client.Entities +{ + public interface IFavoritesEntity : IEntityBase + { + + /// + /// Get a list of all Favorite Items marked by the user + /// + /// + /// + /// A list of Favorite Items + /// + IQuery> GetByUser(Uri userUrl); + + /// + /// Get a single Favorite Item for a User with a given streamid of the Item + /// + /// + /// A single Favorite Item + /// + IQuery GetByFavoriteItem(Uri url); + + /// + /// Mark an Item as Favorite + /// + /// + /// { + /// "Item": { "StreamID" : "itemStreamId" }, + /// "Alias" : "FileName", + /// "DisplayPosition" : 1 + /// } + /// + /// + /// Alias and DisplayPostion are not mandatory, the API assigns them if not provided + /// + /// + /// + /// + /// A single Favorite Item which was created with this request + /// + IQuery CreateByUser(Uri userUrl, Favorite itemToMarkFavorite); + + /// + /// Replace the Favorite Items for a User with the given list of new Favorite Items + /// + /// + /// [ + /// { + /// "Item": { "StreamID" : "item1StreamId" }, + /// "Alias" : "FileName1", + /// "DisplayPosition" : 1 + /// }, + /// { + /// "Item": { "StreamID" : "item2StreamId" }, + /// "Alias" : "FileName2", + /// "DisplayPosition" : 2 + /// } + /// ] + /// + /// + /// The DisplayPosition and Alias for each Item should be unique + /// + /// + /// + IQuery PatchByUser(Uri userUrl, IEnumerable favoriteItems); + + /// + /// Remove the given Favorite Item for a User + /// + IQuery Delete(Uri url); + + /// + /// Remove all Favorite Items for a User + /// + /// + IQuery DeleteInBulkByUser(Uri userUrl); + } + + public class FavoritesEntity : EntityBase, IFavoritesEntity + { + public FavoritesEntity (IShareFileClient client) + : base (client, "Favorites") + { } + + + /// + /// Get a list of all Favorite Items marked by the user + /// + /// + /// + /// A list of Favorite Items + /// + public IQuery> GetByUser(Uri userUrl) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.Action("Favorites"); + sfApiQuery.Uri(userUrl); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get a single Favorite Item for a User with a given streamid of the Item + /// + /// + /// A single Favorite Item + /// + public IQuery GetByFavoriteItem(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Mark an Item as Favorite + /// + /// + /// { + /// "Item": { "StreamID" : "itemStreamId" }, + /// "Alias" : "FileName", + /// "DisplayPosition" : 1 + /// } + /// + /// + /// Alias and DisplayPostion are not mandatory, the API assigns them if not provided + /// + /// + /// + /// + /// A single Favorite Item which was created with this request + /// + public IQuery CreateByUser(Uri userUrl, Favorite itemToMarkFavorite) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Favorites"); + sfApiQuery.Uri(userUrl); + sfApiQuery.Body = itemToMarkFavorite; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Replace the Favorite Items for a User with the given list of new Favorite Items + /// + /// + /// [ + /// { + /// "Item": { "StreamID" : "item1StreamId" }, + /// "Alias" : "FileName1", + /// "DisplayPosition" : 1 + /// }, + /// { + /// "Item": { "StreamID" : "item2StreamId" }, + /// "Alias" : "FileName2", + /// "DisplayPosition" : 2 + /// } + /// ] + /// + /// + /// The DisplayPosition and Alias for each Item should be unique + /// + /// + /// + public IQuery PatchByUser(Uri userUrl, IEnumerable favoriteItems) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Favorites"); + sfApiQuery.Uri(userUrl); + sfApiQuery.Body = favoriteItems; + sfApiQuery.HttpMethod = "PUT"; + return sfApiQuery; + } + + /// + /// Remove the given Favorite Item for a User + /// + public IQuery Delete(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + + /// + /// Remove all Favorite Items for a User + /// + /// + public IQuery DeleteInBulkByUser(Uri userUrl) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Favorites"); + sfApiQuery.Uri(userUrl); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + } +} diff --git a/src/ShareFile.Api.Client/Entities/FileLockEntity.cs b/src/ShareFile.Api.Client/Entities/FileLockEntity.cs index 4163614..d9a3e1d 100644 --- a/src/ShareFile.Api.Client/Entities/FileLockEntity.cs +++ b/src/ShareFile.Api.Client/Entities/FileLockEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -39,7 +39,7 @@ public interface IFileLockEntity : IEntityBase /// /// { /// "Owner":{Id:"ownerid"}, - /// "ExpirationTimeInMinutes":180; + /// "ExpirationTimeInMinutes":180 /// } /// /// @@ -115,10 +115,10 @@ public FileLockEntity (IShareFileClient client) public IQuery GetByItem(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FileLock"); + sfApiQuery.Action("FileLock"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -127,7 +127,7 @@ public IQuery GetByItem(Uri url) /// /// { /// "Owner":{Id:"ownerid"}, - /// "ExpirationTimeInMinutes":180; + /// "ExpirationTimeInMinutes":180 /// } /// /// @@ -142,11 +142,11 @@ public IQuery GetByItem(Uri url) public IQuery CreateByItem(Uri url, FileLock fileLock) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FileLock"); + sfApiQuery.Action("FileLock"); sfApiQuery.Uri(url); sfApiQuery.Body = fileLock; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -171,11 +171,11 @@ public IQuery CreateByItem(Uri url, FileLock fileLock) public IQuery UpdateByItem(Uri url, FileLock fileLock) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FileLock"); + sfApiQuery.Action("FileLock"); sfApiQuery.Uri(url); sfApiQuery.Body = fileLock; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -189,11 +189,11 @@ public IQuery UpdateByItem(Uri url, FileLock fileLock) public IQuery DeleteByItem(Uri url, string lockid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FileLock"); + sfApiQuery.Action("FileLock"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(lockid); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -207,12 +207,12 @@ public IQuery DeleteByItem(Uri url, string lockid) public IQuery Discard(Uri url, string lockid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FileLock"); + sfApiQuery.Action("FileLock"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(lockid); sfApiQuery.SubAction("Discard"); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/FolderTemplatesEntity.cs b/src/ShareFile.Api.Client/Entities/FolderTemplatesEntity.cs index 3e46379..4a7a36c 100644 --- a/src/ShareFile.Api.Client/Entities/FolderTemplatesEntity.cs +++ b/src/ShareFile.Api.Client/Entities/FolderTemplatesEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -39,7 +39,7 @@ public interface IFolderTemplatesEntity : IEntityBase /// /// { /// "Name": "Client Folder", - /// "Description": "For all client folders created in 2014 or after" + /// "Description": "For all client folders created in 2014 or after", /// "Items": [ /// { /// "Name": "Folder 1", @@ -53,6 +53,7 @@ public interface IFolderTemplatesEntity : IEntityBase /// "Name": "Folder 2" /// } /// ] + /// } /// /// /// Creates a new folder template. @@ -89,10 +90,12 @@ public interface IFolderTemplatesEntity : IEntityBase /// /// Updates an existing folder template /// + /// + /// /// /// The updated folder template /// - IQuery Update(FolderTemplate template); + IQuery Update(FolderTemplate template, bool overwrite = false); /// /// Delete Folder Template @@ -137,16 +140,16 @@ public FolderTemplatesEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("FolderTemplates"); + sfApiQuery.From("FolderTemplates"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } public IQuery Get(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -155,7 +158,7 @@ public IQuery Get(Uri url) /// /// { /// "Name": "Client Folder", - /// "Description": "For all client folders created in 2014 or after" + /// "Description": "For all client folders created in 2014 or after", /// "Items": [ /// { /// "Name": "Folder 1", @@ -169,6 +172,7 @@ public IQuery Get(Uri url) /// "Name": "Folder 2" /// } /// ] + /// } /// /// /// Creates a new folder template. @@ -179,10 +183,10 @@ public IQuery Get(Uri url) public IQuery Create(FolderTemplate template) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("FolderTemplates"); + sfApiQuery.From("FolderTemplates"); sfApiQuery.Body = template; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -212,16 +216,19 @@ public IQuery Create(FolderTemplate template) /// /// Updates an existing folder template /// + /// + /// /// /// The updated folder template /// - public IQuery Update(FolderTemplate template) + public IQuery Update(FolderTemplate template, bool overwrite = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("FolderTemplates"); + sfApiQuery.From("FolderTemplates"); + sfApiQuery.QueryString("overwrite", overwrite); sfApiQuery.Body = template; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -236,7 +243,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -254,12 +261,12 @@ public IQuery Delete(Uri url) public IQuery BulkApply(Uri templateUrl, string folderId, int batchSize = -1) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("BulkApply"); + sfApiQuery.Action("BulkApply"); sfApiQuery.Uri(templateUrl); sfApiQuery.QueryString("folderId", folderId); sfApiQuery.QueryString("batchSize", batchSize); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/GroupsEntity.cs b/src/ShareFile.Api.Client/Entities/GroupsEntity.cs index 4eedcd7..b85ade2 100644 --- a/src/ShareFile.Api.Client/Entities/GroupsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/GroupsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -142,6 +142,18 @@ public interface IGroupsEntity : IEntityBase /// The updated list of contacts for this group /// IQuery> DeleteContacts(Uri url, IEnumerable contacts); + + /// + /// Retrieve Groups associated with a User + /// + /// + /// Returns all groups the user is associated. This is currently limited to the authenticated user. + /// + /// + /// + /// Feed of Groups + /// + IQuery> GetByUser(Uri url); } public class GroupsEntity : EntityBase, IGroupsEntity @@ -163,9 +175,9 @@ public GroupsEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Groups"); + sfApiQuery.From("Groups"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -183,7 +195,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -198,7 +210,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -221,10 +233,10 @@ public IQuery Delete(Uri url) public IQuery Create(Group group) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Groups"); + sfApiQuery.From("Groups"); sfApiQuery.Body = group; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -252,7 +264,7 @@ public IQuery Update(Uri url, Group group) sfApiQuery.Uri(url); sfApiQuery.Body = group; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -268,10 +280,10 @@ public IQuery Update(Uri url, Group group) public IQuery> GetContacts(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Contacts"); + sfApiQuery.Action("Contacts"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -292,11 +304,11 @@ public IQuery> GetContacts(Uri url) public IQuery> CreateContacts(Uri url, IEnumerable contacts) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Contacts"); + sfApiQuery.Action("Contacts"); sfApiQuery.Uri(url); sfApiQuery.Body = contacts; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -321,11 +333,30 @@ public IQuery> CreateContacts(Uri url, IEnumerable c public IQuery> DeleteContacts(Uri url, IEnumerable contacts) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Contacts"); + sfApiQuery.Action("Contacts"); sfApiQuery.Uri(url); sfApiQuery.Body = contacts; sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; + } + + /// + /// Retrieve Groups associated with a User + /// + /// + /// Returns all groups the user is associated. This is currently limited to the authenticated user. + /// + /// + /// + /// Feed of Groups + /// + public IQuery> GetByUser(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.Action("Groups"); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/IrmClassificationsEntity.cs b/src/ShareFile.Api.Client/Entities/IrmClassificationsEntity.cs deleted file mode 100644 index c3066dc..0000000 --- a/src/ShareFile.Api.Client/Entities/IrmClassificationsEntity.cs +++ /dev/null @@ -1,55 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. -// -// ------------------------------------------------------------------------------ -using System; -using System.Collections.Generic; -using ShareFile.Api.Models; -using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; -using ShareFile.Api.Client.Extensions; - - -namespace ShareFile.Api.Client.Entities -{ - public interface IIrmClassificationsEntity : IEntityBase - { - - /// - /// Get a list of all file types supported by IRM - /// - /// - /// List of strings - /// - IQuery> GetSupportedFileExtensions(); - } - - public class IrmClassificationsEntity : EntityBase, IIrmClassificationsEntity - { - public IrmClassificationsEntity (IShareFileClient client) - : base (client, "IrmClassifications") - { } - - - /// - /// Get a list of all file types supported by IRM - /// - /// - /// List of strings - /// - public IQuery> GetSupportedFileExtensions() - { - var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("IrmClassifications"); - sfApiQuery.Action("SupportedFileExtensions"); - sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; - } - } -} diff --git a/src/ShareFile.Api.Client/Entities/ItemsEntity.cs b/src/ShareFile.Api.Client/Entities/ItemsEntity.cs index 346b456..423c977 100644 --- a/src/ShareFile.Api.Client/Entities/ItemsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/ItemsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -186,16 +186,17 @@ public interface IItemsEntity : IEntityBase /// /// /// + /// /// /// the download link for the provided item content. /// - IQuery Download(Uri url, bool redirect = true, bool includeAllVersions = false); + IQuery Download(Uri url, bool redirect = true, bool includeAllVersions = false, bool includeDeleted = false); /// /// Download Multiple Items /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// Initiate the download operation for items. It will return 302 redirection to the @@ -216,7 +217,8 @@ public interface IItemsEntity : IEntityBase /// { /// "Name":"Folder Name", /// "Description":"Description", - /// "Zone":{ "Id":"z014766e-8e96-4615-86aa-57132a69843c" } + /// "Zone":{ "Id":"ZoneId" }, + /// "ExpirationDate": "9999-12-31T23:59:59.9999999Z" /// } /// /// @@ -363,7 +365,7 @@ public interface IItemsEntity : IEntityBase /// "Name":"Name", /// "Uri":"https://server/path", /// "Description":"Description", - /// "Parent": { "Id": "parentid" }, + /// "Parent": { "Id": "parentid" } /// } /// /// @@ -384,7 +386,7 @@ public interface IItemsEntity : IEntityBase /// { /// "Name":"Name", /// "Description":"Description", - /// "Parent": { "Id": "parentid" }, + /// "Parent": { "Id": "parentid" } /// } /// /// @@ -433,7 +435,7 @@ public interface IItemsEntity : IEntityBase /// Delete Multiple Items /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// All items in bulk delete must be children of the same parent, identified in the URI @@ -468,10 +470,11 @@ public interface IItemsEntity : IEntityBase /// /// /// + /// /// /// A feed containing the path of folders from the specified root to the item, in order /// - IQuery> GetBreadcrumbs(Uri url, string path = null); + IQuery> GetBreadcrumbs(Uri url, string path = null, bool bubbleSharedPassthroughs = false); /// /// Copy Item @@ -497,8 +500,8 @@ public interface IItemsEntity : IEntityBase /// { /// "Method":"Method", /// "Raw": false, - /// "FileName":"FileName" - /// "FileLength": length + /// "FileName":"FileName", + /// "FileSize": 2048 /// } /// /// @@ -571,12 +574,13 @@ public interface IItemsEntity : IEntityBase /// /// /// + /// /// /// an Upload Specification element, containing the links for uploading, and the parameters for resume. /// The caller must know the protocol for sending the prepare, chunk and finish URLs returned in the spec; as well as /// negotiate the resume upload. /// - IQuery Upload(Uri url, UploadMethod method = UploadMethod.Standard, bool raw = false, string fileName = null, long fileSize = 0, string batchId = null, bool batchLast = false, bool canResume = false, bool startOver = false, bool unzip = false, string tool = "apiv3", bool overwrite = false, string title = null, string details = null, bool isSend = false, string sendGuid = null, string opid = null, int threadCount = 4, string responseFormat = "json", bool notify = false, DateTime? clientCreatedDateUTC = null, DateTime? clientModifiedDateUTC = null, int? expirationDays = null); + IQuery Upload(Uri url, UploadMethod method = UploadMethod.Standard, bool raw = false, string fileName = null, long fileSize = 0, string batchId = null, bool batchLast = false, bool canResume = false, bool startOver = false, bool unzip = false, string tool = "apiv3", bool overwrite = false, string title = null, string details = null, bool isSend = false, string sendGuid = null, string opid = null, int threadCount = 4, string responseFormat = "json", bool notify = false, DateTime? clientCreatedDateUTC = null, DateTime? clientModifiedDateUTC = null, int? expirationDays = null, string baseFileId = ""); IQuery Upload2(Uri url, UploadRequestParams uploadParams, int? expirationDays = null); /// @@ -656,20 +660,18 @@ public interface IItemsEntity : IEntityBase /// "ItemNameOnly":false /// }, /// "Paging":{ - /// "PageNumber":1, (Deprecated) - /// "PageSize":10, (Deprecated) - /// "Count": 50 + /// "Count": 50, /// "Skip": 0 /// }, /// "Sort":{ /// "SortBy":"", - /// "Ascending":false, + /// "Ascending":false /// }, /// "TimeoutInSeconds":10 /// } /// /// - /// Search for Items matching the criteria of the query parameter + /// Search for Items matching the criteria of the query parameter. Paging.PageNumber and Paging.PageSize are deprecated. /// /// /// @@ -683,29 +685,28 @@ public interface IItemsEntity : IEntityBase /// /// { /// "Query":{ - /// "ItemTypes":["type1", "type2", ...], - /// "ParentID":["id1", "id2", ...], - /// "CreatorID":["id1", "id2", ...], + /// "ItemTypes":["type1", "type2"], + /// "ParentID":["id1", "id2"], + /// "CreatorID":["id1", "id2"], /// "SearchQuery":"", /// "CreateStartDate":"", /// "CreateEndDate":"", /// "ItemNameOnly":false /// }, /// "Paging":{ - /// "PageNumber":1, (deprecated) - /// "PageSize":10, (deprecated) - /// "Count":50, (default value) - /// "Skip":0, (default value) + /// "Count":50, + /// "Skip":0 /// }, /// "Sort":{ /// "SortBy":"", - /// "Ascending":false, + /// "Ascending":false /// }, /// "TimeoutInSeconds":10 /// } /// /// - /// Search for Items matching the criteria of the query parameter + /// Search for Items matching the criteria of the query parameter. Paging.PageNumber and Paging.PageSize are deprecated. + /// Default values for Paging.Count is 50 and Paging.Skip is 0. /// /// /// @@ -826,9 +827,9 @@ public ItemsEntity (IShareFileClient client) public IQuery Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); + sfApiQuery.From("Items"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -853,7 +854,7 @@ public IQuery Get(Uri url, bool includeDeleted = false) sfApiQuery.Uri(url); sfApiQuery.QueryString("includeDeleted", includeDeleted); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -884,7 +885,7 @@ public IQuery Get(Uri url, TreeMode treeMode, string sourceId, bool canCre sfApiQuery.QueryString("canCreateRootFolder", canCreateRootFolder); sfApiQuery.QueryString("fileBox", fileBox); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -903,10 +904,10 @@ public IQuery Get(Uri url, TreeMode treeMode, string sourceId, bool canCre public IQuery> GetChildrenByConnectorGroup(Uri parentUrl) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Children"); + sfApiQuery.Action("Children"); sfApiQuery.Uri(parentUrl); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -927,11 +928,11 @@ public IQuery> GetChildrenByConnectorGroup(Uri parentUrl) public IQuery> Stream(Uri url, bool includeDeleted = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Stream"); + sfApiQuery.Action("Stream"); sfApiQuery.Uri(url); sfApiQuery.QueryString("includeDeleted", includeDeleted); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -949,11 +950,11 @@ public IQuery> Stream(Uri url, bool includeDeleted = false) public IQuery ByPath(string path) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("ByPath"); + sfApiQuery.From("Items"); + sfApiQuery.Action("ByPath"); sfApiQuery.QueryString("path", path); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -973,11 +974,11 @@ public IQuery ByPath(string path) public IQuery ByPath(Uri url, string path) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("ByPath"); + sfApiQuery.Action("ByPath"); sfApiQuery.Uri(url); sfApiQuery.QueryString("path", path); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -993,10 +994,10 @@ public IQuery ByPath(Uri url, string path) public IQuery GetParent(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Parent"); + sfApiQuery.Action("Parent"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1016,12 +1017,12 @@ public IQuery GetParent(Uri url) public IQuery> GetChildren(Uri url, bool includeDeleted = false, ItemOrderingMode orderingMode = ItemOrderingMode.Default) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Children"); + sfApiQuery.Action("Children"); sfApiQuery.Uri(url); sfApiQuery.QueryString("includeDeleted", includeDeleted); sfApiQuery.QueryString("orderingMode", orderingMode); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1038,10 +1039,10 @@ public IQuery> GetChildren(Uri url, bool includeDeleted = false, public IQuery GetInfo(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Info"); + sfApiQuery.Action("Info"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1055,25 +1056,27 @@ public IQuery GetInfo(Uri url) /// /// /// + /// /// /// the download link for the provided item content. /// - public IQuery Download(Uri url, bool redirect = true, bool includeAllVersions = false) + public IQuery Download(Uri url, bool redirect = true, bool includeAllVersions = false, bool includeDeleted = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Download"); + sfApiQuery.Action("Download"); sfApiQuery.Uri(url); sfApiQuery.QueryString("redirect", redirect); sfApiQuery.QueryString("includeAllVersions", includeAllVersions); + sfApiQuery.QueryString("includeDeleted", includeDeleted); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// /// Download Multiple Items /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// Initiate the download operation for items. It will return 302 redirection to the @@ -1088,12 +1091,12 @@ public IQuery GetInfo(Uri url) public IQuery BulkDownload(Uri parentUrl, IEnumerable ids, bool redirect = true) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("BulkDownload"); + sfApiQuery.Action("BulkDownload"); sfApiQuery.Uri(parentUrl); sfApiQuery.QueryString("redirect", redirect); sfApiQuery.Body = ids; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1103,7 +1106,8 @@ public IQuery GetInfo(Uri url) /// { /// "Name":"Folder Name", /// "Description":"Description", - /// "Zone":{ "Id":"z014766e-8e96-4615-86aa-57132a69843c" } + /// "Zone":{ "Id":"ZoneId" }, + /// "ExpirationDate": "9999-12-31T23:59:59.9999999Z" /// } /// /// @@ -1123,13 +1127,13 @@ public IQuery GetInfo(Uri url) public IQuery CreateFolder(Uri parentUrl, Folder folder, bool overwrite = false, bool passthrough = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Folder"); + sfApiQuery.Action("Folder"); sfApiQuery.Uri(parentUrl); sfApiQuery.QueryString("overwrite", overwrite); sfApiQuery.QueryString("passthrough", passthrough); sfApiQuery.Body = folder; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1152,11 +1156,11 @@ public IQuery CreateFolder(Uri parentUrl, Folder folder, bool overwrite public IQuery CreateNote(Uri parentUrl, Note note) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Note"); + sfApiQuery.Action("Note"); sfApiQuery.Uri(parentUrl); sfApiQuery.Body = note; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1180,11 +1184,11 @@ public IQuery CreateNote(Uri parentUrl, Note note) public IQuery CreateLink(Uri parentUrl, Link link) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Link"); + sfApiQuery.Action("Link"); sfApiQuery.Uri(parentUrl); sfApiQuery.Body = link; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1220,12 +1224,12 @@ public IQuery CreateLink(Uri parentUrl, Link link) public IQuery CreateSymbolicLink(Uri parentUrl, SymbolicLink symlink, bool overwrite = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("SymbolicLink"); + sfApiQuery.Action("SymbolicLink"); sfApiQuery.Uri(parentUrl); sfApiQuery.QueryString("overwrite", overwrite); sfApiQuery.Body = symlink; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1249,12 +1253,12 @@ public IQuery CreateSymbolicLink(Uri parentUrl, SymbolicLink symli public IQuery CreateChildrenByConnectorGroup(Uri url, SymbolicLink symlink, bool overwrite = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Children"); + sfApiQuery.Action("Children"); sfApiQuery.Uri(url); sfApiQuery.QueryString("overwrite", overwrite); sfApiQuery.Body = symlink; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1296,7 +1300,7 @@ public IQuery Update(Uri url, Item item, string batchid = null, long batch sfApiQuery.QueryString("notify", notify); sfApiQuery.Body = item; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1307,7 +1311,7 @@ public IQuery Update(Uri url, Item item, string batchid = null, long batch /// "Name":"Name", /// "Uri":"https://server/path", /// "Description":"Description", - /// "Parent": { "Id": "parentid" }, + /// "Parent": { "Id": "parentid" } /// } /// /// @@ -1322,13 +1326,13 @@ public IQuery Update(Uri url, Item item, string batchid = null, long batch public IQuery UpdateLink(string id, Link link, bool notify = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("Link"); + sfApiQuery.From("Items"); + sfApiQuery.Action("Link"); sfApiQuery.ActionIds(id); sfApiQuery.QueryString("notify", notify); sfApiQuery.Body = link; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1338,7 +1342,7 @@ public IQuery UpdateLink(string id, Link link, bool notify = false) /// { /// "Name":"Name", /// "Description":"Description", - /// "Parent": { "Id": "parentid" }, + /// "Parent": { "Id": "parentid" } /// } /// /// @@ -1353,13 +1357,13 @@ public IQuery UpdateLink(string id, Link link, bool notify = false) public IQuery UpdateNote(string id, Note note, bool notify = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("Note"); + sfApiQuery.From("Items"); + sfApiQuery.Action("Note"); sfApiQuery.ActionIds(id); sfApiQuery.QueryString("notify", notify); sfApiQuery.Body = note; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1383,12 +1387,12 @@ public IQuery UpdateNote(string id, Note note, bool notify = false) public IQuery UpdateSymbolicLink(string id, SymbolicLink symlink) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("SymbolicLink"); + sfApiQuery.From("Items"); + sfApiQuery.Action("SymbolicLink"); sfApiQuery.ActionIds(id); sfApiQuery.Body = symlink; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1407,14 +1411,14 @@ public IQuery Delete(Uri url, bool singleversion = false, bool forceSync = false sfApiQuery.QueryString("singleversion", singleversion); sfApiQuery.QueryString("forceSync", forceSync); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// /// Delete Multiple Items /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// All items in bulk delete must be children of the same parent, identified in the URI @@ -1426,13 +1430,13 @@ public IQuery Delete(Uri url, bool singleversion = false, bool forceSync = false public IQuery BulkDelete(Uri parentUrl, IEnumerable ids, bool forceSync = false, bool deletePermanently = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("BulkDelete"); + sfApiQuery.Action("BulkDelete"); sfApiQuery.Uri(parentUrl); sfApiQuery.QueryString("forceSync", forceSync); sfApiQuery.QueryString("deletePermanently", deletePermanently); sfApiQuery.Body = ids; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1450,12 +1454,12 @@ public IQuery BulkDelete(Uri parentUrl, IEnumerable ids, bool forceSync public IQuery GetThumbnail(Uri url, int size = 75, bool redirect = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Thumbnail"); + sfApiQuery.Action("Thumbnail"); sfApiQuery.Uri(url); sfApiQuery.QueryString("size", size); sfApiQuery.QueryString("redirect", redirect); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1468,17 +1472,19 @@ public IQuery BulkDelete(Uri parentUrl, IEnumerable ids, bool forceSync /// /// /// + /// /// /// A feed containing the path of folders from the specified root to the item, in order /// - public IQuery> GetBreadcrumbs(Uri url, string path = null) + public IQuery> GetBreadcrumbs(Uri url, string path = null, bool bubbleSharedPassthroughs = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Breadcrumbs"); + sfApiQuery.Action("Breadcrumbs"); sfApiQuery.Uri(url); sfApiQuery.QueryString("path", path); + sfApiQuery.QueryString("bubbleSharedPassthroughs", bubbleSharedPassthroughs); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1498,12 +1504,12 @@ public IQuery> GetBreadcrumbs(Uri url, string path = null) public IQuery Copy(Uri url, string targetid, bool overwrite = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Copy"); + sfApiQuery.Action("Copy"); sfApiQuery.Uri(url); sfApiQuery.QueryString("targetid", targetid); sfApiQuery.QueryString("overwrite", overwrite); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1514,8 +1520,8 @@ public IQuery Copy(Uri url, string targetid, bool overwrite = false) /// { /// "Method":"Method", /// "Raw": false, - /// "FileName":"FileName" - /// "FileLength": length + /// "FileName":"FileName", + /// "FileSize": 2048 /// } /// /// @@ -1588,15 +1594,16 @@ public IQuery Copy(Uri url, string targetid, bool overwrite = false) /// /// /// + /// /// /// an Upload Specification element, containing the links for uploading, and the parameters for resume. /// The caller must know the protocol for sending the prepare, chunk and finish URLs returned in the spec; as well as /// negotiate the resume upload. /// - public IQuery Upload(Uri url, UploadMethod method = UploadMethod.Standard, bool raw = false, string fileName = null, long fileSize = 0, string batchId = null, bool batchLast = false, bool canResume = false, bool startOver = false, bool unzip = false, string tool = "apiv3", bool overwrite = false, string title = null, string details = null, bool isSend = false, string sendGuid = null, string opid = null, int threadCount = 4, string responseFormat = "json", bool notify = false, DateTime? clientCreatedDateUTC = null, DateTime? clientModifiedDateUTC = null, int? expirationDays = null) + public IQuery Upload(Uri url, UploadMethod method = UploadMethod.Standard, bool raw = false, string fileName = null, long fileSize = 0, string batchId = null, bool batchLast = false, bool canResume = false, bool startOver = false, bool unzip = false, string tool = "apiv3", bool overwrite = false, string title = null, string details = null, bool isSend = false, string sendGuid = null, string opid = null, int threadCount = 4, string responseFormat = "json", bool notify = false, DateTime? clientCreatedDateUTC = null, DateTime? clientModifiedDateUTC = null, int? expirationDays = null, string baseFileId = "") { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Upload"); + sfApiQuery.Action("Upload"); sfApiQuery.Uri(url); sfApiQuery.QueryString("method", method); sfApiQuery.QueryString("raw", raw); @@ -1620,18 +1627,19 @@ public IQuery Upload(Uri url, UploadMethod method = UploadM sfApiQuery.QueryString("clientCreatedDateUTC", clientCreatedDateUTC); sfApiQuery.QueryString("clientModifiedDateUTC", clientModifiedDateUTC); sfApiQuery.QueryString("expirationDays", expirationDays); + sfApiQuery.QueryString("baseFileId", baseFileId); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } public IQuery Upload2(Uri url, UploadRequestParams uploadParams, int? expirationDays = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Upload2"); + sfApiQuery.Action("Upload2"); sfApiQuery.Uri(url); sfApiQuery.QueryString("expirationDays", expirationDays); sfApiQuery.Body = uploadParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1646,11 +1654,11 @@ public IQuery Upload2(Uri url, UploadRequestParams uploadPa public IQuery CheckIn(Uri url, string message = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("CheckIn"); + sfApiQuery.Action("CheckIn"); sfApiQuery.Uri(url); sfApiQuery.QueryString("message", message); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1665,10 +1673,10 @@ public IQuery CheckIn(Uri url, string message = null) public IQuery CheckOut(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("CheckOut"); + sfApiQuery.Action("CheckOut"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1682,10 +1690,10 @@ public IQuery CheckOut(Uri url) public IQuery DiscardCheckOut(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("DiscardCheckOut"); + sfApiQuery.Action("DiscardCheckOut"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1704,14 +1712,14 @@ public IQuery DiscardCheckOut(Uri url) public IQuery Search(string query, int maxResults = 50, int skip = 0, bool homeFolderOnly = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("Search"); + sfApiQuery.From("Items"); + sfApiQuery.Action("Search"); sfApiQuery.QueryString("query", query); sfApiQuery.QueryString("maxResults", maxResults); sfApiQuery.QueryString("skip", skip); sfApiQuery.QueryString("homeFolderOnly", homeFolderOnly); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1730,13 +1738,13 @@ public IQuery Search(string query, int maxResults = 50, int skip public IQuery Search(Uri url, string query, int maxResults = 50, int skip = 0) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Search"); + sfApiQuery.Action("Search"); sfApiQuery.Uri(url); sfApiQuery.QueryString("query", query); sfApiQuery.QueryString("maxResults", maxResults); sfApiQuery.QueryString("skip", skip); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1754,20 +1762,18 @@ public IQuery Search(Uri url, string query, int maxResults = 50, /// "ItemNameOnly":false /// }, /// "Paging":{ - /// "PageNumber":1, (Deprecated) - /// "PageSize":10, (Deprecated) - /// "Count": 50 + /// "Count": 50, /// "Skip": 0 /// }, /// "Sort":{ /// "SortBy":"", - /// "Ascending":false, + /// "Ascending":false /// }, /// "TimeoutInSeconds":10 /// } /// /// - /// Search for Items matching the criteria of the query parameter + /// Search for Items matching the criteria of the query parameter. Paging.PageNumber and Paging.PageSize are deprecated. /// /// /// @@ -1776,11 +1782,11 @@ public IQuery Search(Uri url, string query, int maxResults = 50, public IQuery AdvancedSimpleSearch(SimpleSearchQuery simpleSearchQuery) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("AdvancedSimpleSearch"); + sfApiQuery.From("Items"); + sfApiQuery.Action("AdvancedSimpleSearch"); sfApiQuery.Body = simpleSearchQuery; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1789,29 +1795,28 @@ public IQuery AdvancedSimpleSearch(SimpleSearchQuery simp /// /// { /// "Query":{ - /// "ItemTypes":["type1", "type2", ...], - /// "ParentID":["id1", "id2", ...], - /// "CreatorID":["id1", "id2", ...], + /// "ItemTypes":["type1", "type2"], + /// "ParentID":["id1", "id2"], + /// "CreatorID":["id1", "id2"], /// "SearchQuery":"", /// "CreateStartDate":"", /// "CreateEndDate":"", /// "ItemNameOnly":false /// }, /// "Paging":{ - /// "PageNumber":1, (deprecated) - /// "PageSize":10, (deprecated) - /// "Count":50, (default value) - /// "Skip":0, (default value) + /// "Count":50, + /// "Skip":0 /// }, /// "Sort":{ /// "SortBy":"", - /// "Ascending":false, + /// "Ascending":false /// }, /// "TimeoutInSeconds":10 /// } /// /// - /// Search for Items matching the criteria of the query parameter + /// Search for Items matching the criteria of the query parameter. Paging.PageNumber and Paging.PageSize are deprecated. + /// Default values for Paging.Count is 50 and Paging.Skip is 0. /// /// /// @@ -1820,11 +1825,11 @@ public IQuery AdvancedSimpleSearch(SimpleSearchQuery simp public IQuery AdvancedSearch(SearchQuery searchQuery) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("AdvancedSearch"); + sfApiQuery.From("Items"); + sfApiQuery.Action("AdvancedSearch"); sfApiQuery.Body = searchQuery; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1841,10 +1846,10 @@ public IQuery AdvancedSearch(SearchQuery searchQuery) public IQuery WebView(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("WebView"); + sfApiQuery.Action("WebView"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1858,11 +1863,11 @@ public IQuery WebView(Uri url) public IQuery> GetProtocolLinks(Uri url, PreviewPlatform platform) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("ProtocolLinks"); + sfApiQuery.Action("ProtocolLinks"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(platform); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1878,10 +1883,10 @@ public IQuery> GetProtocolLinks(Uri url, PreviewPlat public IQuery GetRedirection(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Redirection"); + sfApiQuery.Action("Redirection"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1891,10 +1896,10 @@ public IQuery GetRedirection(Uri url) public IQuery> GetDeletedChildren(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("DeletedChildren"); + sfApiQuery.Action("DeletedChildren"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1905,12 +1910,12 @@ public IQuery> GetDeletedChildren(Uri url) public IQuery> GetUserDeletedItems(string userid = null, string zone = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("UserDeletedItems"); + sfApiQuery.From("Items"); + sfApiQuery.Action("UserDeletedItems"); sfApiQuery.QueryString("userid", userid); sfApiQuery.QueryString("zone", zone); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1920,11 +1925,11 @@ public IQuery> GetUserDeletedItems(string userid = null, string public IQuery BulkRestore(IEnumerable ids) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("BulkRestore"); + sfApiQuery.From("Items"); + sfApiQuery.Action("BulkRestore"); sfApiQuery.Body = ids; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1935,11 +1940,11 @@ public IQuery BulkRestore(IEnumerable ids) public IQuery BulkDeletePermanently(IEnumerable ids) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Items"); - sfApiQuery.Action("BulkDeletePermanently"); + sfApiQuery.From("Items"); + sfApiQuery.Action("BulkDeletePermanently"); sfApiQuery.Body = ids; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1955,10 +1960,10 @@ public IQuery BulkDeletePermanently(IEnumerable ids) public IQuery WebAppLink(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("WebAppLink"); + sfApiQuery.Action("WebAppLink"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1968,10 +1973,10 @@ public IQuery WebAppLink(Uri url) public IQuery RemoveTemplateAssociation(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("RemoveTemplateAssociation"); + sfApiQuery.Action("RemoveTemplateAssociation"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1981,10 +1986,10 @@ public IQuery RemoveTemplateAssociation(Uri url) public IQuery CheckTemplateOwned(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("CheckTemplateOwned"); + sfApiQuery.Action("CheckTemplateOwned"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1995,11 +2000,11 @@ public IQuery CheckTemplateOwned(Uri url) public IQuery CheckVersioningViolation(Uri url, int newMaxVersions) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("CheckVersioningViolation"); + sfApiQuery.Action("CheckVersioningViolation"); sfApiQuery.Uri(url); sfApiQuery.QueryString("newMaxVersions", newMaxVersions); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/MetadataEntity.cs b/src/ShareFile.Api.Client/Entities/MetadataEntity.cs index 8eba04e..b784e33 100644 --- a/src/ShareFile.Api.Client/Entities/MetadataEntity.cs +++ b/src/ShareFile.Api.Client/Entities/MetadataEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -101,20 +101,20 @@ public interface IMetadataEntity : IEntityBase IQuery Update(Uri url, Metadata metadata); /// - /// Update the item corresponding to the supplied id with the provided key-value Metadata models. + /// Update Item Metadata /// /// /// [{ /// "Value":"metadata value" /// },{ /// "Value":"metadata value" - /// }, - /// ...] + /// }] /// /// + /// Update the item corresponding to the supplied id with the provided key-value Metadata models. /// If a metadata key is not already associated with the item, the item is updated with the new key-value pair. /// - /// + /// /// /// The updated Metadata list for the given object ID. /// @@ -170,7 +170,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -186,10 +186,10 @@ public IQuery Get(Uri url) public IQuery> GetByItem(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -211,11 +211,11 @@ public IQuery> GetByItem(Uri url) public IQuery CreateByItem(Uri url, Metadata metadata) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); sfApiQuery.Body = metadata; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -237,12 +237,12 @@ public IQuery CreateByItem(Uri url, Metadata metadata) public IQuery UpdateByItem(Uri url, string metadataId, Metadata metadata) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(metadataId); sfApiQuery.Body = metadata; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -265,35 +265,35 @@ public IQuery Update(Uri url, Metadata metadata) sfApiQuery.Uri(url); sfApiQuery.Body = metadata; sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// - /// Update the item corresponding to the supplied id with the provided key-value Metadata models. + /// Update Item Metadata /// /// /// [{ /// "Value":"metadata value" /// },{ /// "Value":"metadata value" - /// }, - /// ...] + /// }] /// /// + /// Update the item corresponding to the supplied id with the provided key-value Metadata models. /// If a metadata key is not already associated with the item, the item is updated with the new key-value pair. /// - /// + /// /// /// The updated Metadata list for the given object ID. /// public IQuery> UpdateItem(Uri url, IEnumerable metadata) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); - sfApiQuery.QueryString("metadata", metadata); + sfApiQuery.Body = metadata; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -310,11 +310,11 @@ public IQuery> UpdateItem(Uri url, IEnumerable met public IQuery DeleteByItem(Uri url, string metadataId) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(metadataId); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -331,7 +331,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/PoliciesEntity.cs b/src/ShareFile.Api.Client/Entities/PoliciesEntity.cs index 365bbcb..2ceb746 100644 --- a/src/ShareFile.Api.Client/Entities/PoliciesEntity.cs +++ b/src/ShareFile.Api.Client/Entities/PoliciesEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -77,7 +77,7 @@ public interface IPoliciesEntity : IEntityBase /// /// /// { - /// "Active": true + /// "Active": true, /// "Policy": { /// "Id": "123" /// } @@ -137,9 +137,9 @@ public PoliciesEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Policies"); + sfApiQuery.From("Policies"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -157,7 +157,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -189,11 +189,11 @@ public IQuery Get(Uri url) public IQuery> PatchByUser(Uri url, IEnumerable userPolicies) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Policies"); + sfApiQuery.Action("Policies"); sfApiQuery.Uri(url); sfApiQuery.Body = userPolicies; sfApiQuery.HttpMethod = "PUT"; - return sfApiQuery; + return sfApiQuery; } /// @@ -201,7 +201,7 @@ public IQuery> PatchByUser(Uri url, IEnumerable /// /// { - /// "Active": true + /// "Active": true, /// "Policy": { /// "Id": "123" /// } @@ -218,11 +218,11 @@ public IQuery> PatchByUser(Uri url, IEnumerable CreateByUser(Uri url, UserPolicy policy) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Policies"); + sfApiQuery.Action("Policies"); sfApiQuery.Uri(url); sfApiQuery.Body = policy; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -235,19 +235,19 @@ public IQuery CreateByUser(Uri url, UserPolicy policy) public IQuery DeleteByUser(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Policies"); + sfApiQuery.Action("Policies"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } public IQuery DeleteByUser(Uri url, string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Policies"); + sfApiQuery.Action("Policies"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -265,12 +265,12 @@ public IQuery DeleteByUser(Uri url, string id) public IQuery UpdateByUser(Uri url, string id, UserPolicy updatedPolicy) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Policies"); + sfApiQuery.Action("Policies"); sfApiQuery.Uri(url); sfApiQuery.ActionIds(id); sfApiQuery.Body = updatedPolicy; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/RemoteUploadsEntity.cs b/src/ShareFile.Api.Client/Entities/RemoteUploadsEntity.cs index 9ef97c5..a1b18a6 100644 --- a/src/ShareFile.Api.Client/Entities/RemoteUploadsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/RemoteUploadsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -40,77 +40,77 @@ public RemoteUploadsEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("RemoteUploads"); + sfApiQuery.From("RemoteUploads"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } public IQuery GetPublic() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("RemoteUploads"); - sfApiQuery.Action("Public"); + sfApiQuery.From("RemoteUploads"); + sfApiQuery.Action("Public"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } public IQuery Get(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } public IQuery Upload2(Uri url, RemoteUploadRequestParams uploadParams, string userId, int? expirationDays = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Upload2"); + sfApiQuery.Action("Upload2"); sfApiQuery.Uri(url); sfApiQuery.QueryString("userId", userId); sfApiQuery.QueryString("expirationDays", expirationDays); sfApiQuery.Body = uploadParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } public IQuery Create(RemoteUpload remoteUpload) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("RemoteUploads"); + sfApiQuery.From("RemoteUploads"); sfApiQuery.Body = remoteUpload; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } public IQuery Update(RemoteUpload remoteUpload) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("RemoteUploads"); + sfApiQuery.From("RemoteUploads"); sfApiQuery.Body = remoteUpload; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } public IQuery Delete(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("RemoteUploads"); + sfApiQuery.From("RemoteUploads"); sfApiQuery.QueryString("id", id); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } public IQuery> GetUsers() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("RemoteUploads"); - sfApiQuery.Action("Users"); + sfApiQuery.From("RemoteUploads"); + sfApiQuery.Action("Users"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } public IQuery ValidateRemoteUploadUser(string id, string email) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("RemoteUploads"); - sfApiQuery.Action("ValidateRemoteUploadUser"); + sfApiQuery.From("RemoteUploads"); + sfApiQuery.Action("ValidateRemoteUploadUser"); sfApiQuery.QueryString("id", id); sfApiQuery.QueryString("email", email); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/ReportsEntity.cs b/src/ShareFile.Api.Client/Entities/ReportsEntity.cs index 23240a7..9af2807 100644 --- a/src/ShareFile.Api.Client/Entities/ReportsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/ReportsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -96,22 +96,23 @@ public interface IReportsEntity : IEntityBase /// /// /// { - /// "Id": "rs24f83e-b147-437e-9f28-e7d03634af42" /// "Title": "Usage Report", /// "ReportType": "Activity", + /// "ActivityTypes": "Login,Upload,Download,View", /// "ObjectType": "Account", - /// "ObjectId": "a024f83e-b147-437e-9f28-e7d0ef634af42", + /// "ObjectId": "accountId", /// "DateOption": "Last30Days", /// "SaveFormat": "Excel" /// } /// /// - /// Creates a new Report. + /// Creates a new Report. The sample above is for an Account Activity Report. For more options please refer to the Report + /// model documentation. /// /// /// /// - /// the created report + /// Created Report /// IQuery Create(Report report, bool runOnCreate); @@ -186,13 +187,15 @@ public interface IReportsEntity : IEntityBase /// Get spreadsheet data /// /// - /// Get the spreadsheet data for a report + /// Download spreadsheet data for a report. If parameter "getSigndedUrl" is true, + /// this endpoint returns a Download Specification object with a "url" parameter, which will point to the file's location /// /// + /// /// - /// Excel Formatted Report Results + /// Excel Formatted Report Results or Download Specification /// - IQuery DownloadData(string id); + IQuery DownloadData(string id, bool getSignedUrl = false); } public class ReportsEntity : EntityBase, IReportsEntity @@ -214,9 +217,9 @@ public ReportsEntity (IShareFileClient client) public IQuery> Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Reports"); + sfApiQuery.From("Reports"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -234,7 +237,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -250,11 +253,11 @@ public IQuery Get(Uri url) public IQuery> GetRecent(int maxReports = 10) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Reports"); - sfApiQuery.Action("Recent"); + sfApiQuery.From("Reports"); + sfApiQuery.Action("Recent"); sfApiQuery.QueryString("maxReports", maxReports); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -269,10 +272,10 @@ public IQuery> GetRecent(int maxReports = 10) public IQuery> GetRecurring() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Reports"); - sfApiQuery.Action("Recurring"); + sfApiQuery.From("Reports"); + sfApiQuery.Action("Recurring"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -288,11 +291,11 @@ public IQuery> GetRecurring() public IQuery GetRecord(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Reports"); - sfApiQuery.Action("Record"); + sfApiQuery.From("Reports"); + sfApiQuery.Action("Record"); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -308,10 +311,10 @@ public IQuery GetRecord(string id) public IQuery> GetRecords(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Records"); + sfApiQuery.Action("Records"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -319,31 +322,32 @@ public IQuery> GetRecords(Uri url) /// /// /// { - /// "Id": "rs24f83e-b147-437e-9f28-e7d03634af42" /// "Title": "Usage Report", /// "ReportType": "Activity", + /// "ActivityTypes": "Login,Upload,Download,View", /// "ObjectType": "Account", - /// "ObjectId": "a024f83e-b147-437e-9f28-e7d0ef634af42", + /// "ObjectId": "accountId", /// "DateOption": "Last30Days", /// "SaveFormat": "Excel" /// } /// /// - /// Creates a new Report. + /// Creates a new Report. The sample above is for an Account Activity Report. For more options please refer to the Report + /// model documentation. /// /// /// /// - /// the created report + /// Created Report /// public IQuery Create(Report report, bool runOnCreate) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Reports"); + sfApiQuery.From("Reports"); sfApiQuery.QueryString("runOnCreate", runOnCreate); sfApiQuery.Body = report; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -369,10 +373,10 @@ public IQuery Create(Report report, bool runOnCreate) public IQuery Update(Report report) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Reports"); + sfApiQuery.From("Reports"); sfApiQuery.Body = report; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -387,7 +391,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -402,10 +406,10 @@ public IQuery Delete(Uri url) public IQuery GetRun(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Run"); + sfApiQuery.Action("Run"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -415,10 +419,10 @@ public IQuery GetRun(Uri url) public IQuery Preview(Uri reportUrl) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Preview"); + sfApiQuery.Action("Preview"); sfApiQuery.Uri(reportUrl); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -434,12 +438,12 @@ public IQuery Preview(Uri reportUrl) public IQuery GetJsonData(string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Reports"); - sfApiQuery.Action("Records"); + sfApiQuery.From("Reports"); + sfApiQuery.Action("Records"); sfApiQuery.ActionIds(id); sfApiQuery.SubAction("JsonData"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -450,32 +454,35 @@ public IQuery GetJsonData(string id) public IQuery Move(Uri reportUrl, string folderId) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Move"); + sfApiQuery.Action("Move"); sfApiQuery.Uri(reportUrl); sfApiQuery.QueryString("folderId", folderId); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// /// Get spreadsheet data /// /// - /// Get the spreadsheet data for a report + /// Download spreadsheet data for a report. If parameter "getSigndedUrl" is true, + /// this endpoint returns a Download Specification object with a "url" parameter, which will point to the file's location /// /// + /// /// - /// Excel Formatted Report Results + /// Excel Formatted Report Results or Download Specification /// - public IQuery DownloadData(string id) + public IQuery DownloadData(string id, bool getSignedUrl = false) { - var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Reports"); - sfApiQuery.Action("Records"); + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("Reports"); + sfApiQuery.Action("Records"); sfApiQuery.ActionIds(id); sfApiQuery.SubAction("DownloadData"); + sfApiQuery.QueryString("getSignedUrl", getSignedUrl); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/SamlMetadataEntity.cs b/src/ShareFile.Api.Client/Entities/SamlMetadataEntity.cs new file mode 100644 index 0000000..e57227d --- /dev/null +++ b/src/ShareFile.Api.Client/Entities/SamlMetadataEntity.cs @@ -0,0 +1,41 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using ShareFile.Api.Client; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; + + +namespace ShareFile.Api.Client.Entities +{ + public interface ISamlMetadataEntity : IEntityBase + { + IQuery GetSamlMetadata(); + } + + public class SamlMetadataEntity : EntityBase, ISamlMetadataEntity + { + public SamlMetadataEntity (IShareFileClient client) + : base (client, "SamlMetadata") + { } + + public IQuery GetSamlMetadata() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("saml"); + sfApiQuery.Action("metadata"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + } +} diff --git a/src/ShareFile.Api.Client/Entities/SessionsEntity.cs b/src/ShareFile.Api.Client/Entities/SessionsEntity.cs index 4073275..25a4669 100644 --- a/src/ShareFile.Api.Client/Entities/SessionsEntity.cs +++ b/src/ShareFile.Api.Client/Entities/SessionsEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -98,9 +98,9 @@ public SessionsEntity (IShareFileClient client) public IQuery Get() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Sessions"); + sfApiQuery.From("Sessions"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -112,9 +112,9 @@ public IQuery Get() public IQuery Delete() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Sessions"); + sfApiQuery.From("Sessions"); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -147,12 +147,12 @@ public IQuery Delete() public IQuery Login(string authmethod = null, string authcomparison = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Sessions"); - sfApiQuery.Action("Login"); + sfApiQuery.From("Sessions"); + sfApiQuery.Action("Login"); sfApiQuery.QueryString("authmethod", authmethod); sfApiQuery.QueryString("authcomparison", authcomparison); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -161,10 +161,10 @@ public IQuery Login(string authmethod = null, string authcomparison = n public IQuery Acs() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Sessions"); - sfApiQuery.Action("Acs"); + sfApiQuery.From("Sessions"); + sfApiQuery.Action("Acs"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/SharesEntity.cs b/src/ShareFile.Api.Client/Entities/SharesEntity.cs index 3b84bde..a6034ef 100644 --- a/src/ShareFile.Api.Client/Entities/SharesEntity.cs +++ b/src/ShareFile.Api.Client/Entities/SharesEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -194,7 +194,7 @@ public interface ISharesEntity : IEntityBase /// Download Multiple Items from a Share for a Recipient /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// Download Multiple Items from a Share for a Recipient. The download will contain a ZIP archive containing all @@ -218,7 +218,7 @@ public interface ISharesEntity : IEntityBase /// { /// "ShareType":"Send", /// "Title":"Sample Send Share", - /// "Items": [ { "Id":"itemid" }, {...} ], + /// "Items": [ { "Id":"itemid01" }, { "Id":"itemid02" } ], /// "Recipients":[ { "User": { "Id":"userid" } }, { "User": { "Email": "user@email" } } ], /// "ExpirationDate": "2013-07-23", /// "RequireLogin": false, @@ -268,7 +268,7 @@ public interface ISharesEntity : IEntityBase /// "Title": "New Title", /// "ExpirationDate": "2013-07-23", /// "RequireLogin": false, - /// "Items": [ { "Id":"itemid" }, {...} ], + /// "Items": [ { "Id":"itemid01" }, { "Id":"itemid02" } ], /// } /// /// @@ -321,8 +321,8 @@ public interface ISharesEntity : IEntityBase /// /// /// { - /// "Items":["itemId1", "itemId2", ...], - /// "Emails":["email@sharefile.com", "email2@sharefile.com",...] + /// "Items":["itemId1", "itemId2"], + /// "Emails":["email@sharefile.com", "email2@sharefile.com"], /// "Subject": "Email Subject", /// "Body": "Email Message", /// "CcSender": false, @@ -349,7 +349,7 @@ public interface ISharesEntity : IEntityBase /// /// { /// "FolderId":"folderId", - /// "Emails":["email@sharefile.com", "email2@sharefile.com",...] + /// "Emails":["email@sharefile.com", "email2@sharefile.com"], /// "Subject": "Email Subject", /// "Body": "Email Message", /// "CcSender": false, @@ -380,7 +380,7 @@ public interface ISharesEntity : IEntityBase /// /// /// { - /// "Recipients":["email@sharefile.com", "groupId",...] + /// "Recipients":["email@sharefile.com", "groupId"], /// "Subject": "Email Subject", /// "Body": "Email Message", /// "CcSender": false, @@ -405,8 +405,8 @@ public interface ISharesEntity : IEntityBase /// { /// "Method":"Method", /// "Raw": false, - /// "FileName":"FileName" - /// "FileLength": length + /// "FileName":"FileName", + /// "FileLength": 123 /// } /// /// @@ -504,14 +504,15 @@ public interface ISharesEntity : IEntityBase /// Get Sent Message Content by Share /// /// - /// Returns sent message content. + /// Returns sent message content. By default the message is returned as a plain string. If asJson is true, the message + /// string is wrapped in a Json object with a single "Message" property. /// /// /// /// /// Sent Message Content /// - IQuery Message(Uri shareUrl, string aliasId); + IQuery Message(Uri shareUrl, string aliasId, bool asJson = false); } public class SharesEntity : EntityBase, ISharesEntity @@ -534,10 +535,10 @@ public SharesEntity (IShareFileClient client) public IQuery> Get(bool includeExpired = true) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Shares"); + sfApiQuery.From("Shares"); sfApiQuery.QueryString("includeExpired", includeExpired); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -555,7 +556,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -574,10 +575,10 @@ public IQuery Get(Uri url) public IQuery> GetRecipients(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Recipients"); + sfApiQuery.Action("Recipients"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -594,11 +595,11 @@ public IQuery> GetRecipients(Uri url) public IQuery GetRecipients(Uri parentUrl, string id) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Recipients"); + sfApiQuery.Action("Recipients"); sfApiQuery.Uri(parentUrl); sfApiQuery.ActionIds(id); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -618,14 +619,14 @@ public IQuery GetRecipients(Uri parentUrl, string id) public IQuery CreateRecipients(Uri parentUrl, string Email = null, string FirstName = null, string LastName = null, string Company = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Recipients"); + sfApiQuery.Action("Recipients"); sfApiQuery.Uri(parentUrl); sfApiQuery.QueryString("Email", Email); sfApiQuery.QueryString("FirstName", FirstName); sfApiQuery.QueryString("LastName", LastName); sfApiQuery.QueryString("Company", Company); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -641,10 +642,10 @@ public IQuery CreateRecipients(Uri parentUrl, string Email = null, s public IQuery> GetItems(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Items"); + sfApiQuery.Action("Items"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -661,11 +662,11 @@ public IQuery> GetItems(Uri url) public IQuery GetItems(Uri shareUrl, string itemid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Items"); + sfApiQuery.Action("Items"); sfApiQuery.Uri(shareUrl); sfApiQuery.ActionIds(itemid); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -684,14 +685,14 @@ public IQuery GetItems(Uri shareUrl, string itemid) public IQuery Thumbnail(Uri shareUrl, string itemid, int size = 75, bool redirect = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Items"); + sfApiQuery.Action("Items"); sfApiQuery.Uri(shareUrl); sfApiQuery.ActionIds(itemid); sfApiQuery.SubAction("Thumbnail"); sfApiQuery.QueryString("size", size); sfApiQuery.QueryString("redirect", redirect); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -706,12 +707,12 @@ public IQuery GetItems(Uri shareUrl, string itemid) public IQuery> ProtocolLinks(Uri shareUrl, string itemid, PreviewPlatform platform) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Items"); + sfApiQuery.Action("Items"); sfApiQuery.Uri(shareUrl); sfApiQuery.ActionIds(itemid); sfApiQuery.SubAction("ProtocolLinks", platform); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -739,7 +740,7 @@ public IQuery> ProtocolLinks(Uri shareUrl, string it public IQuery Download(Uri shareUrl, string itemId = null, string Name = null, string Email = null, string Company = null, bool redirect = true) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Download"); + sfApiQuery.Action("Download"); sfApiQuery.Uri(shareUrl); sfApiQuery.QueryString("id", itemId); sfApiQuery.QueryString("Name", Name); @@ -747,7 +748,7 @@ public IQuery> ProtocolLinks(Uri shareUrl, string it sfApiQuery.QueryString("Company", Company); sfApiQuery.QueryString("redirect", redirect); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -777,21 +778,21 @@ public IQuery> ProtocolLinks(Uri shareUrl, string it public IQuery DownloadWithAlias(Uri shareUrl, string aliasid, string itemId = null, bool redirect = true) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Recipients"); + sfApiQuery.Action("Recipients"); sfApiQuery.Uri(shareUrl); sfApiQuery.ActionIds(aliasid); sfApiQuery.SubAction("DownloadWithAlias"); sfApiQuery.QueryString("id", itemId); sfApiQuery.QueryString("redirect", redirect); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// /// Download Multiple Items from a Share for a Recipient /// /// - /// ["id1","id2",...] + /// ["id1","id2"] /// /// /// Download Multiple Items from a Share for a Recipient. The download will contain a ZIP archive containing all @@ -809,14 +810,14 @@ public IQuery> ProtocolLinks(Uri shareUrl, string it public IQuery BulkDownload(Uri shareUrl, string aliasid, IEnumerable ids, bool redirect = true) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Recipients"); + sfApiQuery.Action("Recipients"); sfApiQuery.Uri(shareUrl); sfApiQuery.ActionIds(aliasid); sfApiQuery.SubAction("BulkDownload"); sfApiQuery.QueryString("redirect", redirect); sfApiQuery.Body = ids; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -826,7 +827,7 @@ public IQuery> ProtocolLinks(Uri shareUrl, string it /// { /// "ShareType":"Send", /// "Title":"Sample Send Share", - /// "Items": [ { "Id":"itemid" }, {...} ], + /// "Items": [ { "Id":"itemid01" }, { "Id":"itemid02" } ], /// "Recipients":[ { "User": { "Id":"userid" } }, { "User": { "Email": "user@email" } } ], /// "ExpirationDate": "2013-07-23", /// "RequireLogin": false, @@ -869,12 +870,12 @@ public IQuery> ProtocolLinks(Uri shareUrl, string it public IQuery Create(Share share, bool notify = false, bool direct = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Shares"); + sfApiQuery.From("Shares"); sfApiQuery.QueryString("notify", notify); sfApiQuery.QueryString("direct", direct); sfApiQuery.Body = share; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -885,7 +886,7 @@ public IQuery Create(Share share, bool notify = false, bool direct = fals /// "Title": "New Title", /// "ExpirationDate": "2013-07-23", /// "RequireLogin": false, - /// "Items": [ { "Id":"itemid" }, {...} ], + /// "Items": [ { "Id":"itemid01" }, { "Id":"itemid02" } ], /// } /// /// @@ -912,7 +913,7 @@ public IQuery Update(Uri url, Share share, bool appendItemsFeed = true) sfApiQuery.QueryString("appendItemsFeed", appendItemsFeed); sfApiQuery.Body = share; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -927,7 +928,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -948,12 +949,12 @@ public IQuery Delete(Uri url) public IQuery CreateAlias(Uri url, string email, bool notify = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Alias"); + sfApiQuery.Action("Alias"); sfApiQuery.Uri(url); sfApiQuery.QueryString("email", email); sfApiQuery.QueryString("notify", notify); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -961,8 +962,8 @@ public IQuery CreateAlias(Uri url, string email, bool notify = false) /// /// /// { - /// "Items":["itemId1", "itemId2", ...], - /// "Emails":["email@sharefile.com", "email2@sharefile.com",...] + /// "Items":["itemId1", "itemId2"], + /// "Emails":["email@sharefile.com", "email2@sharefile.com"], /// "Subject": "Email Subject", /// "Body": "Email Message", /// "CcSender": false, @@ -984,11 +985,11 @@ public IQuery CreateAlias(Uri url, string email, bool notify = false) public IQuery CreateSend(ShareSendParams parameters) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Shares"); - sfApiQuery.Action("Send"); + sfApiQuery.From("Shares"); + sfApiQuery.Action("Send"); sfApiQuery.Body = parameters; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -997,7 +998,7 @@ public IQuery CreateSend(ShareSendParams parameters) /// /// { /// "FolderId":"folderId", - /// "Emails":["email@sharefile.com", "email2@sharefile.com",...] + /// "Emails":["email@sharefile.com", "email2@sharefile.com"], /// "Subject": "Email Subject", /// "Body": "Email Message", /// "CcSender": false, @@ -1024,11 +1025,11 @@ public IQuery CreateSend(ShareSendParams parameters) public IQuery CreateRequest(ShareRequestParams parameters) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Shares"); - sfApiQuery.Action("Request"); + sfApiQuery.From("Shares"); + sfApiQuery.Action("Request"); sfApiQuery.Body = parameters; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1036,7 +1037,7 @@ public IQuery CreateRequest(ShareRequestParams parameters) /// /// /// { - /// "Recipients":["email@sharefile.com", "groupId",...] + /// "Recipients":["email@sharefile.com", "groupId"], /// "Subject": "Email Subject", /// "Body": "Email Message", /// "CcSender": false, @@ -1054,11 +1055,11 @@ public IQuery CreateRequest(ShareRequestParams parameters) public IQuery Resend(ShareResendParams parameters) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Shares"); - sfApiQuery.Action("Resend"); + sfApiQuery.From("Shares"); + sfApiQuery.Action("Resend"); sfApiQuery.Body = parameters; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1069,8 +1070,8 @@ public IQuery Resend(ShareResendParams parameters) /// { /// "Method":"Method", /// "Raw": false, - /// "FileName":"FileName" - /// "FileLength": length + /// "FileName":"FileName", + /// "FileLength": 123 /// } /// /// @@ -1140,7 +1141,7 @@ public IQuery Resend(ShareResendParams parameters) public IQuery Upload(Uri url, UploadMethod method = UploadMethod.Standard, bool raw = false, string fileName = null, long fileSize = 0, string batchId = null, bool batchLast = false, bool canResume = false, bool startOver = false, bool unzip = false, string tool = "apiv3", bool overwrite = false, string title = null, string details = null, bool isSend = false, string sendGuid = null, string opid = null, int threadCount = 4, string responseFormat = "json", bool notify = false, DateTime? clientCreatedDateUTC = null, DateTime? clientModifiedDateUTC = null, int? expirationDays = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Upload"); + sfApiQuery.Action("Upload"); sfApiQuery.Uri(url); sfApiQuery.QueryString("method", method); sfApiQuery.QueryString("raw", raw); @@ -1165,17 +1166,17 @@ public IQuery Upload(Uri url, UploadMethod method = UploadM sfApiQuery.QueryString("clientModifiedDateUTC", clientModifiedDateUTC); sfApiQuery.QueryString("expirationDays", expirationDays); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } public IQuery Upload2(Uri url, UploadRequestParams uploadParams, int? expirationDays = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Upload2"); + sfApiQuery.Action("Upload2"); sfApiQuery.Uri(url); sfApiQuery.QueryString("expirationDays", expirationDays); sfApiQuery.Body = uploadParams; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1191,10 +1192,10 @@ public IQuery Upload2(Uri url, UploadRequestParams uploadPa public IQuery GetRedirection(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Redirection"); + sfApiQuery.Action("Redirection"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1210,35 +1211,37 @@ public IQuery GetRedirection(Uri url) public IQuery> GetInbox(string userId = null, ShareType type = ShareType.Both, bool archived = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Shares"); - sfApiQuery.Action("Inbox"); + sfApiQuery.From("Shares"); + sfApiQuery.Action("Inbox"); sfApiQuery.ActionIds(userId); sfApiQuery.QueryString("type", type); sfApiQuery.QueryString("archived", archived); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// /// Get Sent Message Content by Share /// /// - /// Returns sent message content. + /// Returns sent message content. By default the message is returned as a plain string. If asJson is true, the message + /// string is wrapped in a Json object with a single "Message" property. /// /// /// /// /// Sent Message Content /// - public IQuery Message(Uri shareUrl, string aliasId) + public IQuery Message(Uri shareUrl, string aliasId, bool asJson = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Recipients"); + sfApiQuery.Action("Recipients"); sfApiQuery.Uri(shareUrl); sfApiQuery.ActionIds(aliasId); sfApiQuery.SubAction("Message"); + sfApiQuery.QueryString("asJson", asJson); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/StorageCentersEntity.cs b/src/ShareFile.Api.Client/Entities/StorageCentersEntity.cs index 9c519c3..f3faeaa 100644 --- a/src/ShareFile.Api.Client/Entities/StorageCentersEntity.cs +++ b/src/ShareFile.Api.Client/Entities/StorageCentersEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -134,8 +134,7 @@ public interface IStorageCentersEntity : IEntityBase /// /// [ /// {"Name":"metadataName1", "Value":"metadataValue1", "IsPublic":"true"}, - /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"}, - /// ... + /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"} /// ] /// /// @@ -183,7 +182,7 @@ public IQuery Get(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -206,7 +205,7 @@ public IQuery Update(Uri url, StorageCenter sc) sfApiQuery.Uri(url); sfApiQuery.Body = sc; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -218,7 +217,7 @@ public IQuery Delete(Uri url) var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -234,10 +233,10 @@ public IQuery Delete(Uri url) public IQuery> GetByZone(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("StorageCenters"); + sfApiQuery.Action("StorageCenters"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -261,11 +260,11 @@ public IQuery> GetByZone(Uri url) public IQuery CreateByZone(Uri url, StorageCenter storageCenter) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("StorageCenters"); + sfApiQuery.Action("StorageCenters"); sfApiQuery.Uri(url); sfApiQuery.Body = storageCenter; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -290,12 +289,12 @@ public IQuery CreateByZone(Uri url, StorageCenter storageCenter) public IQuery UpdateByZone(Uri zUrl, string scid, StorageCenter storageCenter) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("StorageCenters"); + sfApiQuery.Action("StorageCenters"); sfApiQuery.Uri(zUrl); sfApiQuery.ActionIds(scid); sfApiQuery.Body = storageCenter; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -309,11 +308,11 @@ public IQuery UpdateByZone(Uri zUrl, string scid, StorageCenter s public IQuery DeleteByZone(Uri zUrl, string scid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("StorageCenters"); + sfApiQuery.Action("StorageCenters"); sfApiQuery.Uri(zUrl); sfApiQuery.ActionIds(scid); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -330,12 +329,12 @@ public IQuery DeleteByZone(Uri zUrl, string scid) public IQuery> GetMetadata(Uri zUrl, string scid) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("StorageCenters"); + sfApiQuery.Action("StorageCenters"); sfApiQuery.Uri(zUrl); sfApiQuery.ActionIds(scid); sfApiQuery.SubAction("Metadata"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -344,8 +343,7 @@ public IQuery> GetMetadata(Uri zUrl, string scid) /// /// [ /// {"Name":"metadataName1", "Value":"metadataValue1", "IsPublic":"true"}, - /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"}, - /// ... + /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"} /// ] /// /// @@ -360,13 +358,13 @@ public IQuery> GetMetadata(Uri zUrl, string scid) public IQuery> CreateMetadata(Uri zUrl, string scid, IEnumerable metadata) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("StorageCenters"); + sfApiQuery.Action("StorageCenters"); sfApiQuery.Uri(zUrl); sfApiQuery.ActionIds(scid); sfApiQuery.SubAction("Metadata"); sfApiQuery.Body = metadata; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -384,13 +382,13 @@ public IQuery> CreateMetadata(Uri zUrl, string scid, IEnumer public IQuery DeleteMetadata(Uri zUrl, string scid, string name) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("StorageCenters"); + sfApiQuery.Action("StorageCenters"); sfApiQuery.Uri(zUrl); sfApiQuery.ActionIds(scid); sfApiQuery.SubAction("Metadata"); sfApiQuery.QueryString("name", name); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/UsersEntity.cs b/src/ShareFile.Api.Client/Entities/UsersEntity.cs index f920488..8c7c3fd 100644 --- a/src/ShareFile.Api.Client/Entities/UsersEntity.cs +++ b/src/ShareFile.Api.Client/Entities/UsersEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -26,6 +26,10 @@ public interface IUsersEntity : IEntityBase /// /// /// Retrieve a single user, by ID or email, or the currently authenticated user. + /// A user can retrieve another user when + /// * (1) The current user has AdminManageEmployees role + /// * OR + /// * (2) The current user has CanManageUsers role and the other user is a client /// /// /// @@ -69,7 +73,7 @@ public interface IUsersEntity : IEntityBase /// /// The new user /// - IQuery Create(User user, bool pushCreatorDefaultSettings = false, bool addshared = false, bool notify = false, bool ifNecessary = false, bool addPersonal = false); + IQuery Create(User user, bool pushCreatorDefaultSettings = false, bool addshared = true, bool notify = false, bool ifNecessary = false, bool addPersonal = true); /// /// Create Employee @@ -97,7 +101,7 @@ public interface IUsersEntity : IEntityBase /// "CanManageUsers": false, /// "Roles": [ /// "CanChangePassword", "CanManageMySettings", - /// "CanUseFileBox, "CanManageUsers, "CanCreateFolders, "CanUseDropBox, "CanSelectFolderZone, + /// "CanUseFileBox", "CanManageUsers", "CanCreateFolders", "CanUseDropBox", "CanSelectFolderZone", /// "AdminAccountPolicies", "AdminBilling", "AdminBranding", "AdminChangePlan", "AdminFileBoxAccess", /// "AdminManageEmployees", "AdminRemoteUploadForms", "AdminReporting", "AdminSharedDistGroups", /// "AdminSharedAddressBook", "AdminViewReceipts", "AdminDelegate", "AdminManageFolderTemplates", @@ -121,7 +125,7 @@ public interface IUsersEntity : IEntityBase /// /// The new employee user /// - IQuery CreateAccountUser(AccountUser user, bool pushCreatorDefaultSettings = false, bool addshared = false, bool notify = false, bool ifNecessary = false, bool addPersonal = false); + IQuery CreateAccountUser(AccountUser user, bool pushCreatorDefaultSettings = false, bool addshared = true, bool notify = false, bool ifNecessary = false, bool addPersonal = true); /// /// Update User @@ -135,7 +139,7 @@ public interface IUsersEntity : IEntityBase /// "Security": /// { /// "IsDisabled":false - /// } + /// }, /// "DefaultZone": /// { /// "Id":"newzoneid" @@ -212,9 +216,8 @@ public interface IUsersEntity : IEntityBase /// Remove Roles /// /// - /// { + /// /// [ "CanManageUsers", "CanSelectFolderZone" ] - /// } /// /// /// Removes the roles for user. @@ -241,10 +244,11 @@ public interface IUsersEntity : IEntityBase /// "Company":"Company", /// "Email":"user@domain.com", /// "StorageQuotaLimitGB":100, + /// "Bandwidth": 50, /// "Security": /// { /// "IsDisabled":false - /// } + /// }, /// "DefaultZone": /// { /// "Id":"newzoneid" @@ -254,8 +258,8 @@ public interface IUsersEntity : IEntityBase /// /// Modifies an existing user object /// The following parameters can be modified through this call: FirstName, LastName, Company, - /// Email, IsEmployee, IsDisabled, DefaultZone Id, StorageQuotaLimitGB.During a promotion (the user id points to Customer), the following parameters can be - /// modified: CanCreateFolders, CanUseFileBox, CanManageUsers. StorageQuotaLimitGB equal to -1 sets the user quota to the account default storage quota value. + /// Email, IsEmployee, IsDisabled, DefaultZone Id, StorageQuotaLimitGB, Bandwidth.During a promotion (the user id points to Customer), the following parameters can be + /// modified: CanCreateFolders, CanUseFileBox, CanManageUsers. StorageQuotaLimitGB equal to -1 sets the user quota to the account default storage quota value.Bandwidth equal to -1 sets the user bandwidth to unlimited. /// /// /// @@ -322,10 +326,8 @@ public interface IUsersEntity : IEntityBase /// /// { /// "EnableFlashUpload":"true", - /// "EnableJavaUpload":"true" - /// . - /// . - /// . + /// "EnableJavaUpload":"true", + /// "...":"..." /// } /// /// @@ -398,15 +400,16 @@ public interface IUsersEntity : IEntityBase /// /// /// - IQuery Delete(Uri url, bool completely = false); + /// + /// + IQuery Delete(Uri url, bool completely = false, string itemsReassignTo = null, string groupsReassignTo = null); /// /// Delete multiple client users /// /// - /// { - /// ["id1","id2",...] - /// } + /// + /// ["id1","id2"] /// /// /// Removes a list of client users. The list should not exceed 100 client user ids. @@ -414,6 +417,42 @@ public interface IUsersEntity : IEntityBase /// IQuery DeleteClients(IEnumerable clientIds); + /// + /// Delete multiple client users + /// + /// + /// { + /// UserIds: ["id1", "id2"] + /// } + /// + /// + /// Removes a list of client users. The list should not exceed 100 client user ids. + /// + /// + /// + /// 204 if successful + /// + IQuery BulkDeleteClients(UserBulkOperationRequest deleteRequest); + + /// + /// Downgrade multiple employee users to clients + /// + /// + /// { + /// UserIds: ["id1", "id2"], + /// ReassignItemsToId: "id3", + /// ReassignGroupsToId: "id3" + /// } + /// + /// + /// Downgrades a list of employee users to clients. The list should not exceed 100 employee user ids. + /// + /// + /// + /// 204 if successful + /// + IQuery DowngradeEmployees(UserBulkDowngradeRequest downgradeRequest); + /// /// Get List of User Shared Folders /// @@ -599,6 +638,10 @@ public UsersEntity (IShareFileClient client) /// /// /// Retrieve a single user, by ID or email, or the currently authenticated user. + /// A user can retrieve another user when + /// * (1) The current user has AdminManageEmployees role + /// * OR + /// * (2) The current user has CanManageUsers role and the other user is a client /// /// /// @@ -608,11 +651,11 @@ public UsersEntity (IShareFileClient client) public IQuery Get(string id = null, string emailAddress = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); + sfApiQuery.From("Users"); sfApiQuery.QueryString("id", id); sfApiQuery.QueryString("emailAddress", emailAddress); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -650,10 +693,10 @@ public IQuery Get(string id = null, string emailAddress = null) /// /// The new user /// - public IQuery Create(User user, bool pushCreatorDefaultSettings = false, bool addshared = false, bool notify = false, bool ifNecessary = false, bool addPersonal = false) + public IQuery Create(User user, bool pushCreatorDefaultSettings = false, bool addshared = true, bool notify = false, bool ifNecessary = false, bool addPersonal = true) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); + sfApiQuery.From("Users"); sfApiQuery.QueryString("pushCreatorDefaultSettings", pushCreatorDefaultSettings); sfApiQuery.QueryString("addshared", addshared); sfApiQuery.QueryString("notify", notify); @@ -661,7 +704,7 @@ public IQuery Create(User user, bool pushCreatorDefaultSettings = false, b sfApiQuery.QueryString("addPersonal", addPersonal); sfApiQuery.Body = user; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -690,7 +733,7 @@ public IQuery Create(User user, bool pushCreatorDefaultSettings = false, b /// "CanManageUsers": false, /// "Roles": [ /// "CanChangePassword", "CanManageMySettings", - /// "CanUseFileBox, "CanManageUsers, "CanCreateFolders, "CanUseDropBox, "CanSelectFolderZone, + /// "CanUseFileBox", "CanManageUsers", "CanCreateFolders", "CanUseDropBox", "CanSelectFolderZone", /// "AdminAccountPolicies", "AdminBilling", "AdminBranding", "AdminChangePlan", "AdminFileBoxAccess", /// "AdminManageEmployees", "AdminRemoteUploadForms", "AdminReporting", "AdminSharedDistGroups", /// "AdminSharedAddressBook", "AdminViewReceipts", "AdminDelegate", "AdminManageFolderTemplates", @@ -714,11 +757,11 @@ public IQuery Create(User user, bool pushCreatorDefaultSettings = false, b /// /// The new employee user /// - public IQuery CreateAccountUser(AccountUser user, bool pushCreatorDefaultSettings = false, bool addshared = false, bool notify = false, bool ifNecessary = false, bool addPersonal = false) + public IQuery CreateAccountUser(AccountUser user, bool pushCreatorDefaultSettings = false, bool addshared = true, bool notify = false, bool ifNecessary = false, bool addPersonal = true) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("AccountUser"); + sfApiQuery.From("Users"); + sfApiQuery.Action("AccountUser"); sfApiQuery.QueryString("pushCreatorDefaultSettings", pushCreatorDefaultSettings); sfApiQuery.QueryString("addshared", addshared); sfApiQuery.QueryString("notify", notify); @@ -726,7 +769,7 @@ public IQuery CreateAccountUser(AccountUser user, bool pushCreatorDefaultS sfApiQuery.QueryString("addPersonal", addPersonal); sfApiQuery.Body = user; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -741,7 +784,7 @@ public IQuery CreateAccountUser(AccountUser user, bool pushCreatorDefaultS /// "Security": /// { /// "IsDisabled":false - /// } + /// }, /// "DefaultZone": /// { /// "Id":"newzoneid" @@ -764,7 +807,7 @@ public IQuery Update(Uri url, User user) sfApiQuery.Uri(url); sfApiQuery.Body = user; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -795,11 +838,11 @@ public IQuery Update(Uri url, User user) public IQuery UpdateRoles(Uri parentUrl, User user) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Roles"); + sfApiQuery.Action("Roles"); sfApiQuery.Uri(parentUrl); sfApiQuery.Body = user; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -830,20 +873,19 @@ public IQuery UpdateRoles(Uri parentUrl, User user) public IQuery PatchRoles(Uri parentUrl, User user) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Roles"); + sfApiQuery.Action("Roles"); sfApiQuery.Uri(parentUrl); sfApiQuery.Body = user; sfApiQuery.HttpMethod = "PUT"; - return sfApiQuery; + return sfApiQuery; } /// /// Remove Roles /// /// - /// { + /// /// [ "CanManageUsers", "CanSelectFolderZone" ] - /// } /// /// /// Removes the roles for user. @@ -861,11 +903,11 @@ public IQuery PatchRoles(Uri parentUrl, User user) public IQuery RemoveRoles(Uri userUrl, IEnumerable> userRoles) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("RemoveRoles"); + sfApiQuery.Action("RemoveRoles"); sfApiQuery.Uri(userUrl); sfApiQuery.Body = userRoles; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -878,10 +920,11 @@ public IQuery RemoveRoles(Uri userUrl, IEnumerable> userRoles /// "Company":"Company", /// "Email":"user@domain.com", /// "StorageQuotaLimitGB":100, + /// "Bandwidth": 50, /// "Security": /// { /// "IsDisabled":false - /// } + /// }, /// "DefaultZone": /// { /// "Id":"newzoneid" @@ -891,8 +934,8 @@ public IQuery RemoveRoles(Uri userUrl, IEnumerable> userRoles /// /// Modifies an existing user object /// The following parameters can be modified through this call: FirstName, LastName, Company, - /// Email, IsEmployee, IsDisabled, DefaultZone Id, StorageQuotaLimitGB.During a promotion (the user id points to Customer), the following parameters can be - /// modified: CanCreateFolders, CanUseFileBox, CanManageUsers. StorageQuotaLimitGB equal to -1 sets the user quota to the account default storage quota value. + /// Email, IsEmployee, IsDisabled, DefaultZone Id, StorageQuotaLimitGB, Bandwidth.During a promotion (the user id points to Customer), the following parameters can be + /// modified: CanCreateFolders, CanUseFileBox, CanManageUsers. StorageQuotaLimitGB equal to -1 sets the user quota to the account default storage quota value.Bandwidth equal to -1 sets the user bandwidth to unlimited. /// /// /// @@ -902,12 +945,12 @@ public IQuery RemoveRoles(Uri userUrl, IEnumerable> userRoles public IQuery UpdateAccountUser(string id, AccountUser user) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("AccountUser"); + sfApiQuery.From("Users"); + sfApiQuery.Action("AccountUser"); sfApiQuery.ActionIds(id); sfApiQuery.Body = user; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -923,10 +966,10 @@ public IQuery UpdateAccountUser(string id, AccountUser user) public IQuery GetHomeFolder(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("HomeFolder"); + sfApiQuery.Action("HomeFolder"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -939,10 +982,10 @@ public IQuery GetHomeFolder(Uri url) public IQuery> GetTopFolders(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("TopFolders"); + sfApiQuery.Action("TopFolders"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -955,10 +998,10 @@ public IQuery> GetTopFolders(Uri url) public IQuery> Box(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Box"); + sfApiQuery.Action("Box"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -971,10 +1014,10 @@ public IQuery> Box(Uri url) public IQuery FileBox(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("FileBox"); + sfApiQuery.Action("FileBox"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -991,10 +1034,10 @@ public IQuery FileBox(Uri url) public IQuery GetPreferences(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Preferences"); + sfApiQuery.Action("Preferences"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1003,10 +1046,8 @@ public IQuery GetPreferences(Uri url) /// /// { /// "EnableFlashUpload":"true", - /// "EnableJavaUpload":"true" - /// . - /// . - /// . + /// "EnableJavaUpload":"true", + /// "...":"..." /// } /// /// @@ -1014,11 +1055,11 @@ public IQuery GetPreferences(Uri url) public IQuery UpdatePreferences(Uri parentUrl, UserPreferences preferences) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Preferences"); + sfApiQuery.Action("Preferences"); sfApiQuery.Uri(parentUrl); sfApiQuery.Body = preferences; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1035,10 +1076,10 @@ public IQuery UpdatePreferences(Uri parentUrl, UserPreferences public IQuery GetSecurity(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Security"); + sfApiQuery.Action("Security"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1067,12 +1108,12 @@ public IQuery GetSecurity(Uri url) public IQuery ResetPassword(Uri url, ODataObject properties, bool notify = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("ResetPassword"); + sfApiQuery.Action("ResetPassword"); sfApiQuery.Uri(url); sfApiQuery.QueryString("notify", notify); sfApiQuery.Body = properties; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1086,12 +1127,12 @@ public IQuery ResetPassword(Uri url, ODataObject properties, bool notify = public IQuery ForgotPassword(string email, bool resetOnMobile = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("ForgotPassword"); + sfApiQuery.From("Users"); + sfApiQuery.Action("ForgotPassword"); sfApiQuery.QueryString("email", email); sfApiQuery.QueryString("resetOnMobile", resetOnMobile); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1105,11 +1146,11 @@ public IQuery ForgotPassword(string email, bool resetOnMobile = false) public IQuery ResendWelcome(Uri url, string customMessage = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("ResendWelcome"); + sfApiQuery.Action("ResendWelcome"); sfApiQuery.Uri(url); sfApiQuery.QueryString("customMessage", customMessage); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1120,22 +1161,25 @@ public IQuery ResendWelcome(Uri url, string customMessage = null) /// /// /// - public IQuery Delete(Uri url, bool completely = false) + /// + /// + public IQuery Delete(Uri url, bool completely = false, string itemsReassignTo = null, string groupsReassignTo = null) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); sfApiQuery.Uri(url); sfApiQuery.QueryString("completely", completely); + sfApiQuery.QueryString("itemsReassignTo", itemsReassignTo); + sfApiQuery.QueryString("groupsReassignTo", groupsReassignTo); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// /// Delete multiple client users /// /// - /// { - /// ["id1","id2",...] - /// } + /// + /// ["id1","id2"] /// /// /// Removes a list of client users. The list should not exceed 100 client user ids. @@ -1144,11 +1188,65 @@ public IQuery Delete(Uri url, bool completely = false) public IQuery DeleteClients(IEnumerable clientIds) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("Clients"); + sfApiQuery.From("Users"); + sfApiQuery.Action("Clients"); sfApiQuery.Body = clientIds; sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; + } + + /// + /// Delete multiple client users + /// + /// + /// { + /// UserIds: ["id1", "id2"] + /// } + /// + /// + /// Removes a list of client users. The list should not exceed 100 client user ids. + /// + /// + /// + /// 204 if successful + /// + public IQuery BulkDeleteClients(UserBulkOperationRequest deleteRequest) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("Users"); + sfApiQuery.Action("Clients"); + sfApiQuery.SubAction("BulkDelete"); + sfApiQuery.Body = deleteRequest; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Downgrade multiple employee users to clients + /// + /// + /// { + /// UserIds: ["id1", "id2"], + /// ReassignItemsToId: "id3", + /// ReassignGroupsToId: "id3" + /// } + /// + /// + /// Downgrades a list of employee users to clients. The list should not exceed 100 employee user ids. + /// + /// + /// + /// 204 if successful + /// + public IQuery DowngradeEmployees(UserBulkDowngradeRequest downgradeRequest) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("Users"); + sfApiQuery.Action("Employees"); + sfApiQuery.SubAction("Downgrade"); + sfApiQuery.Body = downgradeRequest; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; } /// @@ -1163,10 +1261,10 @@ public IQuery DeleteClients(IEnumerable clientIds) public IQuery> GetAllSharedFolders() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("AllSharedFolders"); + sfApiQuery.From("Users"); + sfApiQuery.Action("AllSharedFolders"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1183,10 +1281,10 @@ public IQuery> GetAllSharedFolders() public IQuery> GetTopFolders() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("TopFolders"); + sfApiQuery.From("Users"); + sfApiQuery.Action("TopFolders"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1201,10 +1299,10 @@ public IQuery> GetTopFolders() public IQuery> NetworkShareConnectors() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("NetworkShareConnectors"); + sfApiQuery.From("Users"); + sfApiQuery.Action("NetworkShareConnectors"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1219,10 +1317,10 @@ public IQuery> NetworkShareConnectors() public IQuery> SharepointConnectors() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("SharepointConnectors"); + sfApiQuery.From("Users"); + sfApiQuery.Action("SharepointConnectors"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1251,11 +1349,11 @@ public IQuery> SharepointConnectors() public IQuery Confirm(UserConfirmationSettings settings) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("Confirm"); + sfApiQuery.From("Users"); + sfApiQuery.Action("Confirm"); sfApiQuery.Body = settings; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1267,10 +1365,10 @@ public IQuery Confirm(UserConfirmationSettings settings) public IQuery GetInfo() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("Info"); + sfApiQuery.From("Users"); + sfApiQuery.Action("Info"); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1283,11 +1381,11 @@ public IQuery GetInfo() public IQuery DeleteEmailAddress(string email) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("DeleteEmailAddress"); + sfApiQuery.From("Users"); + sfApiQuery.Action("DeleteEmailAddress"); sfApiQuery.QueryString("email", email); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1300,11 +1398,11 @@ public IQuery DeleteEmailAddress(string email) public IQuery MakePrimary(string email) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("MakePrimary"); + sfApiQuery.From("Users"); + sfApiQuery.Action("MakePrimary"); sfApiQuery.QueryString("email", email); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1317,11 +1415,11 @@ public IQuery MakePrimary(string email) public IQuery SendConfirmationEmail(string email) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("SendConfirmationEmail"); + sfApiQuery.From("Users"); + sfApiQuery.Action("SendConfirmationEmail"); sfApiQuery.QueryString("email", email); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1333,10 +1431,10 @@ public IQuery SendConfirmationEmail(string email) public IQuery WebAppLink() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("WebAppLink"); + sfApiQuery.From("Users"); + sfApiQuery.Action("WebAppLink"); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1351,10 +1449,10 @@ public IQuery WebAppLink() public IQuery InboxMetadata(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("InboxMetadata"); + sfApiQuery.Action("InboxMetadata"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1369,12 +1467,12 @@ public IQuery InboxMetadata(Uri url) public IQuery> GetInbox(Uri url, ShareType type = ShareType.Both, bool archived = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Inbox"); + sfApiQuery.Action("Inbox"); sfApiQuery.Uri(url); sfApiQuery.QueryString("type", type); sfApiQuery.QueryString("archived", archived); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1389,10 +1487,10 @@ public IQuery> GetInbox(Uri url, ShareType type = ShareType.Bot public IQuery> SentMessages(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("SentMessages"); + sfApiQuery.Action("SentMessages"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1405,10 +1503,10 @@ public IQuery> SentMessages(Uri url) public IQuery WebAppManageUser(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("WebAppManageUser"); + sfApiQuery.Action("WebAppManageUser"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1420,10 +1518,10 @@ public IQuery WebAppManageUser(Uri url) public IQuery WebAppManageUsers() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("WebAppManageUsers"); + sfApiQuery.From("Users"); + sfApiQuery.Action("WebAppManageUsers"); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -1435,10 +1533,10 @@ public IQuery WebAppManageUsers() public IQuery WebAppAddEmployee() { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Users"); - sfApiQuery.Action("WebAppAddEmployee"); + sfApiQuery.From("Users"); + sfApiQuery.Action("WebAppAddEmployee"); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Entities/WebhookClientsEntity.cs b/src/ShareFile.Api.Client/Entities/WebhookClientsEntity.cs new file mode 100644 index 0000000..ce1b977 --- /dev/null +++ b/src/ShareFile.Api.Client/Entities/WebhookClientsEntity.cs @@ -0,0 +1,106 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using ShareFile.Api.Client; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; + + +namespace ShareFile.Api.Client.Entities +{ + public interface IWebhookClientsEntity : IEntityBase + { + + /// + /// Gets the configuration settings for a webhook client + /// + /// + /// + /// WebhookClient + /// + IQuery Get(Uri url); + + /// + /// Generates a new primary signature key for the webhook client + /// + /// + /// + /// WebhookClient + /// + IQuery GeneratePrimarySignatureKey(Uri url); + + /// + /// Generates a new secondary signature key for the webhook client + /// + /// + /// + /// WebhookClient + /// + IQuery GenerateSecondarySignatureKey(Uri url); + } + + public class WebhookClientsEntity : EntityBase, IWebhookClientsEntity + { + public WebhookClientsEntity (IShareFileClient client) + : base (client, "WebhookClients") + { } + + + /// + /// Gets the configuration settings for a webhook client + /// + /// + /// + /// WebhookClient + /// + public IQuery Get(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Generates a new primary signature key for the webhook client + /// + /// + /// + /// WebhookClient + /// + public IQuery GeneratePrimarySignatureKey(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("PrimarySignatureKey"); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Generates a new secondary signature key for the webhook client + /// + /// + /// + /// WebhookClient + /// + public IQuery GenerateSecondarySignatureKey(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("SecondarySignatureKey"); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + } +} diff --git a/src/ShareFile.Api.Client/Entities/WebhookSubscriptionsEntity.cs b/src/ShareFile.Api.Client/Entities/WebhookSubscriptionsEntity.cs new file mode 100644 index 0000000..9a670d2 --- /dev/null +++ b/src/ShareFile.Api.Client/Entities/WebhookSubscriptionsEntity.cs @@ -0,0 +1,163 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using ShareFile.Api.Client; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; + + +namespace ShareFile.Api.Client.Entities +{ + public interface IWebhookSubscriptionsEntity : IEntityBase + { + + /// + /// Gets a WebhookSubscription based on id + /// + /// + /// + /// WebhookSubscription + /// + IQuery Get(Uri url); + + /// + /// Gets all webhook subscriptions for the current user + /// + /// + /// List of WebhookSubscription + /// + IQuery> Get(); + + /// + /// Deletes a WebhookSubscription based on id + /// + /// + IQuery Delete(Uri url); + + /// + /// Creates a WebhookSubscription + /// + /// + /// { + /// "SubscriptionContext": { + /// "ResourceType": "Folder", + /// "ResourceId": "fo123" + /// }, + /// "WebhookUrl": "https://webhook.com", + /// "Events": + /// [ + /// { "ResourceType":"File", "OperationName":"Upload" }, + /// { "ResourceType":"File", "OperationName":"Update" }, + /// { "ResourceType":"File", "OperationName":"Download" }, + /// { "ResourceType":"File", "OperationName":"Delete" }, + /// ] + /// } + /// + /// + /// The above example subscribes `https://webhook.com` endpoint to be called when a File Upload, Update, Download or Delete + /// event happened for folder `fo123`. + /// Note: Context Resource Id is required for all but the account context. + /// The MasterAdmin role is required to create account context subscriptions. + /// + /// + /// WebhookSubscription + /// + IQuery Create(WebhookSubscription subscription); + } + + public class WebhookSubscriptionsEntity : EntityBase, IWebhookSubscriptionsEntity + { + public WebhookSubscriptionsEntity (IShareFileClient client) + : base (client, "WebhookSubscriptions") + { } + + + /// + /// Gets a WebhookSubscription based on id + /// + /// + /// + /// WebhookSubscription + /// + public IQuery Get(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Gets all webhook subscriptions for the current user + /// + /// + /// List of WebhookSubscription + /// + public IQuery> Get() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.From("WebhookSubscriptions"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Deletes a WebhookSubscription based on id + /// + /// + public IQuery Delete(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "DELETE"; + return sfApiQuery; + } + + /// + /// Creates a WebhookSubscription + /// + /// + /// { + /// "SubscriptionContext": { + /// "ResourceType": "Folder", + /// "ResourceId": "fo123" + /// }, + /// "WebhookUrl": "https://webhook.com", + /// "Events": + /// [ + /// { "ResourceType":"File", "OperationName":"Upload" }, + /// { "ResourceType":"File", "OperationName":"Update" }, + /// { "ResourceType":"File", "OperationName":"Download" }, + /// { "ResourceType":"File", "OperationName":"Delete" }, + /// ] + /// } + /// + /// + /// The above example subscribes `https://webhook.com` endpoint to be called when a File Upload, Update, Download or Delete + /// event happened for folder `fo123`. + /// Note: Context Resource Id is required for all but the account context. + /// The MasterAdmin role is required to create account context subscriptions. + /// + /// + /// WebhookSubscription + /// + public IQuery Create(WebhookSubscription subscription) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.From("WebhookSubscriptions"); + sfApiQuery.Body = subscription; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + } +} diff --git a/src/ShareFile.Api.Client/Entities/WorkflowsEntity.cs b/src/ShareFile.Api.Client/Entities/WorkflowsEntity.cs new file mode 100644 index 0000000..a6de86b --- /dev/null +++ b/src/ShareFile.Api.Client/Entities/WorkflowsEntity.cs @@ -0,0 +1,299 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using ShareFile.Api.Client; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; + + +namespace ShareFile.Api.Client.Entities +{ + public interface IWorkflowsEntity : IEntityBase + { + + /// + /// Gets workflows initiated by the current user. + /// + /// + /// Restrictions: + /// * Skip must be a multiple of 25. + /// * Top must be 25. It's preferred to not supply this. + /// * Sort is only supported for LastUpdatedDate and Due + /// + /// + /// A feed of Workflow objects + /// + IQuery> GetInitiated(); + + /// + /// Gets workflows shared with the current user. + /// + /// + /// Restrictions: + /// * Skip must be a multiple of 25. + /// * Top must be 25. It's preferred to not supply this. + /// * Sort is only supported for LastUpdatedDate and Due + /// + /// + /// A feed of Workflow objects + /// + IQuery> GetShared(); + + /// + /// Get a workflow by id. + /// + /// + /// + /// A Workflow object + /// + IQuery Get(Uri url); + + /// + /// Get a protocol link to view a workflow in a web browser. + /// + /// + /// Only the latest version of each major browser is supported. + /// + /// + /// + /// A ItemProtocolLink set for the Workflow + /// + IQuery GetLink(Uri url); + + /// + /// Create an Approval Workflow + /// + /// + /// { + /// "Participants": + /// [ + /// { + /// "Contact": + /// { + /// "Email": "contact@email.com" + /// }, + /// "Role": "Active" + /// }, + /// { + /// "Contact": + /// { + /// "Email": "contact.cc@email.com" + /// }, + /// "Role": "Passive" + /// } + /// ] + /// } + /// + /// + /// + /// + /// A new approval workflow + /// + IQuery CreateApproval(Uri url, CreateWorkflowParams request); + + /// + /// Create a Feedback Workflow + /// + /// + /// { + /// "Participants": + /// [ + /// { + /// "Contact": + /// { + /// "Email": "contact@email.com" + /// }, + /// "Role": "Active" + /// }, + /// { + /// "Contact": + /// { + /// "Email": "contact.cc@email.com" + /// }, + /// "Role": "Passive" + /// } + /// ] + /// } + /// + /// + /// + /// + /// A new feedback workflow + /// + IQuery CreateFeedback(Uri url, CreateWorkflowParams request); + } + + public class WorkflowsEntity : EntityBase, IWorkflowsEntity + { + public WorkflowsEntity (IShareFileClient client) + : base (client, "Workflows") + { } + + + /// + /// Gets workflows initiated by the current user. + /// + /// + /// Restrictions: + /// * Skip must be a multiple of 25. + /// * Top must be 25. It's preferred to not supply this. + /// * Sort is only supported for LastUpdatedDate and Due + /// + /// + /// A feed of Workflow objects + /// + public IQuery> GetInitiated() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.From("Workflows"); + sfApiQuery.Action("Initiated"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Gets workflows shared with the current user. + /// + /// + /// Restrictions: + /// * Skip must be a multiple of 25. + /// * Top must be 25. It's preferred to not supply this. + /// * Sort is only supported for LastUpdatedDate and Due + /// + /// + /// A feed of Workflow objects + /// + public IQuery> GetShared() + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); + sfApiQuery.From("Workflows"); + sfApiQuery.Action("Shared"); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get a workflow by id. + /// + /// + /// + /// A Workflow object + /// + public IQuery Get(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Get a protocol link to view a workflow in a web browser. + /// + /// + /// Only the latest version of each major browser is supported. + /// + /// + /// + /// A ItemProtocolLink set for the Workflow + /// + public IQuery GetLink(Uri url) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Link"); + sfApiQuery.Uri(url); + sfApiQuery.HttpMethod = "GET"; + return sfApiQuery; + } + + /// + /// Create an Approval Workflow + /// + /// + /// { + /// "Participants": + /// [ + /// { + /// "Contact": + /// { + /// "Email": "contact@email.com" + /// }, + /// "Role": "Active" + /// }, + /// { + /// "Contact": + /// { + /// "Email": "contact.cc@email.com" + /// }, + /// "Role": "Passive" + /// } + /// ] + /// } + /// + /// + /// + /// + /// A new approval workflow + /// + public IQuery CreateApproval(Uri url, CreateWorkflowParams request) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Workflows"); + sfApiQuery.Uri(url); + sfApiQuery.SubAction("Approval"); + sfApiQuery.Body = request; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + + /// + /// Create a Feedback Workflow + /// + /// + /// { + /// "Participants": + /// [ + /// { + /// "Contact": + /// { + /// "Email": "contact@email.com" + /// }, + /// "Role": "Active" + /// }, + /// { + /// "Contact": + /// { + /// "Email": "contact.cc@email.com" + /// }, + /// "Role": "Passive" + /// } + /// ] + /// } + /// + /// + /// + /// + /// A new feedback workflow + /// + public IQuery CreateFeedback(Uri url, CreateWorkflowParams request) + { + var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); + sfApiQuery.Action("Workflows"); + sfApiQuery.Uri(url); + sfApiQuery.SubAction("Feedback"); + sfApiQuery.Body = request; + sfApiQuery.HttpMethod = "POST"; + return sfApiQuery; + } + } +} diff --git a/src/ShareFile.Api.Client/Entities/ZonesEntity.cs b/src/ShareFile.Api.Client/Entities/ZonesEntity.cs index 8dc3839..60cf791 100644 --- a/src/ShareFile.Api.Client/Entities/ZonesEntity.cs +++ b/src/ShareFile.Api.Client/Entities/ZonesEntity.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -using ShareFile.Api.Models; using ShareFile.Api.Client; -using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Entities @@ -158,8 +158,7 @@ public interface IZonesEntity : IEntityBase /// /// [ /// {"Name":"metadataName1", "Value":"metadataValue1", "IsPublic":"true"}, - /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"}, - /// ... + /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"} /// ] /// /// @@ -209,11 +208,11 @@ public ZonesEntity (IShareFileClient client) public IQuery> Get(ZoneService services = ZoneService.StorageZone, bool includeDisabled = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.From("Zones"); + sfApiQuery.From("Zones"); sfApiQuery.QueryString("services", services); sfApiQuery.QueryString("includeDisabled", includeDisabled); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -235,7 +234,7 @@ public IQuery Get(Uri url, bool secret = false) sfApiQuery.Uri(url); sfApiQuery.QueryString("secret", secret); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -257,10 +256,10 @@ public IQuery Get(Uri url, bool secret = false) public IQuery Create(Zone zone) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.From("Zones"); + sfApiQuery.From("Zones"); sfApiQuery.Body = zone; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -287,7 +286,7 @@ public IQuery Update(Uri url, Zone zone) sfApiQuery.Uri(url); sfApiQuery.Body = zone; sfApiQuery.HttpMethod = "PATCH"; - return sfApiQuery; + return sfApiQuery; } /// @@ -306,7 +305,7 @@ public IQuery Delete(Uri url, bool force = false, string newDefaultZoneId = null sfApiQuery.QueryString("force", force); sfApiQuery.QueryString("newDefaultZoneId", newDefaultZoneId); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -325,10 +324,10 @@ public IQuery Delete(Uri url, bool force = false, string newDefaultZoneId = null public IQuery ResetSecret(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("ResetSecret"); + sfApiQuery.Action("ResetSecret"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -341,10 +340,10 @@ public IQuery ResetSecret(Uri url) public IQuery> GetTenants(Uri parentUrl) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Tenants"); + sfApiQuery.Action("Tenants"); sfApiQuery.Uri(parentUrl); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -355,11 +354,11 @@ public IQuery> GetTenants(Uri parentUrl) public IQuery CreateTenants(Uri parentUrl, string accountId) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Tenants"); + sfApiQuery.Action("Tenants"); sfApiQuery.Uri(parentUrl); sfApiQuery.QueryString("accountId", accountId); sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -372,13 +371,13 @@ public IQuery CreateTenants(Uri parentUrl, string accountId) public IQuery DeleteTenants(Uri parentUrl, string id, string newDefaultZoneId, bool expireItems = false) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Tenants"); + sfApiQuery.Action("Tenants"); sfApiQuery.Uri(parentUrl); sfApiQuery.ActionIds(id); sfApiQuery.QueryString("newDefaultZoneId", newDefaultZoneId); sfApiQuery.QueryString("expireItems", expireItems); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } /// @@ -394,10 +393,10 @@ public IQuery DeleteTenants(Uri parentUrl, string id, string newDefaultZoneId, b public IQuery> GetMetadata(Uri url) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); sfApiQuery.HttpMethod = "GET"; - return sfApiQuery; + return sfApiQuery; } /// @@ -406,8 +405,7 @@ public IQuery> GetMetadata(Uri url) /// /// [ /// {"Name":"metadataName1", "Value":"metadataValue1", "IsPublic":"true"}, - /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"}, - /// ... + /// {"Name":"metadataName2", "Value":"metadataValue2", "IsPublic":"false"} /// ] /// /// @@ -421,11 +419,11 @@ public IQuery> GetMetadata(Uri url) public IQuery> CreateMetadata(Uri url, IEnumerable metadata) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query>(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); sfApiQuery.Body = metadata; sfApiQuery.HttpMethod = "POST"; - return sfApiQuery; + return sfApiQuery; } /// @@ -442,11 +440,11 @@ public IQuery> CreateMetadata(Uri url, IEnumerable public IQuery DeleteMetadata(Uri url, string name) { var sfApiQuery = new ShareFile.Api.Client.Requests.Query(Client); - sfApiQuery.Action("Metadata"); + sfApiQuery.Action("Metadata"); sfApiQuery.Uri(url); sfApiQuery.QueryString("name", name); sfApiQuery.HttpMethod = "DELETE"; - return sfApiQuery; + return sfApiQuery; } } } diff --git a/src/ShareFile.Api.Client/Enums/AddressListType.cs b/src/ShareFile.Api.Client/Enums/AddressListType.cs index ca333c9..0659266 100644 --- a/src/ShareFile.Api.Client/Enums/AddressListType.cs +++ b/src/ShareFile.Api.Client/Enums/AddressListType.cs @@ -1,5 +1,5 @@ // ReSharper disable once CheckNamespace -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public enum AddressListType { diff --git a/src/ShareFile.Api.Client/Enums/SafeEnum.cs b/src/ShareFile.Api.Client/Enums/SafeEnum.cs index 184c444..be3c299 100644 --- a/src/ShareFile.Api.Client/Enums/SafeEnum.cs +++ b/src/ShareFile.Api.Client/Enums/SafeEnum.cs @@ -1,7 +1,7 @@ using System; // ReSharper disable once CheckNamespace -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public interface ISafeEnum { @@ -12,19 +12,7 @@ public interface ISafeEnum public struct SafeEnum : ISafeEnum, IEquatable> where TEnumSource : struct { - private TEnumSource? _enum; - public TEnumSource? Enum - { - get { return _enum; } - set - { - _enum = value; - if (null != value) - { - _value = value.Value.ToString(); - } - } - } + public TEnumSource? Enum { get; set; } public object Object { @@ -41,7 +29,7 @@ public string Value public static SafeEnum Create(TSource enumSourceValue) where TSource : struct { - var instance = Activator.CreateInstance>(); + var instance = default(SafeEnum); instance.Enum = enumSourceValue; return instance; @@ -54,9 +42,9 @@ public override string ToString() public override int GetHashCode() { - if (_enum.HasValue) + if (Enum.HasValue) { - return _enum.GetValueOrDefault().GetHashCode(); + return Enum.GetValueOrDefault().GetHashCode(); } else { @@ -66,16 +54,31 @@ public override int GetHashCode() public bool Equals(SafeEnum other) { - if (Enum.HasValue && other.Enum.HasValue) + if(Enum.HasValue) { - return Enum.Value.Equals(other.Enum.Value); + if(other.Enum.HasValue) + { + return Enum.Value.Equals(other.Enum.Value); + } + else if(other._value != null) + { + return string.Equals(Enum.Value.ToString(), other._value, StringComparison.OrdinalIgnoreCase); + } + return false; } - if (Value != null && other.Value != null) + else if(_value != null) { - return String.Equals(Value, other.Value, StringComparison.OrdinalIgnoreCase); + if(other.Enum.HasValue) + { + return string.Equals(_value, other.Enum.Value.ToString(), StringComparison.OrdinalIgnoreCase); + } + else if(other._value != null) + { + return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + } + return false; } - - return true; + return other.Enum == null && other._value == null; } public override bool Equals(object obj) diff --git a/src/ShareFile.Api.Client/Events/ChangeDomainCallback.cs b/src/ShareFile.Api.Client/Events/ChangeDomainCallback.cs index ab729f2..c9c8381 100644 --- a/src/ShareFile.Api.Client/Events/ChangeDomainCallback.cs +++ b/src/ShareFile.Api.Client/Events/ChangeDomainCallback.cs @@ -1,5 +1,5 @@ using System.Net.Http; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Events { diff --git a/src/ShareFile.Api.Client/Events/EventHandlerResponse.cs b/src/ShareFile.Api.Client/Events/EventHandlerResponse.cs index 91753e8..c277ec9 100644 --- a/src/ShareFile.Api.Client/Events/EventHandlerResponse.cs +++ b/src/ShareFile.Api.Client/Events/EventHandlerResponse.cs @@ -1,4 +1,4 @@ -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Events { diff --git a/src/ShareFile.Api.Client/Exceptions/ApiDownException.cs b/src/ShareFile.Api.Client/Exceptions/ApiDownException.cs new file mode 100644 index 0000000..2b4a1c4 --- /dev/null +++ b/src/ShareFile.Api.Client/Exceptions/ApiDownException.cs @@ -0,0 +1,12 @@ +using System; + +namespace ShareFile.Api.Client.Exceptions +{ + public class ApiDownException : Exception + { + public ApiDownException() + : base("The API is currently in maintenance mode. Try again later.") + { + } + } +} diff --git a/src/ShareFile.Api.Client/Exceptions/AsyncOperationScheduledException.cs b/src/ShareFile.Api.Client/Exceptions/AsyncOperationScheduledException.cs index aa178ad..9ff6258 100644 --- a/src/ShareFile.Api.Client/Exceptions/AsyncOperationScheduledException.cs +++ b/src/ShareFile.Api.Client/Exceptions/AsyncOperationScheduledException.cs @@ -1,5 +1,5 @@ using System; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Exceptions { diff --git a/src/ShareFile.Api.Client/Exceptions/HttpsExpectedException.cs b/src/ShareFile.Api.Client/Exceptions/HttpsExpectedException.cs index 537ea5f..c0a6d53 100644 --- a/src/ShareFile.Api.Client/Exceptions/HttpsExpectedException.cs +++ b/src/ShareFile.Api.Client/Exceptions/HttpsExpectedException.cs @@ -4,6 +4,8 @@ namespace ShareFile.Api.Client.Exceptions { public class HttpsExpectedException : Exception { + public Uri RedirectUri { get; set; } + public HttpsExpectedException() : base("A redirect request will change a secure to a non-secure connection") { diff --git a/src/ShareFile.Api.Client/Exceptions/ODataRequestException.cs b/src/ShareFile.Api.Client/Exceptions/ODataRequestException.cs index 5336df6..18cda28 100644 --- a/src/ShareFile.Api.Client/Exceptions/ODataRequestException.cs +++ b/src/ShareFile.Api.Client/Exceptions/ODataRequestException.cs @@ -1,7 +1,8 @@ using System; +using System.Collections.Generic; using System.Net; using Newtonsoft.Json; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Exceptions { @@ -13,6 +14,8 @@ public class ODataRequestException public ODataExceptionMessage Message { get; set; } [JsonProperty("reason")] public SafeEnum ExceptionReason { get; set; } + [JsonProperty("errorLog")] + public List ErrorLog { get; set; } } public class ODataException : Exception @@ -20,7 +23,7 @@ public class ODataException : Exception public HttpStatusCode Code { get; set; } public ODataExceptionMessage ODataExceptionMessage { get; set; } public SafeEnum ExceptionReason { get; set; } - + public List ErrorLog { get; set; } public override string Message { get diff --git a/src/ShareFile.Api.Client/Extensions/ContactExtensions.cs b/src/ShareFile.Api.Client/Extensions/ContactExtensions.cs index 866494f..052896e 100644 --- a/src/ShareFile.Api.Client/Extensions/ContactExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/ContactExtensions.cs @@ -1,4 +1,4 @@ -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Extensions { diff --git a/src/ShareFile.Api.Client/Extensions/HttpRequestMessageExtensions.cs b/src/ShareFile.Api.Client/Extensions/HttpRequestMessageExtensions.cs index 37a8cc4..affc2b9 100644 --- a/src/ShareFile.Api.Client/Extensions/HttpRequestMessageExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/HttpRequestMessageExtensions.cs @@ -5,7 +5,7 @@ using System.Net.Http.Headers; using ShareFile.Api.Client.Requests.Providers; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Extensions { @@ -31,11 +31,21 @@ public static void AddDefaultHeaders(this HttpRequestMessage requestMessage, Sha } } - if (client.Configuration.UserAgent != null) + if (!string.IsNullOrEmpty(client.Configuration.UserAgent)) { requestMessage.Headers.Add("User-Agent", client.Configuration.UserAgent); } + if (!string.IsNullOrEmpty(client.Configuration.ToolName)) + { + requestMessage.Headers.Add("X-SFAPI-Tool", client.Configuration.ToolName); + } + + if(!string.IsNullOrEmpty(client.Configuration.ToolVersion)) + { + requestMessage.Headers.Add("X-SFAPI-ToolVersion", client.Configuration.ToolVersion); + } + requestMessage.TryAddCookies(client); } @@ -72,12 +82,6 @@ public static void TryAddAuthorizationHeaders(this HttpRequestMessage requestMes requestMessage.Headers.Authorization = authorizationHeader; } } - - if (isLoginRequest) - { - requestMessage.Headers.Add("X-SFAPI-Tool", client.Configuration.ToolName); - requestMessage.Headers.Add("X-SFAPI-ToolVersion", client.Configuration.ToolVersion); - } } public static HttpRequestMessage Clone(this HttpRequestMessage req, Uri newUri = null) diff --git a/src/ShareFile.Api.Client/Extensions/HttpResponseMessageExtensions.cs b/src/ShareFile.Api.Client/Extensions/HttpResponseMessageExtensions.cs index 9978f48..ae44c08 100644 --- a/src/ShareFile.Api.Client/Extensions/HttpResponseMessageExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/HttpResponseMessageExtensions.cs @@ -34,7 +34,12 @@ public static Uri GetSecureRedirect(this HttpResponseMessage message) } if (!redirectTo.Scheme.Equals("https", StringComparison.OrdinalIgnoreCase)) { - throw new HttpsExpectedException(); + if (string.Equals(redirectTo.Host, "maintenance.sharefile.com", StringComparison.OrdinalIgnoreCase)) + { + throw new ApiDownException(); + } + + throw new HttpsExpectedException { RedirectUri = redirectTo }; } return redirectTo; } diff --git a/src/ShareFile.Api.Client/Extensions/ODataObjectExtensions.cs b/src/ShareFile.Api.Client/Extensions/ODataObjectExtensions.cs index c22e0b7..4533914 100644 --- a/src/ShareFile.Api.Client/Extensions/ODataObjectExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/ODataObjectExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using Newtonsoft.Json.Linq; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Extensions { diff --git a/src/ShareFile.Api.Client/Extensions/ObjectExtensions.cs b/src/ShareFile.Api.Client/Extensions/ObjectExtensions.cs index fd964df..8997dec 100644 --- a/src/ShareFile.Api.Client/Extensions/ObjectExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/ObjectExtensions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Extensions { diff --git a/src/ShareFile.Api.Client/Extensions/QueryExtensions.cs b/src/ShareFile.Api.Client/Extensions/QueryExtensions.cs index 5f463b9..16ba5b6 100644 --- a/src/ShareFile.Api.Client/Extensions/QueryExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/QueryExtensions.cs @@ -7,7 +7,7 @@ using ShareFile.Api.Client; using ShareFile.Api.Client.Requests; using System.Reflection; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; using System.Threading; using System.Threading.Tasks; @@ -112,22 +112,20 @@ public static ICollection SelectAndExecute(this IQuery result = modifiedQuery.Execute(); return result.Feed.Select(mapExpr.Compile()).ToList(); } - -#if ASYNC - public static async Task SelectAndExecute(this IQuery modelQuery, Expression> mapExpr, CancellationToken? cancelToken = null) where Model : ODataObject + + public static async Task SelectAndExecute(this IQuery modelQuery, Expression> mapExpr, CancellationToken cancelToken = default(CancellationToken)) where Model : ODataObject { IQuery modifiedQuery = ApplySelectsAndExpands(modelQuery, mapExpr); Model result = await modifiedQuery.ExecuteAsync(cancelToken).ConfigureAwait(false); return mapExpr.Compile()(result); } - public static async Task> SelectAndExecute(this IQuery> modelQuery, Expression> mapExpr, CancellationToken? cancelToken = null) where Model : ODataObject + public static async Task> SelectAndExecute(this IQuery> modelQuery, Expression> mapExpr, CancellationToken cancelToken = default(CancellationToken)) where Model : ODataObject { IQuery> modifiedQuery = ApplySelectsAndExpands(modelQuery, mapExpr); ODataFeed result = await modifiedQuery.ExecuteAsync(cancelToken).ConfigureAwait(false); return result.Feed.Select(mapExpr.Compile()).ToList(); } -#endif #endregion public static IQuery ApplySelectsAndExpands(IQuery query, LambdaExpression lambda) diff --git a/src/ShareFile.Api.Client/Extensions/StringExtensions.cs b/src/ShareFile.Api.Client/Extensions/StringExtensions.cs index 38aa473..2ea8060 100644 --- a/src/ShareFile.Api.Client/Extensions/StringExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/StringExtensions.cs @@ -57,5 +57,24 @@ public static string ToBase64(this string val) return Convert.ToBase64String(Encoding.UTF8.GetBytes(val)); } + + private static string[] FileSizeSuffixes = new[] { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" }; + + public static string ToFileSizeString(this long size) + { + string suffix = FileSizeSuffixes[0]; + long unit = 1; + for(int i = 1; i < FileSizeSuffixes.Length; i++) + { + long nextUnit = unit * 1024; + if (size < nextUnit) + break; + + suffix = FileSizeSuffixes[i]; + unit = nextUnit; + } + return $"{((double)size / unit).ToString("F")} {suffix}"; + } + } } diff --git a/src/ShareFile.Api.Client/Extensions/TaskExtensions.cs b/src/ShareFile.Api.Client/Extensions/TaskExtensions.cs index 33d99db..f7f0d79 100644 --- a/src/ShareFile.Api.Client/Extensions/TaskExtensions.cs +++ b/src/ShareFile.Api.Client/Extensions/TaskExtensions.cs @@ -61,17 +61,9 @@ public static System.Net.Http.HttpResponseMessage WaitForTask(this Task(); - int current = 0; - while (current < path.Length) - { - int next = path.IndexOf('/', current); - if (next == -1) - { - next = path.Length - 1; - } - pathSegments.Add(path.Substring(current, (next - current) + 1)); - current = next + 1; - } - segments = pathSegments.ToArray(); - } - } - return segments; - } + if (path.Length == 0) + { + segments = new string[0]; + } + else + { + var pathSegments = new List(); + int current = 0; + while (current < path.Length) + { + int next = path.IndexOf('/', current); + if (next == -1) + { + next = path.Length - 1; + } + pathSegments.Add(path.Substring(current, (next - current) + 1)); + current = next + 1; + } + segments = pathSegments.ToArray(); + } + } + return segments; + } - public static string GetAuthority(this Uri uri) - { - return string.Format("{0}://{1}", uri.GetComponents(UriComponents.Scheme, UriFormat.Unescaped), uri.GetComponents(UriComponents.Host, UriFormat.Unescaped)); - } + public static string GetAuthority(this Uri uri) + { + return string.Format("{0}://{1}", uri.GetComponents(UriComponents.Scheme, UriFormat.Unescaped), uri.GetComponents(UriComponents.Host, UriFormat.Unescaped)); + } - private static readonly char[] EqualsChar = { '=' }; - private static readonly char[] AmpersandChar = { '&' }; - /// - /// Convert Uri.Query into collection of - /// - /// - /// - public static IEnumerable GetQueryAsODataParameters(this Uri uri) - { - foreach (var parameter in uri.Query.Substring(1).Split(AmpersandChar, StringSplitOptions.RemoveEmptyEntries)) - { - var kvp = parameter.Split(EqualsChar); - if (kvp.Length == 1) + private const char EqualsChar = '='; + private static readonly char[] AmpersandChar = { '&' }; + private const int NotFoundPosition = -1; + /// + /// Convert Uri.Query into collection of + /// + /// + /// + public static IEnumerable GetQueryAsODataParameters(this Uri uri) + { + foreach (var parameter in uri.Query.Substring(1).Split(AmpersandChar, StringSplitOptions.RemoveEmptyEntries)) + { + int keyValueSeparatorPosition = parameter.IndexOf(EqualsChar); + if(keyValueSeparatorPosition == NotFoundPosition) { - yield return new ODataParameter(Uri.UnescapeDataString(kvp[0])); + yield return new ODataParameter(key: Uri.UnescapeDataString(parameter), value: ""); + continue; } - else + string key = parameter.Substring(0, keyValueSeparatorPosition); + string value = ""; + if(keyValueSeparatorPosition + 1 < parameter.Length) { - yield return new ODataParameter(Uri.UnescapeDataString(kvp[0]), Uri.UnescapeDataString(kvp[1])); + value = parameter.Substring(keyValueSeparatorPosition + 1); } - } - } - } + yield return new ODataParameter(key: Uri.UnescapeDataString(key), value: Uri.UnescapeDataString(value)); + } + } + } } diff --git a/src/ShareFile.Api.Client/FileSystem/IPlatformFile.cs b/src/ShareFile.Api.Client/FileSystem/IPlatformFile.cs deleted file mode 100644 index fd0aa66..0000000 --- a/src/ShareFile.Api.Client/FileSystem/IPlatformFile.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; - -namespace ShareFile.Api.Client.FileSystem -{ - public interface IPlatformFile : IDisposable - { - string FullName { get; } - string Name { get; } - long Length { get; } - -#if ASYNC - Task OpenReadAsync(); - Task OpenWriteAsync(); -#endif - - Stream OpenRead(); - Stream OpenWrite(); - } -} diff --git a/src/ShareFile.Api.Client/FileSystem/PlatformFileInfo.cs b/src/ShareFile.Api.Client/FileSystem/PlatformFileInfo.cs deleted file mode 100644 index bef72c9..0000000 --- a/src/ShareFile.Api.Client/FileSystem/PlatformFileInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#if NET45 -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ShareFile.Api.Client.FileSystem -{ - public class PlatformFileInfo : IPlatformFile - { - public void Dispose() - { - - } - - public PlatformFileInfo(FileInfo fileInfo) - { - _fileInfo = fileInfo; - - FullName = _fileInfo.FullName; - Name = _fileInfo.Name; - Length = _fileInfo.Length; - } - - private readonly FileInfo _fileInfo; - - public string FullName { get; private set; } - public string Name { get; private set; } - public long Length { get; private set; } - - public Task OpenReadAsync() - { - return Task.FromResult((Stream)_fileInfo.OpenRead()); - } - - public Task OpenWriteAsync() - { - return Task.FromResult((Stream)_fileInfo.OpenWrite()); - } - - public Stream OpenRead() - { - return _fileInfo.OpenRead(); - } - - public Stream OpenWrite() - { - return _fileInfo.OpenWrite(); - } - } -} -#endif \ No newline at end of file diff --git a/src/ShareFile.Api.Client/FileSystem/PlatformFileStream.cs b/src/ShareFile.Api.Client/FileSystem/PlatformFileStream.cs deleted file mode 100644 index 5409dc1..0000000 --- a/src/ShareFile.Api.Client/FileSystem/PlatformFileStream.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; - -namespace ShareFile.Api.Client.FileSystem -{ - public sealed class PlatformFileStream : IPlatformFile - { - public PlatformFileStream(Stream stream, long length, string name, string fullName = null) - { - FStream = stream; - Length = length; - Name = name; - FullName = fullName ?? name; - } - - public void Dispose() - { - Dispose(true); - } - - public void Dispose(bool disposeAllResources) - { - if (FStream != null) - { - FStream.Dispose(); - } - GC.SuppressFinalize(this); - } - - private readonly Stream FStream; - public string FullName { get; private set; } - public string Name { get; private set; } - public long Length { get; private set; } - public DateTimeOffset LastModified { get; private set; } - -#if ASYNC - public Task OpenReadAsync() - { - if (FStream != null) - { - if (FStream.CanSeek) - { - return Task.FromResult(FStream); - } - - throw new Exception("Stream is not seekable."); - } - - throw new Exception("Stream has not been provided."); - } - - public Task OpenWriteAsync() - { - if (FStream.CanWrite) - { - return Task.FromResult(FStream); - } - - throw new Exception("Stream is not writable."); - } -#endif - - public Stream OpenRead() - { - if (FStream != null) - { - if (FStream.CanSeek) - { - return FStream; - } - - throw new Exception("Stream is not seekable."); - } - - throw new Exception("Stream has not been provided."); - } - - public Stream OpenWrite() - { - if (FStream.CanWrite) - { - return FStream; - } - - throw new Exception("Stream is not writable."); - } - } -} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Logging/ActionStopwatch.cs b/src/ShareFile.Api.Client/Logging/ActionStopwatch.cs index d1d29b7..2fad038 100644 --- a/src/ShareFile.Api.Client/Logging/ActionStopwatch.cs +++ b/src/ShareFile.Api.Client/Logging/ActionStopwatch.cs @@ -61,12 +61,13 @@ public interface IStopwatch void Stop(); void Reset(); void Restart(); + TimeSpan Elapsed { get; } long ElapsedMilliseconds { get; } bool IsRunning { get; } } /// - /// Portable implementation of System.Diagnostics.Stopwatch. If you're platform provides a higher precision implementation, + /// Portable implementation of System.Diagnostics.Stopwatch. If your platform provides a higher precision implementation, /// most will, just register with the StopwatchFactory. /// public class Stopwatch : IStopwatch @@ -114,6 +115,8 @@ public void Restart() Start(); } + public TimeSpan Elapsed => TimeSpan.FromMilliseconds(ElapsedMilliseconds); + public long ElapsedMilliseconds { get { return GetElapsedTicks() / TicksPerMillisecond; } diff --git a/src/ShareFile.Api.Client/Models/AccessControl.cs b/src/ShareFile.Api.Client/Models/AccessControl.cs index 3df4852..8f60776 100644 --- a/src/ShareFile.Api.Client/Models/AccessControl.cs +++ b/src/ShareFile.Api.Client/Models/AccessControl.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,55 +17,51 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a rule configuring access of a Principal to an Item. + /// public class AccessControl : ODataObject { - /// /// Item that was given permission through this rule /// public Item Item { get; set; } - + /// + /// Principal - User or Group - that has been granted permissions through this rule + /// public Principal Principal { get; set; } - /// /// Defines whether the principal can add files (upload) into the Item /// public bool? CanUpload { get; set; } - /// /// Defines whether the principal can read file content (download) from this Item /// public bool? CanDownload { get; set; } - /// /// Defines whether the principal can view items (browse) from this Item /// public bool? CanView { get; set; } - /// /// Defines whether the principal can remove items from this Item /// public bool? CanDelete { get; set; } - /// /// Defines whether the principal can configure Access Controls in this Item /// public bool? CanManagePermissions { get; set; } - /// /// Defines the notification preference for upload events. If set, the principal will receive /// notifications when new files are uploaded into this Item /// public bool? NotifyOnUpload { get; set; } - /// /// Defines the notification preference for download events. If set, the principal will receive /// notifiation when items are downloaded from this Item. /// public bool? NotifyOnDownload { get; set; } - /// /// Defines whether the principal is the owner of this Item /// diff --git a/src/ShareFile.Api.Client/Models/AccessControlBulkResult.cs b/src/ShareFile.Api.Client/Models/AccessControlBulkResult.cs index 0fe8ccb..e51c2af 100644 --- a/src/ShareFile.Api.Client/Models/AccessControlBulkResult.cs +++ b/src/ShareFile.Api.Client/Models/AccessControlBulkResult.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Result of a bulk operation on AccessControls + /// public class AccessControlBulkResult : ODataObject { - /// /// A list of entities processed successfully /// public IEnumerable SuccessEntities { get; set; } - + /// + /// A list of AsyncOperations created for processing the bulk operation + /// + public IEnumerable AsyncOperations { get; set; } /// /// A list of entities for which the operation failed /// @@ -41,6 +46,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) if(typedSource != null) { SuccessEntities = typedSource.SuccessEntities; + AsyncOperations = typedSource.AsyncOperations; FailedEntities = typedSource.FailedEntities; } else @@ -50,6 +56,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { SuccessEntities = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); } + if(source.TryGetProperty("AsyncOperations", out token) && token.Type != JTokenType.Null) + { + AsyncOperations = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } if(source.TryGetProperty("FailedEntities", out token) && token.Type != JTokenType.Null) { FailedEntities = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); diff --git a/src/ShareFile.Api.Client/Models/AccessControlDomains.cs b/src/ShareFile.Api.Client/Models/AccessControlDomains.cs index 895f204..516fdde 100644 --- a/src/ShareFile.Api.Client/Models/AccessControlDomains.cs +++ b/src/ShareFile.Api.Client/Models/AccessControlDomains.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents an access control list of domains that is used to control Login or Folder access for an account. + /// public class AccessControlDomains : ODataObject { - /// /// Specifies that the list is interpreted as a list of allowed or disallowed domains /// public SafeEnum AccessControlType { get; set; } - /// /// A list of domain names /// diff --git a/src/ShareFile.Api.Client/Models/AccessControlFailedEntry.cs b/src/ShareFile.Api.Client/Models/AccessControlFailedEntry.cs index 04feaf8..4df8fb6 100644 --- a/src/ShareFile.Api.Client/Models/AccessControlFailedEntry.cs +++ b/src/ShareFile.Api.Client/Models/AccessControlFailedEntry.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Details about the cause of the failure for a given AccessControl of a bulk operation + /// public class AccessControlFailedEntry : ODataObject { - /// /// Entity /// public AccessControl AccessControl { get; set; } - /// /// Failure code /// public SafeEnum Code { get; set; } - /// /// Exception message /// diff --git a/src/ShareFile.Api.Client/Models/AccessControlFilter.cs b/src/ShareFile.Api.Client/Models/AccessControlFilter.cs index bec8624..d7dbb79 100644 --- a/src/ShareFile.Api.Client/Models/AccessControlFilter.cs +++ b/src/ShareFile.Api.Client/Models/AccessControlFilter.cs @@ -5,15 +5,27 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum AccessControlFilter + + /// + /// Specifies whether an access control list is interpreted as a list of allowed or disallowed domains + /// + public enum AccessControlFilter { + + /// + /// allow specified domains + /// AllowDomains = 0, + + /// + /// disallow specified domains + /// DisallowDomains = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/AccessControlParam.cs b/src/ShareFile.Api.Client/Models/AccessControlParam.cs index 396fe58..12e95a2 100644 --- a/src/ShareFile.Api.Client/Models/AccessControlParam.cs +++ b/src/ShareFile.Api.Client/Models/AccessControlParam.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,28 +17,27 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Single AccessControl setting parameters for a bulk operation + /// public class AccessControlParam : ODataObject { - /// /// AccessControl.Item is inherited from AccessControlsBulkParams and cannot be specified here /// public AccessControl AccessControl { get; set; } - /// /// Defines whether this principal should receieve a notice on the permission grant. /// If not specified it is inherited AccessControlsBulkParams /// public bool? NotifyUser { get; set; } - /// /// Custom notification message, if any /// If not specified it is inherited AccessControlsBulkParams /// public string NotifyMessage { get; set; } - /// /// Defines whether this ACL change should be applied recursively /// diff --git a/src/ShareFile.Api.Client/Models/AccessControlsBulkParams.cs b/src/ShareFile.Api.Client/Models/AccessControlsBulkParams.cs index 1619deb..7873476 100644 --- a/src/ShareFile.Api.Client/Models/AccessControlsBulkParams.cs +++ b/src/ShareFile.Api.Client/Models/AccessControlsBulkParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,23 +17,23 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// AccessControl bulk grant operation parameters + /// public class AccessControlsBulkParams : ODataObject { - /// /// Defines whether the principal should receieve a notice on the permission grant. /// If an AccessControlParam doesn't specify the property it is inherited from here. /// public bool? NotifyUser { get; set; } - /// /// Custom notification message, if any /// If an AccessControlParam doesn't specify the property it is inherited from here. /// public string NotifyMessage { get; set; } - /// /// AccessControlParams /// diff --git a/src/ShareFile.Api.Client/Models/AccessControlsCloneParams.cs b/src/ShareFile.Api.Client/Models/AccessControlsCloneParams.cs index fc5d063..e52fa0a 100644 --- a/src/ShareFile.Api.Client/Models/AccessControlsCloneParams.cs +++ b/src/ShareFile.Api.Client/Models/AccessControlsCloneParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,32 +17,30 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Clone operation parameters + /// public class AccessControlsCloneParams : ODataObject { - /// /// Defines whether the cloned principals should receieve a notice on the permission grant. /// public bool? NotifyUser { get; set; } - /// /// Custom notification message, if any. /// public string NotifyMessage { get; set; } - /// /// The source principal's permissions for this folder and all subdirectories /// will be copied into the cloned users. /// public string FolderId { get; set; } - /// /// This principal's permissions will be used as the source for all cloned users. /// public string PrincipalId { get; set; } - /// /// List of existing principals that will receive cloned permissions. /// diff --git a/src/ShareFile.Api.Client/Models/Account.cs b/src/ShareFile.Api.Client/Models/Account.cs index 0ace78f..664b4d4 100644 --- a/src/ShareFile.Api.Client/Models/Account.cs +++ b/src/ShareFile.Api.Client/Models/Account.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,173 +17,154 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { #if !ShareFile + /// + /// Represents a Tenant Account in ShareFile.com + /// public class Account : ODataObject { - public string CompanyName { get; set; } - public User BillingContact { get; set; } - public string BillingContactId { get; set; } - public User TechnicalContact { get; set; } - public string TechnicalContactId { get; set; } - public User AccountManager { get; set; } - public string AccountManagerId { get; set; } - public string AccountType { get; set; } - + /// + /// Basic, Professional, Enterprise + /// public string PlanName { get; set; } - public string PlanTrack { get; set; } - public string PlanTrackEnum { get; set; } - + /// + /// Credit Card, Invoice, Comp + /// public string BillingType { get; set; } - + /// + /// Monthly, Quarterly, Annually + /// public string BillingCycle { get; set; } - public decimal? BillingRate { get; set; } - public decimal? BaseBillingRate { get; set; } - + /// + /// Bandwidth included in plan in megabytes + /// public int? BaseBandwidth { get; set; } - + /// + /// Disk space included in megabytes + /// public int? BaseDiskSpace { get; set; } - + /// + /// Users included in plan + /// public int? BaseUsers { get; set; } - + /// + /// Additional bandwidth purchased for account + /// public int? AdditionalBandwidth { get; set; } - + /// + /// Additional disk space purchased for account + /// public int? AdditionalDiskSpace { get; set; } - + /// + /// Additional users purchased for account + /// public int? AdditionalUsers { get; set; } - + /// + /// Additional rate for extra bandwidth. NOTE: This is specified in gigbytes, not megabytes. + /// public decimal? AdditionalBandwidthRate { get; set; } - + /// + /// Additional rate for extra diskspace. NOTE: This is specified in gigbytes, not megabytes. + /// public decimal? AdditionalDiskSpaceRate { get; set; } - + /// + /// Additional rate for extra users + /// public decimal? AdditionalUserRate { get; set; } - public int? UserMax { get; set; } - public UserUsage UserUsage { get; set; } - + /// + /// Maximum disk space for the account in megabtyes + /// public int? DiskSpaceMax { get; set; } - public DiskSpace DiskSpace { get; set; } - + public Bandwidth Bandwidth { get; set; } + /// + /// Maximum bandwidth for the account in megabtyes + /// public int? BandwidthMax { get; set; } - public bool? HasPowerTools { get; set; } - public bool? HasEncryption { get; set; } - + /// + /// Additional rate for adding PowerTools. + /// public decimal? PowerToolsRate { get; set; } - + /// + /// Additional rate for stored file encryption + /// public decimal? EncryptionRate { get; set; } - public string Address1 { get; set; } - public string Address2 { get; set; } - public string City { get; set; } - public string State { get; set; } - public string Zip { get; set; } - public string Country { get; set; } - public string TaxAreaId { get; set; } - public string CreditCardType { get; set; } - public string CreditCardToken { get; set; } - public string CreditCardNumber { get; set; } - public string CreditCardExpirationMonth { get; set; } - public string CreditCardExpirationYear { get; set; } - public string CreditCardFirstName { get; set; } - public string CreditCardLastName { get; set; } - public string Phone { get; set; } - public DateTime? LastBillingDate { get; set; } - public DateTime? NextBillingDate { get; set; } - public bool? UseAdvancedCustomBranding { get; set; } - public string AdvancedCustomBrandingFolderName { get; set; } - public IDictionary BrandingStyles { get; set; } - public BrandingLinks BrandingLinks { get; set; } - public string LogoURL { get; set; } - public Item RootItem { get; set; } - public string RootItemId { get; set; } - public DateTime? CreationDate { get; set; } - public bool? IsFreeTrial { get; set; } - public bool? IsCancelled { get; set; } - public DateTime? CancellationDate { get; set; } - public SSOAccountProvider SSO { get; set; } - public AccountPreferences Preferences { get; set; } - public ProductDefaults ProductDefaults { get; set; } - + /// + /// Primary (first) subdomain + /// public string Subdomain { get; set; } - + /// + /// All subdomains assigned to account + /// public IEnumerable Subdomains { get; set; } - public MobileSecuritySettings MobileSecuritySettings { get; set; } - public AccessControlDomains LoginAccessControlDomains { get; set; } - public AccessControlDomains FolderAccessControlDomains { get; set; } - public int? StorageQuotaPerUser { get; set; } - public string FreeTrialId { get; set; } - public string Source { get; set; } - public string AttributedSource { get; set; } - public string CompanyURL { get; set; } - public bool? MarketingOptIn { get; set; } - public string CreditCardSecurityCode { get; set; } - public IEnumerable ToolInformation { get; set; } - public BillingInfo BillingInformation { get; set; } - public SafeEnum AccountSubType { get; set; } - public string ConversionType { get; set; } - + /// + /// The add-on services available to the account + /// public ServicesCollection Services { get; set; } + public Support SupportInfo { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -221,6 +202,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) UserUsage = typedSource.UserUsage; DiskSpaceMax = typedSource.DiskSpaceMax; DiskSpace = typedSource.DiskSpace; + Bandwidth = typedSource.Bandwidth; BandwidthMax = typedSource.BandwidthMax; HasPowerTools = typedSource.HasPowerTools; HasEncryption = typedSource.HasEncryption; @@ -274,6 +256,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) AccountSubType = typedSource.AccountSubType; ConversionType = typedSource.ConversionType; Services = typedSource.Services; + SupportInfo = typedSource.SupportInfo; } else { @@ -390,6 +373,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { DiskSpace = (DiskSpace)serializer.Deserialize(token.CreateReader(), typeof(DiskSpace)); } + if(source.TryGetProperty("Bandwidth", out token) && token.Type != JTokenType.Null) + { + Bandwidth = (Bandwidth)serializer.Deserialize(token.CreateReader(), typeof(Bandwidth)); + } if(source.TryGetProperty("BandwidthMax", out token) && token.Type != JTokenType.Null) { BandwidthMax = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); @@ -602,6 +589,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { Services = (ServicesCollection)serializer.Deserialize(token.CreateReader(), typeof(ServicesCollection)); } + if(source.TryGetProperty("SupportInfo", out token) && token.Type != JTokenType.Null) + { + SupportInfo = (Support)serializer.Deserialize(token.CreateReader(), typeof(Support)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/AccountMessageCode.cs b/src/ShareFile.Api.Client/Models/AccountMessageCode.cs index 5005ca5..4c0cbf0 100644 --- a/src/ShareFile.Api.Client/Models/AccountMessageCode.cs +++ b/src/ShareFile.Api.Client/Models/AccountMessageCode.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,15 +17,15 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents the message code for that account + /// public class AccountMessageCode : ODataObject { - public string AccountType { get; set; } - public string MessageType { get; set; } - public DateTime? CancelDate { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/AccountPreferences.cs b/src/ShareFile.Api.Client/Models/AccountPreferences.cs index 8267870..d3775ed 100644 --- a/src/ShareFile.Api.Client/Models/AccountPreferences.cs +++ b/src/ShareFile.Api.Client/Models/AccountPreferences.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,361 +17,237 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { #if !ShareFile + /// + /// The preferences an admin can set for a ShareFile Account. + /// public class AccountPreferences : ODataObject { - public bool? EnableViewOnly { get; set; } - public bool? EnableWatermarkOnViewOnly { get; set; } - public bool? AllowProactiveNotifications { get; set; } - public bool? ShowUserListToClients { get; set; } - + /// + /// Enforce RequireLogin requirement for all Send Shares + /// public bool? RequireLoginOnDownload { get; set; } - + /// + /// Enforce RequireLogin requirement for all Request Shares + /// + public bool? RequireLoginOnUpload { get; set; } public bool? RequireLoginByDefault { get; set; } - public bool? EnableClientSend { get; set; } - public bool? EnableThumbnails { get; set; } - public bool? EnableSSO { get; set; } - public int? VirusStrictness { get; set; } - public bool? EnableSfAdi { get; set; } - public bool? EnableMultipleZones { get; set; } - public Zone DefaultZone { get; set; } - public bool? EnableVersioning { get; set; } - public string SystemType { get; set; } - public bool? EnableSync { get; set; } - public bool? EnableSyncAutoUpdate { get; set; } - public string SystemName { get; set; } - public string HomeScreenName { get; set; } - public bool? ShowTermsCheckbox { get; set; } - public string TermsCheckboxText { get; set; } - public int? TermsCheckboxStrictness { get; set; } - public bool? RequireCompanyNameWithUserInfo { get; set; } - public bool? EnableEditor { get; set; } - public int? ShareIDMaxExpirationDays { get; set; } - public bool? AdminIsSuperUser { get; set; } - public bool? ShowFolderAccessList { get; set; } - public bool? FromEmailIsShareFile { get; set; } - public bool? UseAlternateSMTP { get; set; } - public bool? ShowPasswordInEmail { get; set; } - public string EmailPasswordText { get; set; } - public bool? EnableSelfNotificationsUpload { get; set; } - public bool? EnableSelfNotificationsDownload { get; set; } - public bool? EnableUploadShareIDReceipt { get; set; } - public int? DefaultConsolidatedNotificationInterval { get; set; } - public int? ExpirationDays { get; set; } - /// /// Valid Values: string.Empty, Name, CreatorNameShort, FileSize, CreationDate /// public string DefaultSortField { get; set; } - /// /// Valid Values: string.Empty, asc, desc /// public string DefaultSortOrder { get; set; } - public bool? DefaultIsVersioned { get; set; } - public int? DefaultMaxVersions { get; set; } - public string ViewOnlyWatermarkText { get; set; } - public bool? EnableDocViewerPrinting { get; set; } - public bool? EnableWatermarkedDownloads { get; set; } - public bool? EnableTwoFactorAuth { get; set; } - public int? LoginFailMaxAttempts { get; set; } - public int? LoginFailLockoutSecs { get; set; } - public string IPRestrictions { get; set; } - public int? InactiveTimeoutMins { get; set; } - public int? OAuth2RefreshTokenLifetimeMinutes { get; set; } - public string PasswordRegEx { get; set; } - public string PasswordRegExFormula { get; set; } - public string PasswordRegExDescription { get; set; } - public bool? EnableActivationLinks { get; set; } - public bool? IsFINRA { get; set; } - public bool? EnableOAuth { get; set; } - public bool EnableQandA { get; set; } - public bool? EnableQandATextInNotifications { get; set; } - public SafeEnum UXMode { get; set; } - public int? IndustryCode { get; set; } - + [Obsolete("Please use the MaxAgeDays field in PasswordPolicy field below.", false)] public int PasswordMaxAgeDays { get; set; } - + [Obsolete("Please use the HistoryCount field in PasswordPolicy field below.", false)] public int PasswordHistoryCount { get; set; } - + [Obsolete("Please use the MinimumLength field in PasswordPolicy field below.", false)] public int MinimumLength { get; set; } - + [Obsolete("Please use the MinimumSpecialCharacters field in PasswordPolicy field below.", false)] public int MinimumSpecialCharacters { get; set; } - + [Obsolete("Please use the MinimumNumeric field in PasswordPolicy field below.", false)] public int MinimumNumeric { get; set; } - + [Obsolete("Please use the AllowedSpecialCharacters field in PasswordPolicy field below.", false)] public string AllowedSpecialCharacters { get; set; } - /// /// The password policy for the Account, specifying password strength, age, and reuse policies. /// public PasswordPolicy PasswordPolicy { get; set; } - public bool? EnableWebDAV { get; set; } - /// /// ShareFile allows users on certain plans to connect with your ShareFile account through WebDAV to various clients. /// ShareFile WebDAV is not available for Enterprise accounts. This tool is not compatible with on-premise storage and cannot be used with company credentials. /// This property describes WebDAV server information. It cannot be modified. /// public string WebDAVServerName { get; set; } - public bool? EnableFTP { get; set; } - public bool? EnableSFTP { get; set; } - /// /// ShareFile is compatible with most well-known FTP clients, enabling you to connect to your ShareFile account directly from an FTP program. /// This property describes FTP server information. It cannot be modified. /// public string FtpServerName { get; set; } - public bool? DisableMarketing { get; set; } - public string VDRDocViewerURL { get; set; } - public bool? EnableSMBConnectorForAccount { get; set; } - public bool? EnablePersonalCloudConnectors { get; set; } - public string AccountID { get; set; } - public bool? EnableStorageZoneConnector { get; set; } - public bool? HasAnyConnectorZones { get; set; } - public bool? EnableENSForAccount { get; set; } - public string ENSRecommendedPollingSyncInterval { get; set; } - public string ENSRecommendedNotificationSyncInterval { get; set; } - public int? ENSNotificationConfigurationCount { get; set; } - public int? ENSFailSafePollingCount { get; set; } - public int? ENSMaxNotificationSyncWaitCount { get; set; } - public string TrustedDomains { get; set; } - public bool? UseWebPopAsWebAppLogin { get; set; } - public bool? EnableReportingV3 { get; set; } - public bool? EnableEncryptedEmailForOutlookPlugin { get; set; } - public bool? EnableDocPreviews { get; set; } - public bool? DisablePasswordAutocompleteInWebApp { get; set; } - public bool? EnableDesktopEditorForAccount { get; set; } - public bool? UseStrictEmployeeDefinition { get; set; } - public string EmployeeEmailDomains { get; set; } - public bool? IsPremier { get; set; } - public bool? DisableShareConnectForAccount { get; set; } - public bool? DisablePrintToShareFile { get; set; } - public bool? EnableWebAppConnectorBrowsing { get; set; } - public bool? EnableStrictCrossdomainPolicy { get; set; } - public bool? DisableScanSnap { get; set; } - public bool? EnableFileCount { get; set; } - public bool? EnableAntiVirus { get; set; } - public bool? EnableFileLocking { get; set; } - public bool? DisableWebAppAccess { get; set; } - public bool? EnableCWC { get; set; } - + public bool? EnableEnterpriseArchive { get; set; } + public DateTime? EnterpriseArchiveActivationDate { get; set; } public bool? EnableIntegrations { get; set; } - public IEnumerable> IntegrationProviders { get; set; } - public bool? EnableBouncedEmailNotifications { get; set; } - public bool? ShowDownloadLinkInUploadNotification { get; set; } - public bool? AllowDownloadNotificationsWithoutAdmin { get; set; } - public bool? EnableUserInvitations { get; set; } - public bool? EnableClickTrails { get; set; } - public bool? EnableFolderTemplates { get; set; } - public bool? EnableFileDrops { get; set; } - public int? SpamEmailThreshold { get; set; } - public bool? EnableExternalEmailArchiving { get; set; } - public bool? CreatorCanDelete { get; set; } - /// /// Whether the account can store items in the ShareFile control plane (as opposed to /// Connectors). Driven by the EnableCloudStorage and EnablePrivateZones account preferences. /// public bool? CanStoreItemsInShareFile { get; set; } - public bool? EnableHomeFolders { get; set; } - public bool? EnableCustomBrandingUsesS3 { get; set; } - public bool? EnablePromotions { get; set; } - public bool? CanCreateMultiTenantZones { get; set; } - public bool? EnableDLP { get; set; } - public bool? EnableIRM { get; set; } - public bool? EnableECMConnectors { get; set; } - public bool? EnableOfficeOnlinePreviews { get; set; } - public bool? EnableOfficeOnlineEditing { get; set; } - /// /// Retention period of items in the recycle bin. /// public int? RecycleBinDays { get; set; } - /// /// Maximum number of concurrent uploads and downloads a Sync client should be creating, at any one time. /// public int? SyncConcurrentTransferThreadsLimit { get; set; } - public bool? HasPHI { get; set; } - public bool? EnableCitrixManagedStorageZones { get; set; } - public string PrimaryStorageBasePath { get; set; } - public bool? EnableSharingConnectorItems { get; set; } - public AccountMessageCode AccountMessageCode { get; set; } - /// /// Enable use of Single Identity authentication service for this account /// public bool? EnableSingleIdentity { get; set; } - /// /// Enable the use of the Drive Mapper utility for this account /// public bool? EnableDriveMapping { get; set; } - /// /// Email notification locale. Values: Invariant, English, German, Spanish, French, Dutch, Chinese, Russian, Japanese, Korean, or Portuguese /// public SafeEnum NotificationLocale { get; set; } - /// /// If true, only Account Admins can update a folder's retention policy /// public bool? RetentionPolicySysAdminOnly { get; set; } - public bool? EnableDocumentApprovalWorkflow { get; set; } - /// /// Enable localization /// public bool? EnableLocalization { get; set; } - public bool? EnableSecondaryDbContacts { get; set; } - - public bool? EnableCADPreview { get; set; } - /// /// Can Account enable/disable quota limit feature /// public bool? IsQuotaLimitAvailable { get; set; } - /// /// Has the account enabled the quota limit /// public bool? EnableQuotaLimit { get; set; } - /// /// Quota Limit in gigabytes /// public int? QuotaLimitInGB { get; set; } - /// /// Enables getting thumbnails from Renderer X service /// public bool? EnableRenderLibXThumbnails { get; set; } - + /// + /// Enables getting thumbnails from RenderAPI service + /// + public bool? EnableRenderAPIThumbnails { get; set; } /// /// Enables Provided By Client Request List feature /// public bool? EnableRequestList { get; set; } + public bool? IsArchiveAccount { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -386,6 +262,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) AllowProactiveNotifications = typedSource.AllowProactiveNotifications; ShowUserListToClients = typedSource.ShowUserListToClients; RequireLoginOnDownload = typedSource.RequireLoginOnDownload; + RequireLoginOnUpload = typedSource.RequireLoginOnUpload; RequireLoginByDefault = typedSource.RequireLoginByDefault; EnableClientSend = typedSource.EnableClientSend; EnableThumbnails = typedSource.EnableThumbnails; @@ -485,6 +362,8 @@ public override void Copy(ODataObject source, JsonSerializer serializer) EnableFileLocking = typedSource.EnableFileLocking; DisableWebAppAccess = typedSource.DisableWebAppAccess; EnableCWC = typedSource.EnableCWC; + EnableEnterpriseArchive = typedSource.EnableEnterpriseArchive; + EnterpriseArchiveActivationDate = typedSource.EnterpriseArchiveActivationDate; EnableIntegrations = typedSource.EnableIntegrations; IntegrationProviders = typedSource.IntegrationProviders; EnableBouncedEmailNotifications = typedSource.EnableBouncedEmailNotifications; @@ -521,12 +400,13 @@ public override void Copy(ODataObject source, JsonSerializer serializer) EnableDocumentApprovalWorkflow = typedSource.EnableDocumentApprovalWorkflow; EnableLocalization = typedSource.EnableLocalization; EnableSecondaryDbContacts = typedSource.EnableSecondaryDbContacts; - EnableCADPreview = typedSource.EnableCADPreview; IsQuotaLimitAvailable = typedSource.IsQuotaLimitAvailable; EnableQuotaLimit = typedSource.EnableQuotaLimit; QuotaLimitInGB = typedSource.QuotaLimitInGB; EnableRenderLibXThumbnails = typedSource.EnableRenderLibXThumbnails; + EnableRenderAPIThumbnails = typedSource.EnableRenderAPIThumbnails; EnableRequestList = typedSource.EnableRequestList; + IsArchiveAccount = typedSource.IsArchiveAccount; } else { @@ -551,6 +431,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { RequireLoginOnDownload = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } + if(source.TryGetProperty("RequireLoginOnUpload", out token) && token.Type != JTokenType.Null) + { + RequireLoginOnUpload = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } if(source.TryGetProperty("RequireLoginByDefault", out token) && token.Type != JTokenType.Null) { RequireLoginByDefault = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); @@ -947,6 +831,14 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { EnableCWC = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } + if(source.TryGetProperty("EnableEnterpriseArchive", out token) && token.Type != JTokenType.Null) + { + EnableEnterpriseArchive = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnterpriseArchiveActivationDate", out token) && token.Type != JTokenType.Null) + { + EnterpriseArchiveActivationDate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } if(source.TryGetProperty("EnableIntegrations", out token) && token.Type != JTokenType.Null) { EnableIntegrations = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); @@ -1091,10 +983,6 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { EnableSecondaryDbContacts = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } - if(source.TryGetProperty("EnableCADPreview", out token) && token.Type != JTokenType.Null) - { - EnableCADPreview = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); - } if(source.TryGetProperty("IsQuotaLimitAvailable", out token) && token.Type != JTokenType.Null) { IsQuotaLimitAvailable = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); @@ -1111,10 +999,18 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { EnableRenderLibXThumbnails = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } + if(source.TryGetProperty("EnableRenderAPIThumbnails", out token) && token.Type != JTokenType.Null) + { + EnableRenderAPIThumbnails = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } if(source.TryGetProperty("EnableRequestList", out token) && token.Type != JTokenType.Null) { EnableRequestList = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } + if(source.TryGetProperty("IsArchiveAccount", out token) && token.Type != JTokenType.Null) + { + IsArchiveAccount = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/AccountSubType.cs b/src/ShareFile.Api.Client/Models/AccountSubType.cs index 59c4a5b..0934126 100644 --- a/src/ShareFile.Api.Client/Models/AccountSubType.cs +++ b/src/ShareFile.Api.Client/Models/AccountSubType.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum AccountSubType + public enum AccountSubType { None = 0, Partner = 1, Tenant = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/AccountUser.cs b/src/ShareFile.Api.Client/Models/AccountUser.cs index 05bb901..f411285 100644 --- a/src/ShareFile.Api.Client/Models/AccountUser.cs +++ b/src/ShareFile.Api.Client/Models/AccountUser.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,31 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class AccountUser : User { - public bool? IsAdministrator { get; set; } - public bool? CanCreateFolders { get; set; } - public bool? CanUseFileBox { get; set; } - public bool? CanManageUsers { get; set; } - public bool? IsVirtualClient { get; set; } - public int? DiskSpace { get; set; } - public int? Bandwidth { get; set; } - + public int? BandwidthUsageMB { get; set; } public int? StorageQuotaLimitGB { get; set; } - public int? StorageQuotaPercent { get; set; } - public bool? EnableHardLimit { get; set; } - public IEnumerable Policies { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) @@ -59,6 +49,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) IsVirtualClient = typedSource.IsVirtualClient; DiskSpace = typedSource.DiskSpace; Bandwidth = typedSource.Bandwidth; + BandwidthUsageMB = typedSource.BandwidthUsageMB; StorageQuotaLimitGB = typedSource.StorageQuotaLimitGB; StorageQuotaPercent = typedSource.StorageQuotaPercent; EnableHardLimit = typedSource.EnableHardLimit; @@ -95,6 +86,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { Bandwidth = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); } + if(source.TryGetProperty("BandwidthUsageMB", out token) && token.Type != JTokenType.Null) + { + BandwidthUsageMB = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } if(source.TryGetProperty("StorageQuotaLimitGB", out token) && token.Type != JTokenType.Null) { StorageQuotaLimitGB = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); diff --git a/src/ShareFile.Api.Client/Models/AccountZoneUsage.cs b/src/ShareFile.Api.Client/Models/AccountZoneUsage.cs index 14255dd..02b3977 100644 --- a/src/ShareFile.Api.Client/Models/AccountZoneUsage.cs +++ b/src/ShareFile.Api.Client/Models/AccountZoneUsage.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,17 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class AccountZoneUsage : ODataObject { - public long? TotalFileSizeBytes { get; set; } - public Zone Zone { get; set; } - public long? RootFolderCount { get; set; } - public long? FileCount { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ActivationToken.cs b/src/ShareFile.Api.Client/Models/ActivationToken.cs new file mode 100644 index 0000000..fe5da8c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ActivationToken.cs @@ -0,0 +1,49 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// User Activation Token + /// + public class ActivationToken : ODataObject + { + public string Token { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as ActivationToken; + if(typedSource != null) + { + Token = typedSource.Token; + } + else + { + JToken token; + if(source.TryGetProperty("Token", out token) && token.Type != JTokenType.Null) + { + Token = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/ActivityReportFilter.cs b/src/ShareFile.Api.Client/Models/ActivityReportFilter.cs new file mode 100644 index 0000000..9594983 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ActivityReportFilter.cs @@ -0,0 +1,49 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class ActivityReportFilter : ReportFilter + { + /// + /// The Activity Types to include in the Report + /// + public IEnumerable ActivityTypes { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as ActivityReportFilter; + if(typedSource != null) + { + ActivityTypes = typedSource.ActivityTypes; + } + else + { + JToken token; + if(source.TryGetProperty("ActivityTypes", out token) && token.Type != JTokenType.Null) + { + ActivityTypes = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/AdvancedSearchResults.cs b/src/ShareFile.Api.Client/Models/AdvancedSearchResults.cs index 3b2df8d..6fbe4f8 100644 --- a/src/ShareFile.Api.Client/Models/AdvancedSearchResults.cs +++ b/src/ShareFile.Api.Client/Models/AdvancedSearchResults.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Collection of search results from an advanced search query + /// public class AdvancedSearchResults : ODataObject { - /// /// Are these only partial results? /// public bool PartialResults { get; set; } - /// /// Collection of search result hits /// public IEnumerable Results { get; set; } - /// /// Did the search query timeout? /// diff --git a/src/ShareFile.Api.Client/Models/AppCodes.cs b/src/ShareFile.Api.Client/Models/AppCodes.cs index 2892a49..28945f9 100644 --- a/src/ShareFile.Api.Client/Models/AppCodes.cs +++ b/src/ShareFile.Api.Client/Models/AppCodes.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum AppCodes + public enum AppCodes { _None = 0, AirWidget = 1, @@ -74,6 +74,23 @@ public enum AppCodes TranscodingService = 58, SAP = 59, Podio = 60, - SFMacDesktop = 61 + SFMacDesktop = 61, + CustomWorkflows = 62, + CustomWorkflowsAndroid = 63, + CustomWorkflowsiOS = 64, + SFOutlook = 65, + SFGmail = 66, + RightSignatureiOS = 67, + JiraServiceDesk = 68, + RightSignature4 = 69, + ThirdPartyCloudSyncService = 70, + SFIdentity = 71, + SFWindows = 72, + RightSignatureAndroid = 73, + Salesforce = 74, + SFResourceProvider = 75, + EventPipeline = 76, + Webhooks = 77, + CasActionsAdapter = 78 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/AsyncOperation.cs b/src/ShareFile.Api.Client/Models/AsyncOperation.cs index c22ee09..38e8baa 100644 --- a/src/ShareFile.Api.Client/Models/AsyncOperation.cs +++ b/src/ShareFile.Api.Client/Models/AsyncOperation.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,86 +17,75 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents an Asynchronous operation - any operation that is started but + /// the results will take time to complete. + /// public class AsyncOperation : ODataObject { - /// /// Operation type /// public SafeEnum Operation { get; set; } - /// /// ShareFile Account /// public Account Account { get; set; } - /// /// Represents the Zone that is driving the asynchronous operation process. It /// may be null if the operation is driven by the control plane. /// public Zone AuthorityZone { get; set; } - /// /// Source Item for the operation. /// public Item Source { get; set; } - /// /// User that initiated the operation /// public User User { get; set; } - /// /// Operation creation date /// public DateTime? CreationDate { get; set; } - /// /// Operation state. States 'Created' and 'Scheduled' indicate the operation is /// in progress; States 'Success' and 'Failure' indicate the operatoin is finalized /// public SafeEnum State { get; set; } - /// /// Last time the operation state was modified /// public DateTime? UpdateDate { get; set; } - /// /// Target Item for the operation. /// public Item Target { get; set; } - /// /// Batch Identifier for an asynchronous operation that includes multiple Items - for /// example, a recursive Copy will create a single AsyncOp instance per file, all sharing /// the same BatchID /// public string BatchID { get; set; } - /// /// Item ID used as source for the Batch operation /// public string BatchSourceID { get; set; } - /// /// Item ID used as target for the Batch operation /// public string BatchTargetID { get; set; } - /// /// BatchProgress indicates the progress of the Batch operation /// public double? BatchProgress { get; set; } - /// /// Batch Operation state. State 'Scheduled' indicate the operation is /// in progress; States 'Success' and 'Failure' indicate the operation is finalized /// public SafeEnum BatchState { get; set; } - public int? BatchTotal { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/AsyncOperationState.cs b/src/ShareFile.Api.Client/Models/AsyncOperationState.cs index c243486..9cbb1b8 100644 --- a/src/ShareFile.Api.Client/Models/AsyncOperationState.cs +++ b/src/ShareFile.Api.Client/Models/AsyncOperationState.cs @@ -5,13 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum AsyncOperationState + + /// + /// Async Operation state + /// + public enum AsyncOperationState { Created = 0, Scheduled = 1, @@ -19,4 +23,4 @@ public enum AsyncOperationState Failure = 3, Canceled = 4 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/AsyncOperationType.cs b/src/ShareFile.Api.Client/Models/AsyncOperationType.cs index 9c50a83..fb21689 100644 --- a/src/ShareFile.Api.Client/Models/AsyncOperationType.cs +++ b/src/ShareFile.Api.Client/Models/AsyncOperationType.cs @@ -5,24 +5,92 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum AsyncOperationType + + /// + /// Support Async Operation types + /// + public enum AsyncOperationType { + + /// + /// Item Copy Operation + /// Copy = 0, + + /// + /// Item Move Operation + /// Move = 1, + + /// + /// Item Change Zone Operation - Scheduled Synchronously + /// ChangeZone = 2, + + /// + /// Item Change Zone Operation - Scheduled Asynchronously through the Async Bot + /// ScheduleChangeZone = 3, + + /// + /// Item Recovery Operation + /// Recovery = 4, + + /// + /// Item Delete Operation + /// Delete = 5, + + /// + /// Item Delete Permanent Operation + /// DeletePermanent = 6, + + /// + /// Item Connector Copy - scheduled by the active client + /// CloudConnectorCopy = 7, + + /// + /// Item Connector File Copy - scheduled by the Asyncbot + /// CloudConnectorFileCopy = 8, + + /// + /// Item Connector Move - scheduled by the active client + /// CloudConnectorMove = 9, - CloudConnectorFileMove = 10 + + /// + /// Item Connector File Move - scheduled by the Asyncbot + /// + CloudConnectorFileMove = 10, + + /// + /// Access Controls Insert + /// + AccessControlsUpdate = 11, + + /// + /// Async Copy Operation within same zone + /// + IntraZoneCopy = 12, + + /// + /// Async Move Operation within same zone + /// + IntraZoneMove = 13, + + /// + /// File Box Change Zone Operation for All File Boxes in a zone + /// + ScheduleChangeZoneFileBoxes = 14 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/Bandwidth.cs b/src/ShareFile.Api.Client/Models/Bandwidth.cs new file mode 100644 index 0000000..d3e6a6a --- /dev/null +++ b/src/ShareFile.Api.Client/Models/Bandwidth.cs @@ -0,0 +1,71 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// The current usage statistics for Bandwidth on the Account + /// + public class Bandwidth : ODataObject + { + /// + /// Max bandwidth allowed + /// + public int? Max { get; set; } + /// + /// Current bandwidth used + /// + public int? Used { get; set; } + /// + /// Current bandwidth free + /// Not returned when unlimited bandwidth + /// + public int? Free { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as Bandwidth; + if(typedSource != null) + { + Max = typedSource.Max; + Used = typedSource.Used; + Free = typedSource.Free; + } + else + { + JToken token; + if(source.TryGetProperty("Max", out token) && token.Type != JTokenType.Null) + { + Max = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("Used", out token) && token.Type != JTokenType.Null) + { + Used = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("Free", out token) && token.Type != JTokenType.Null) + { + Free = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/BaseAccountCreationParameters.cs b/src/ShareFile.Api.Client/Models/BaseAccountCreationParameters.cs new file mode 100644 index 0000000..5db583d --- /dev/null +++ b/src/ShareFile.Api.Client/Models/BaseAccountCreationParameters.cs @@ -0,0 +1,97 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Abstract class reprensenting the base parameters required to create an account + /// + public class BaseAccountCreationParameters : ODataObject + { + /// + /// Billing Contact for this account, which will be the first user provisioned + /// + public BillingContact BillingContact { get; set; } + /// + /// Company Contact Information + /// + public CompanyContactInformation ContactInformation { get; set; } + /// + /// Whether the account should be a Free Trial + /// + public bool? IsFreeTrial { get; set; } + /// + /// Usage Plan to be provisioned for this account + /// + public RequestedPlan RequestedPlan { get; set; } + /// + /// Optional Subdomain to set to the account + /// + public string Subdomain { get; set; } + /// + /// Plan Name + /// + public string PlanName { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as BaseAccountCreationParameters; + if(typedSource != null) + { + BillingContact = typedSource.BillingContact; + ContactInformation = typedSource.ContactInformation; + IsFreeTrial = typedSource.IsFreeTrial; + RequestedPlan = typedSource.RequestedPlan; + Subdomain = typedSource.Subdomain; + PlanName = typedSource.PlanName; + } + else + { + JToken token; + if(source.TryGetProperty("BillingContact", out token) && token.Type != JTokenType.Null) + { + BillingContact = (BillingContact)serializer.Deserialize(token.CreateReader(), typeof(BillingContact)); + } + if(source.TryGetProperty("ContactInformation", out token) && token.Type != JTokenType.Null) + { + ContactInformation = (CompanyContactInformation)serializer.Deserialize(token.CreateReader(), typeof(CompanyContactInformation)); + } + if(source.TryGetProperty("IsFreeTrial", out token) && token.Type != JTokenType.Null) + { + IsFreeTrial = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("RequestedPlan", out token) && token.Type != JTokenType.Null) + { + RequestedPlan = (RequestedPlan)serializer.Deserialize(token.CreateReader(), typeof(RequestedPlan)); + } + if(source.TryGetProperty("Subdomain", out token) && token.Type != JTokenType.Null) + { + Subdomain = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("PlanName", out token) && token.Type != JTokenType.Null) + { + PlanName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/BaseCspAccountParameters.cs b/src/ShareFile.Api.Client/Models/BaseCspAccountParameters.cs new file mode 100644 index 0000000..e59435b --- /dev/null +++ b/src/ShareFile.Api.Client/Models/BaseCspAccountParameters.cs @@ -0,0 +1,49 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class BaseCspAccountParameters : BaseAccountCreationParameters + { + /// + /// Support contact information for this account + /// + public Support SupportInfo { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as BaseCspAccountParameters; + if(typedSource != null) + { + SupportInfo = typedSource.SupportInfo; + } + else + { + JToken token; + if(source.TryGetProperty("SupportInfo", out token) && token.Type != JTokenType.Null) + { + SupportInfo = (Support)serializer.Deserialize(token.CreateReader(), typeof(Support)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/BillingContact.cs b/src/ShareFile.Api.Client/Models/BillingContact.cs new file mode 100644 index 0000000..bb4a7c2 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/BillingContact.cs @@ -0,0 +1,67 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// First User of an Account, set as Billing Contact and Master Admin + /// + public class BillingContact : ODataObject + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string EmailAddress { get; set; } + public string Password { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as BillingContact; + if(typedSource != null) + { + FirstName = typedSource.FirstName; + LastName = typedSource.LastName; + EmailAddress = typedSource.EmailAddress; + Password = typedSource.Password; + } + else + { + JToken token; + if(source.TryGetProperty("FirstName", out token) && token.Type != JTokenType.Null) + { + FirstName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("LastName", out token) && token.Type != JTokenType.Null) + { + LastName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("EmailAddress", out token) && token.Type != JTokenType.Null) + { + EmailAddress = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Password", out token) && token.Type != JTokenType.Null) + { + Password = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/BillingInfo.cs b/src/ShareFile.Api.Client/Models/BillingInfo.cs index 186614a..f22b650 100644 --- a/src/ShareFile.Api.Client/Models/BillingInfo.cs +++ b/src/ShareFile.Api.Client/Models/BillingInfo.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,40 +17,28 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class BillingInfo : ODataObject { - public User BillingContact { get; set; } - public string Address1 { get; set; } - public string Address2 { get; set; } - public string City { get; set; } - public string State { get; set; } - public string Country { get; set; } - public string Zip { get; set; } - public string TaxAreaId { get; set; } - public string CreditCardFirstName { get; set; } - public string CreditCardLastName { get; set; } - public string CreditCardType { get; set; } - public string CreditCardToken { get; set; } - public string CreditCardExpirationMonth { get; set; } - public string CreditCardExpirationYear { get; set; } - public string CreditCardSecurityCode { get; set; } + public string VatId { get; set; } + public string CurrencyCode { get; set; } + public bool? IsCreditCardPaymentApplicable { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -75,6 +63,9 @@ public override void Copy(ODataObject source, JsonSerializer serializer) CreditCardExpirationMonth = typedSource.CreditCardExpirationMonth; CreditCardExpirationYear = typedSource.CreditCardExpirationYear; CreditCardSecurityCode = typedSource.CreditCardSecurityCode; + VatId = typedSource.VatId; + CurrencyCode = typedSource.CurrencyCode; + IsCreditCardPaymentApplicable = typedSource.IsCreditCardPaymentApplicable; } else { @@ -139,6 +130,18 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { CreditCardSecurityCode = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); } + if(source.TryGetProperty("VatId", out token) && token.Type != JTokenType.Null) + { + VatId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("CurrencyCode", out token) && token.Type != JTokenType.Null) + { + CurrencyCode = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("IsCreditCardPaymentApplicable", out token) && token.Type != JTokenType.Null) + { + IsCreditCardPaymentApplicable = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/BrandingLinks.cs b/src/ShareFile.Api.Client/Models/BrandingLinks.cs index 64502f0..fed67ec 100644 --- a/src/ShareFile.Api.Client/Models/BrandingLinks.cs +++ b/src/ShareFile.Api.Client/Models/BrandingLinks.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,45 +17,45 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Contains account custom branding related links + /// public class BrandingLinks : ODataObject { - /// /// Custom logo url /// public string LogoUrl { get; set; } - /// /// Custom email logo url /// public string EmailLogoUrl { get; set; } - /// /// Custom login logo url /// public string LoginLogoUrl { get; set; } - /// /// Custom browser favorite icon url /// public string FavoriteIconUrl { get; set; } - /// /// Custom background image URL /// public string BackgroundImageUrl { get; set; } - /// /// Background image behind logo in masthead /// public string MastheadImageUrl { get; set; } - /// /// Login page Background image /// public string LoginPageBackgroundImageUrl { get; set; } + /// + /// Custom Terms and Conditions + /// + public string TermsAndConditionsUrl { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -72,6 +72,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) BackgroundImageUrl = typedSource.BackgroundImageUrl; MastheadImageUrl = typedSource.MastheadImageUrl; LoginPageBackgroundImageUrl = typedSource.LoginPageBackgroundImageUrl; + TermsAndConditionsUrl = typedSource.TermsAndConditionsUrl; } else { @@ -104,6 +105,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { LoginPageBackgroundImageUrl = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); } + if(source.TryGetProperty("TermsAndConditionsUrl", out token) && token.Type != JTokenType.Null) + { + TermsAndConditionsUrl = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/Cancellation.cs b/src/ShareFile.Api.Client/Models/Cancellation.cs new file mode 100644 index 0000000..00e701d --- /dev/null +++ b/src/ShareFile.Api.Client/Models/Cancellation.cs @@ -0,0 +1,76 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class Cancellation : ODataObject + { + public string Password { get; set; } + public string Reason { get; set; } + public int? ReasonCode { get; set; } + public bool? AutoEmail { get; set; } + public bool? CancelAddOns { get; set; } + public string InternalNotes { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as Cancellation; + if(typedSource != null) + { + Password = typedSource.Password; + Reason = typedSource.Reason; + ReasonCode = typedSource.ReasonCode; + AutoEmail = typedSource.AutoEmail; + CancelAddOns = typedSource.CancelAddOns; + InternalNotes = typedSource.InternalNotes; + } + else + { + JToken token; + if(source.TryGetProperty("Password", out token) && token.Type != JTokenType.Null) + { + Password = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Reason", out token) && token.Type != JTokenType.Null) + { + Reason = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ReasonCode", out token) && token.Type != JTokenType.Null) + { + ReasonCode = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("AutoEmail", out token) && token.Type != JTokenType.Null) + { + AutoEmail = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("CancelAddOns", out token) && token.Type != JTokenType.Null) + { + CancelAddOns = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("InternalNotes", out token) && token.Type != JTokenType.Null) + { + InternalNotes = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/Capability.cs b/src/ShareFile.Api.Client/Models/Capability.cs index 887bebe..569e02d 100644 --- a/src/ShareFile.Api.Client/Models/Capability.cs +++ b/src/ShareFile.Api.Client/Models/Capability.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,23 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class Capability : ODataObject { - public SafeEnum Name { get; set; } - public string Version { get; set; } - + /// + /// Indicates the list of hosts and providers with which the associated capability can operate. + /// There are two known constants that offer a convenient way to refer to the current provider (self) and ShareFile (sf) + /// Otherwise, values will be prefixed with https protocol. + /// public IEnumerable ScopedHostsAndProviders { get; set; } + /// + /// Indicates the data types are supported based on this capability. If there are no restrictions, this value will be empty or null. + /// For backwards compatibility, for an empty list will imply only Folders are supported. + /// + public IEnumerable SupportedDataTypes { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -39,6 +46,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) Name = typedSource.Name; Version = typedSource.Version; ScopedHostsAndProviders = typedSource.ScopedHostsAndProviders; + SupportedDataTypes = typedSource.SupportedDataTypes; } else { @@ -55,6 +63,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { ScopedHostsAndProviders = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); } + if(source.TryGetProperty("SupportedDataTypes", out token) && token.Type != JTokenType.Null) + { + SupportedDataTypes = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/CapabilityName.cs b/src/ShareFile.Api.Client/Models/CapabilityName.cs index 116b261..c1d8676 100644 --- a/src/ShareFile.Api.Client/Models/CapabilityName.cs +++ b/src/ShareFile.Api.Client/Models/CapabilityName.cs @@ -5,19 +5,27 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum CapabilityName + public enum CapabilityName { Thumbnails = 0, DocPreview = 1, Search = 2, AdvancedSearch = 3, + + /// + /// DEPRECATED: Use CapabilityName.SharingRequest and CapabilityName.SharingSend instead. + /// Sharing = 4, + + /// + /// DEPRECATED: Use CapabilityName.AnonymousSharingRequest and CapabilityName.AnonymousSharingSend instead. + /// AnonymousSharing = 5, LastProgenyUpdateDate = 6, DirectDownload = 7, @@ -30,9 +38,18 @@ public enum CapabilityName VirusScan = 14, ItemLink = 15, ItemNote = 16, + + /// + /// Indicates if Description can be added to items. Currently only ShareFile (sf) supports this. + /// ItemDescription = 17, VersionMax = 18, VersionMin = 19, + + /// + /// Indicates whether items can be favorited. If this capability appears without + /// only Folders are supported. + /// Favorites = 20, ReusableItemId = 21, StandardUploadRaw = 22, @@ -41,40 +58,183 @@ public enum CapabilityName StreamedUploadForms = 25, ThreadedUploadRaw = 26, ThreadedUploadForms = 27, + + /// + /// Supports Right Signature Integration + /// RightSignature = 28, UploadWithRequestParams = 29, + + /// + /// Provider supports FileLock APIs with SoftLock semantics. + /// SoftLock = 30, + + /// + /// Provider supports FileLock APIs with HardLock semantics. + /// HardLock = 31, + + /// + /// Provider supports download items by StreamId + /// DownloadByStream = 32, BulkDelete = 33, BulkDownload = 34, + + /// + /// Provider supports downloading Folders + /// FolderDownload = 35, + + /// + /// Provider supports sending Folders + /// FolderSend = 36, + + /// + /// Provider supports sending Items by StreamId + /// SendByStream = 37, + + /// + /// Provider supports requesting Files from authenticated users + /// SharingRequest = 38, + + /// + /// Provider supports sending Items to authenticated users + /// SharingSend = 39, + + /// + /// Provider supports requesting Files from anonymous users + /// AnonymousSharingRequest = 40, + + /// + /// Provider supports sending Items to anonymous users + /// AnonymousSharingSend = 41, + + /// + /// Provider supports copying Items + /// Copy = 42, + + /// + /// Provider supports moving Items + /// Move = 43, + + /// + /// Provider supports unzipping file uploads with file extension .zip + /// UnZipFileUploads = 44, + + /// + /// Provider supports Right Signature 4 Integration + /// RightSignature4 = 45, + + /// + /// Provider supports Document Approval Workflow Integration + /// DocumentApprovalWorkflow = 46, + + /// + /// Provider supports sending list of available ShareAccessRight options + /// ShareAccessRight = 47, + + /// + /// Provider supports items pagination ordered by Name asc or desc + /// ItemSortByName = 48, + + /// + /// Provider supports items pagination ordered by CreatorNameShort asc or desc + /// ItemSortByCreatorNameShort = 49, + + /// + /// Provider supports items pagination ordered by CreationDate asc or desc + /// ItemSortByCreationDate = 50, + + /// + /// Provider supports items pagination ordered by FileSizeBytes asc or desc + /// ItemSortByFileSizeBytes = 51, + + /// + /// Provider supports items orderingMode FoldersFirst + /// ItemFoldersFirstGrouping = 52, - SearchByParent = 53, - ScopedCopy = 54, - ScopedMove = 55, - StructuredDownload = 56, - DirectAnonymousSharingSend = 57, - MetadataTagging = 58, - ItemMetadata = 59, - CreateMicrosoftFiles = 60, - DownloadSpecification = 61, - ItemRename = 62 + + /// + /// Provider supports returning ItemOperations enum + /// + ItemOperations = 53, + + /// + /// Supports Simple search with the option of filtering by parent + /// + SearchByParent = 54, + + /// + /// Indicates Item copy operations are supported for the provided list of host and providers. + /// + ScopedCopy = 55, + + /// + /// Indicates Item move operations are supported for the provided list of host and providers. + /// + ScopedMove = 56, + + /// + /// StructuredDownload API that supports client requesting a specific folder structure be returned. + /// + StructuredDownload = 57, + + /// + /// Indicates that sending Items to anonymous users will result in a third-party Share Uri. + /// + DirectAnonymousSharingSend = 58, + + /// + /// Provider supports adding tags to an item (Prominent use in Connectors) + /// + MetadataTagging = 59, + + /// + /// Provider supports updating the Metadata properties of an item + /// + ItemMetadata = 60, + + /// + /// Provider supports creating a new document and launching editing session. + /// + CreateMicrosoftFiles = 61, + + /// + /// Provider supports download APIs that will optionally return a DownloadSpecification instead of file bytes. + /// + DownloadSpecification = 62, + + /// + /// Provider supports the item rename operation + /// + ItemRename = 63, + + /// + /// Provider supports the Bulk Move operation + /// + BulkMove = 64, + + /// + /// Provider supports Breadcrumbs + /// + Breadcrumbs = 65 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ChunkType.cs b/src/ShareFile.Api.Client/Models/ChunkType.cs index cba4f9e..affcacb 100644 --- a/src/ShareFile.Api.Client/Models/ChunkType.cs +++ b/src/ShareFile.Api.Client/Models/ChunkType.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ChunkType + public enum ChunkType { Alphanumeric = 0, Numeric = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ClientCapability.cs b/src/ShareFile.Api.Client/Models/ClientCapability.cs index 8c897a3..0244a0d 100644 --- a/src/ShareFile.Api.Client/Models/ClientCapability.cs +++ b/src/ShareFile.Api.Client/Models/ClientCapability.cs @@ -5,14 +5,24 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ClientCapability + public enum ClientCapability { - HardLock = 0 + HardLock = 0, + + /// + /// If supplied, then calls to Items(favorites) will return all favorites (not just folders) + /// + ItemFavorites = 1, + + /// + /// If supplied, then Personal Cloud and Office 365 connectors will be grouped under the c-pcc and c-o365 folders. + /// + CloudConnectorGroups = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ClientUpgradeWeb.cs b/src/ShareFile.Api.Client/Models/ClientUpgradeWeb.cs new file mode 100644 index 0000000..cf4bd09 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ClientUpgradeWeb.cs @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class ClientUpgradeWeb : ODataObject + { + public string ClientUpgradeLink { get; set; } + public string ClientUpgradeText { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as ClientUpgradeWeb; + if(typedSource != null) + { + ClientUpgradeLink = typedSource.ClientUpgradeLink; + ClientUpgradeText = typedSource.ClientUpgradeText; + } + else + { + JToken token; + if(source.TryGetProperty("ClientUpgradeLink", out token) && token.Type != JTokenType.Null) + { + ClientUpgradeLink = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ClientUpgradeText", out token) && token.Type != JTokenType.Null) + { + ClientUpgradeText = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/CompanyContactInformation.cs b/src/ShareFile.Api.Client/Models/CompanyContactInformation.cs new file mode 100644 index 0000000..d3069a3 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/CompanyContactInformation.cs @@ -0,0 +1,60 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ +#if !ShareFile + public class CompanyContactInformation : ODataObject + { + /// + /// Company Name + /// + public string CompanyName { get; set; } + /// + /// Company Phone number + /// + public string PhoneNumber { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as CompanyContactInformation; + if(typedSource != null) + { + CompanyName = typedSource.CompanyName; + PhoneNumber = typedSource.PhoneNumber; + } + else + { + JToken token; + if(source.TryGetProperty("CompanyName", out token) && token.Type != JTokenType.Null) + { + CompanyName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("PhoneNumber", out token) && token.Type != JTokenType.Null) + { + PhoneNumber = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +#endif +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/ConnectedApp.cs b/src/ShareFile.Api.Client/Models/ConnectedApp.cs new file mode 100644 index 0000000..b9a278c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ConnectedApp.cs @@ -0,0 +1,97 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Represents a user's application that has been connected to the Account + /// + public class ConnectedApp : ODataObject + { + /// + /// Name of the application + /// + public string Name { get; set; } + /// + /// Used to determine which official ShareFile App this is, if any + /// + public SafeEnum AppCode { get; set; } + /// + /// The last time this client was used to login to the account + /// + public DateTime? LastLoginDate { get; set; } + /// + /// The user this app mapping is for + /// + public string UserId { get; set; } + /// + /// Whether or not this App can still be used + /// + public bool Active { get; set; } + /// + /// Devices associated with this App + /// + public IEnumerable Devices { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as ConnectedApp; + if(typedSource != null) + { + Name = typedSource.Name; + AppCode = typedSource.AppCode; + LastLoginDate = typedSource.LastLoginDate; + UserId = typedSource.UserId; + Active = typedSource.Active; + Devices = typedSource.Devices; + } + else + { + JToken token; + if(source.TryGetProperty("Name", out token) && token.Type != JTokenType.Null) + { + Name = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("AppCode", out token) && token.Type != JTokenType.Null) + { + AppCode = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); + } + if(source.TryGetProperty("LastLoginDate", out token) && token.Type != JTokenType.Null) + { + LastLoginDate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + if(source.TryGetProperty("UserId", out token) && token.Type != JTokenType.Null) + { + UserId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Active", out token) && token.Type != JTokenType.Null) + { + Active = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + if(source.TryGetProperty("Devices", out token) && token.Type != JTokenType.Null) + { + Devices = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/ConnectorGroup.cs b/src/ShareFile.Api.Client/Models/ConnectorGroup.cs index d4f4d63..aa05f2d 100644 --- a/src/ShareFile.Api.Client/Models/ConnectorGroup.cs +++ b/src/ShareFile.Api.Client/Models/ConnectorGroup.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,20 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a class of connectors associated with a ShareFile Account. For example, it + /// represents the group of Network Shares or Sharepoint Sites linked to this account. + /// These elements are returned as children of the alias "connector" in Items + /// - i.e., /Items(connectors)/Children + /// public class ConnectorGroup : Folder { - /// /// Zones that contain this Connector type /// public IEnumerable Zones { get; set; } - /// /// Provider identifier for this group. This is the 1st element in a ShareFile URL, /// for example - cifs for Network Shares connectors. Items in Network Share connectors diff --git a/src/ShareFile.Api.Client/Models/ConnectorGroupAccessControl.cs b/src/ShareFile.Api.Client/Models/ConnectorGroupAccessControl.cs index ba941c1..ff9ba87 100644 --- a/src/ShareFile.Api.Client/Models/ConnectorGroupAccessControl.cs +++ b/src/ShareFile.Api.Client/Models/ConnectorGroupAccessControl.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,15 +17,12 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ConnectorGroupAccessControl : ODataObject { - public Principal Principal { get; set; } - public bool? CanManage { get; set; } - public bool? CanCreate { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ConnectorGroupKind.cs b/src/ShareFile.Api.Client/Models/ConnectorGroupKind.cs index 9c7a161..299ba9f 100644 --- a/src/ShareFile.Api.Client/Models/ConnectorGroupKind.cs +++ b/src/ShareFile.Api.Client/Models/ConnectorGroupKind.cs @@ -5,17 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ConnectorGroupKind + public enum ConnectorGroupKind { Cloud = 0, Zone = 1, SDK = 2, Agent = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ConnectorGroupZone.cs b/src/ShareFile.Api.Client/Models/ConnectorGroupZone.cs index 46e5cd4..5edbdf8 100644 --- a/src/ShareFile.Api.Client/Models/ConnectorGroupZone.cs +++ b/src/ShareFile.Api.Client/Models/ConnectorGroupZone.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,36 +17,35 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Relationship class between Connector Groups and Zones. Groups are considered + /// global, but to create Symbolic Links, or retrieve URLs, the client has to + /// select a specific Zone + /// public class ConnectorGroupZone : ODataObject { - /// /// Zone that contains this connector class /// public Zone Zone { get; set; } - /// /// List of Storage Centers in this Zone that contain this Connector /// public IEnumerable StorageCenters { get; set; } - /// /// Minimum API version supported by this connector group /// public string ApiVersionMin { get; set; } - /// /// Maximum API version supported by this connector group /// public string ApiVersionMax { get; set; } - /// /// URL for the Connector Group Icon. /// public string IconUrl { get; set; } - /// /// URL for the Form that creates or updates connectors /// diff --git a/src/ShareFile.Api.Client/Models/Contact.cs b/src/ShareFile.Api.Client/Models/Contact.cs index 5170cc9..d6dcfb8 100644 --- a/src/ShareFile.Api.Client/Models/Contact.cs +++ b/src/ShareFile.Api.Client/Models/Contact.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,28 +17,43 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { #if !ShareFile + /// + /// Contact + /// public class Contact : Principal { - public User User { get; set; } - + /// + /// FirstName + /// public string FirstName { get; set; } - + /// + /// LastName + /// public string LastName { get; set; } - + /// + /// Company + /// public string Company { get; set; } - + /// + /// First 40 characters of the e-mail address + /// public string EmailMedium { get; set; } - + /// + /// First 20 characters of the e-mail address + /// public string EmailShort { get; set; } - public bool? IsConfirmed { get; set; } - + /// + /// Number of members in a distribution group. Will only be filled for distribution group. + /// public int? Count { get; set; } - + /// + /// Date this user was created + /// public DateTime? CreatedDate { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/CreateWorkflowParams.cs b/src/ShareFile.Api.Client/Models/CreateWorkflowParams.cs new file mode 100644 index 0000000..fd2754a --- /dev/null +++ b/src/ShareFile.Api.Client/Models/CreateWorkflowParams.cs @@ -0,0 +1,98 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ +#if !ShareFile + /// + /// Defines a request to create a Workflow. + /// + public class CreateWorkflowParams : ODataObject + { + /// + /// List of Participants for the workflow. + /// + public IEnumerable Participants { get; set; } + /// + /// Optional message to be included to contact. + /// + public string Message { get; set; } + public DateTime Due { get; set; } + /// + /// Enforce approval order. If true, then participant ordinals must be in sequential order + /// + public bool IsSequenced { get; set; } + /// + /// If true, then every approver must re-approve newly uploaded versions. + /// + public bool RestartOnNewVersion { get; set; } + /// + /// Determines if the server will email the workflow links or not. + /// If using , then will be populated on the result. + /// For Feedback workflows, if set to , then participants are not accepted.For Approval workflows, participants are required for both distribution methods. + /// + public SafeEnum DistributionMethod { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as CreateWorkflowParams; + if(typedSource != null) + { + Participants = typedSource.Participants; + Message = typedSource.Message; + Due = typedSource.Due; + IsSequenced = typedSource.IsSequenced; + RestartOnNewVersion = typedSource.RestartOnNewVersion; + DistributionMethod = typedSource.DistributionMethod; + } + else + { + JToken token; + if(source.TryGetProperty("Participants", out token) && token.Type != JTokenType.Null) + { + Participants = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("Message", out token) && token.Type != JTokenType.Null) + { + Message = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Due", out token) && token.Type != JTokenType.Null) + { + Due = (DateTime)serializer.Deserialize(token.CreateReader(), typeof(DateTime)); + } + if(source.TryGetProperty("IsSequenced", out token) && token.Type != JTokenType.Null) + { + IsSequenced = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + if(source.TryGetProperty("RestartOnNewVersion", out token) && token.Type != JTokenType.Null) + { + RestartOnNewVersion = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + if(source.TryGetProperty("DistributionMethod", out token) && token.Type != JTokenType.Null) + { + DistributionMethod = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); + } + } + } + } +#endif +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/CspTenantAccountParameters.cs b/src/ShareFile.Api.Client/Models/CspTenantAccountParameters.cs new file mode 100644 index 0000000..778ec5a --- /dev/null +++ b/src/ShareFile.Api.Client/Models/CspTenantAccountParameters.cs @@ -0,0 +1,58 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class CspTenantAccountParameters : BaseCspAccountParameters + { + /// + /// Account to be assigned as Partner + /// + public string PartnerAccountId { get; set; } + /// + /// User from Partner Account to be added as Admin for the Tenant + /// + public string PartnerAdminEmail { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as CspTenantAccountParameters; + if(typedSource != null) + { + PartnerAccountId = typedSource.PartnerAccountId; + PartnerAdminEmail = typedSource.PartnerAdminEmail; + } + else + { + JToken token; + if(source.TryGetProperty("PartnerAccountId", out token) && token.Type != JTokenType.Null) + { + PartnerAccountId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("PartnerAdminEmail", out token) && token.Type != JTokenType.Null) + { + PartnerAdminEmail = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/CustomMessage.cs b/src/ShareFile.Api.Client/Models/CustomMessage.cs new file mode 100644 index 0000000..eff12ad --- /dev/null +++ b/src/ShareFile.Api.Client/Models/CustomMessage.cs @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class CustomMessage : ODataObject + { + public string Message { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as CustomMessage; + if(typedSource != null) + { + Message = typedSource.Message; + } + else + { + JToken token; + if(source.TryGetProperty("Message", out token) && token.Type != JTokenType.Null) + { + Message = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/CustomWorkflowBundleType.cs b/src/ShareFile.Api.Client/Models/CustomWorkflowBundleType.cs new file mode 100644 index 0000000..f8b55f5 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/CustomWorkflowBundleType.cs @@ -0,0 +1,20 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +namespace ShareFile.Api.Client.Models +{ + public enum CustomWorkflowBundleType + { + Form = 0, + Template = 1, + Workflow = 2 + } +} diff --git a/src/ShareFile.Api.Client/Models/DailyAvailability.cs b/src/ShareFile.Api.Client/Models/DailyAvailability.cs new file mode 100644 index 0000000..c2b2e31 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/DailyAvailability.cs @@ -0,0 +1,70 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class DailyAvailability : ODataObject + { + public string Days { get; set; } + public int StartHour { get; set; } + public int StartMin { get; set; } + public int EndHour { get; set; } + public int EndMin { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as DailyAvailability; + if(typedSource != null) + { + Days = typedSource.Days; + StartHour = typedSource.StartHour; + StartMin = typedSource.StartMin; + EndHour = typedSource.EndHour; + EndMin = typedSource.EndMin; + } + else + { + JToken token; + if(source.TryGetProperty("Days", out token) && token.Type != JTokenType.Null) + { + Days = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("StartHour", out token) && token.Type != JTokenType.Null) + { + StartHour = (int)serializer.Deserialize(token.CreateReader(), typeof(int)); + } + if(source.TryGetProperty("StartMin", out token) && token.Type != JTokenType.Null) + { + StartMin = (int)serializer.Deserialize(token.CreateReader(), typeof(int)); + } + if(source.TryGetProperty("EndHour", out token) && token.Type != JTokenType.Null) + { + EndHour = (int)serializer.Deserialize(token.CreateReader(), typeof(int)); + } + if(source.TryGetProperty("EndMin", out token) && token.Type != JTokenType.Null) + { + EndMin = (int)serializer.Deserialize(token.CreateReader(), typeof(int)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/Device.cs b/src/ShareFile.Api.Client/Models/Device.cs index aeb8af0..6289b18 100644 --- a/src/ShareFile.Api.Client/Models/Device.cs +++ b/src/ShareFile.Api.Client/Models/Device.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,23 +17,19 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Device + /// public class Device : ODataObject { - public SafeEnum Tool { get; set; } - public string ToolRaw { get; set; } - public User Owner { get; set; } - public DateTime? Created { get; set; } - public string ToolVersion { get; set; } - public bool JustRegistered { get; set; } - public bool? IsRemoteWipeReady { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/DeviceActionInitiatorRole.cs b/src/ShareFile.Api.Client/Models/DeviceActionInitiatorRole.cs index c05a74a..8fe2d7b 100644 --- a/src/ShareFile.Api.Client/Models/DeviceActionInitiatorRole.cs +++ b/src/ShareFile.Api.Client/Models/DeviceActionInitiatorRole.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum DeviceActionInitiatorRole + public enum DeviceActionInitiatorRole { AccountAdmin = 0, DeviceOwner = 1, DeviceUser = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/DeviceLogEntry.cs b/src/ShareFile.Api.Client/Models/DeviceLogEntry.cs index 1718ab4..4320ef5 100644 --- a/src/ShareFile.Api.Client/Models/DeviceLogEntry.cs +++ b/src/ShareFile.Api.Client/Models/DeviceLogEntry.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,41 +17,37 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Device Log Entry + /// public class DeviceLogEntry : ODataObject { - /// /// File name /// public string FileName { get; set; } - /// /// File Id /// public string FileID { get; set; } - /// /// Timestamp in milliseconds since epoch /// public long? Timestamp { get; set; } - /// /// Account Id /// public string AccountID { get; set; } - /// /// User Id /// public string UserID { get; set; } - /// /// Action /// public SafeEnum Action { get; set; } - /// /// Additional Info /// diff --git a/src/ShareFile.Api.Client/Models/DeviceLogEntryAction.cs b/src/ShareFile.Api.Client/Models/DeviceLogEntryAction.cs index fcd6754..50d90e9 100644 --- a/src/ShareFile.Api.Client/Models/DeviceLogEntryAction.cs +++ b/src/ShareFile.Api.Client/Models/DeviceLogEntryAction.cs @@ -5,17 +5,21 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum DeviceLogEntryAction + + /// + /// Device Log Entry Action + /// + public enum DeviceLogEntryAction { OpenGeneric = 0, OpenExternal = 1, OpenPreview = 2, ShareSocial = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/DeviceStatus.cs b/src/ShareFile.Api.Client/Models/DeviceStatus.cs index faa257e..e9d424c 100644 --- a/src/ShareFile.Api.Client/Models/DeviceStatus.cs +++ b/src/ShareFile.Api.Client/Models/DeviceStatus.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Device Status + /// public class DeviceStatus : ODataObject { - /// /// Locked users /// public IEnumerable LockedUsers { get; set; } - /// /// Users to wipe /// diff --git a/src/ShareFile.Api.Client/Models/DeviceUser.cs b/src/ShareFile.Api.Client/Models/DeviceUser.cs index 2840a78..eda2378 100644 --- a/src/ShareFile.Api.Client/Models/DeviceUser.cs +++ b/src/ShareFile.Api.Client/Models/DeviceUser.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,45 +17,30 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Device User + /// public class DeviceUser : ODataObject { - public Account Account { get; set; } - public User User { get; set; } - public Device Device { get; set; } - public bool? IsOwner { get; set; } - public string FriendlyName { get; set; } - public bool? Wipe { get; set; } - public bool? IsLocked { get; set; } - public bool? IsDeleted { get; set; } - public DateTime? Created { get; set; } - public DateTime? LastLogin { get; set; } - public DateTime? LastWipe { get; set; } - public string WipeToken { get; set; } - public string WipeInitiator { get; set; } - public SafeEnum WipeInitiatorRole { get; set; } - public string LockInitiator { get; set; } - public SafeEnum LockInitiatorRole { get; set; } - public SafeEnum DeviceType { get; set; } - public string LastErrorMessage { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/DeviceUserWipe.cs b/src/ShareFile.Api.Client/Models/DeviceUserWipe.cs index 05fb66f..d904eed 100644 --- a/src/ShareFile.Api.Client/Models/DeviceUserWipe.cs +++ b/src/ShareFile.Api.Client/Models/DeviceUserWipe.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// DeviceUserWipe + /// public class DeviceUserWipe : ODataObject { - /// /// Wipe token /// public string WipeToken { get; set; } - /// /// Success /// public string Success { get; set; } - /// /// Error message /// diff --git a/src/ShareFile.Api.Client/Models/DeviceWipeReport.cs b/src/ShareFile.Api.Client/Models/DeviceWipeReport.cs index f60c541..392f4b6 100644 --- a/src/ShareFile.Api.Client/Models/DeviceWipeReport.cs +++ b/src/ShareFile.Api.Client/Models/DeviceWipeReport.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents device wipe results + /// public class DeviceWipeReport : ODataObject { - /// /// Logs /// public IEnumerable Logs { get; set; } - /// /// Wipe results /// diff --git a/src/ShareFile.Api.Client/Models/DiskSpace.cs b/src/ShareFile.Api.Client/Models/DiskSpace.cs index a919289..3c1c84f 100644 --- a/src/ShareFile.Api.Client/Models/DiskSpace.cs +++ b/src/ShareFile.Api.Client/Models/DiskSpace.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// The current usage statistics for DiskSpace on the Account + /// public class DiskSpace : ODataObject { - /// /// Max space allowed /// public int? Max { get; set; } - /// /// Current space used /// public int? Used { get; set; } - /// /// Current space free /// diff --git a/src/ShareFile.Api.Client/Models/LockType.cs b/src/ShareFile.Api.Client/Models/DistributionMethod.cs similarity index 67% rename from src/ShareFile.Api.Client/Models/LockType.cs rename to src/ShareFile.Api.Client/Models/DistributionMethod.cs index 78816c7..f64852c 100644 --- a/src/ShareFile.Api.Client/Models/LockType.cs +++ b/src/ShareFile.Api.Client/Models/DistributionMethod.cs @@ -5,16 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum LockType + public enum DistributionMethod { - SoftLock = 1, - HardLock = 2, - CoauthLock = 3 + Managed = 0, + Link = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/DlpStatus.cs b/src/ShareFile.Api.Client/Models/DlpStatus.cs index 362137b..d707ca9 100644 --- a/src/ShareFile.Api.Client/Models/DlpStatus.cs +++ b/src/ShareFile.Api.Client/Models/DlpStatus.cs @@ -5,16 +5,32 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum DlpStatus + + /// + /// Data Loss Prevention file scan status. + /// + public enum DlpStatus { + + /// + /// The file has not been scanned for policy violations. + /// Unscanned = 0, + + /// + /// The file has been scanned and no policy violations were found. + /// ScannedOK = 1, + + /// + /// The file has been scanned and a policy violation was found. + /// ScannedRejected = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/DocumentViewerPrinting.cs b/src/ShareFile.Api.Client/Models/DocumentViewerPrinting.cs index 386d64b..a77908e 100644 --- a/src/ShareFile.Api.Client/Models/DocumentViewerPrinting.cs +++ b/src/ShareFile.Api.Client/Models/DocumentViewerPrinting.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum DocumentViewerPrinting + public enum DocumentViewerPrinting { Default = 0, Enabled = 1, Disabled = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/DownloadSpecification.cs b/src/ShareFile.Api.Client/Models/DownloadSpecification.cs index fea269b..1933987 100644 --- a/src/ShareFile.Api.Client/Models/DownloadSpecification.cs +++ b/src/ShareFile.Api.Client/Models/DownloadSpecification.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,19 +17,20 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class DownloadSpecification : ODataObject { - public string DownloadToken { get; set; } - + /// + /// Specifies the prepare operation for storage servers + /// public string PrepareXmlInfo { get; set; } - + /// + /// Specifies the download URL for clients + /// public Uri DownloadUrl { get; set; } - public Uri DownloadPrepStartURL { get; set; } - public Uri DownloadPrepStatusURL { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ESignature.cs b/src/ShareFile.Api.Client/Models/ESignature.cs index a32e344..3d13b5f 100644 --- a/src/ShareFile.Api.Client/Models/ESignature.cs +++ b/src/ShareFile.Api.Client/Models/ESignature.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,33 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ESignature : ODataObject { - public string ID { get; set; } - public string ItemID { get; set; } - public string ReferenceID { get; set; } - public string AlternateReferenceID { get; set; } - public string SignedItemID { get; set; } - public SafeEnum Provider { get; set; } - public string UserID { get; set; } - public SafeEnum Status { get; set; } - public string DocumentStatusDescription { get; set; } - public DateTime DateCreated { get; set; } - public DateTime DateLastUpdated { get; set; } - public string DocumentUrl { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ESignatureDocumentStatus.cs b/src/ShareFile.Api.Client/Models/ESignatureDocumentStatus.cs index 4688912..72f5eec 100644 --- a/src/ShareFile.Api.Client/Models/ESignatureDocumentStatus.cs +++ b/src/ShareFile.Api.Client/Models/ESignatureDocumentStatus.cs @@ -5,17 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ESignatureDocumentStatus + public enum ESignatureDocumentStatus { SentToProvider = 0, SentForSignature = 1, Signed = 2, Complete = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/EditingPlatform.cs b/src/ShareFile.Api.Client/Models/EditingPlatform.cs index b807ede..f251fa2 100644 --- a/src/ShareFile.Api.Client/Models/EditingPlatform.cs +++ b/src/ShareFile.Api.Client/Models/EditingPlatform.cs @@ -5,14 +5,18 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum EditingPlatform + + /// + /// Platform(s) supported to edit document + /// + public enum EditingPlatform { MicrosoftOfficeOnline = 0 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/EditingPlatformInfo.cs b/src/ShareFile.Api.Client/Models/EditingPlatformInfo.cs index c7e7304..a9f85d0 100644 --- a/src/ShareFile.Api.Client/Models/EditingPlatformInfo.cs +++ b/src/ShareFile.Api.Client/Models/EditingPlatformInfo.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,13 +17,14 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents the info about editing platforms supported + /// public class EditingPlatformInfo : ODataObject { - public SafeEnum EditingPlatform { get; set; } - public ItemProtocolLink ItemProtocolLink { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/EmailAddress.cs b/src/ShareFile.Api.Client/Models/EmailAddress.cs new file mode 100644 index 0000000..a0a2d27 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EmailAddress.cs @@ -0,0 +1,58 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class EmailAddress : ODataObject + { + public string Email { get; set; } + public bool? IsConfirmed { get; set; } + public bool? IsPrimary { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EmailAddress; + if(typedSource != null) + { + Email = typedSource.Email; + IsConfirmed = typedSource.IsConfirmed; + IsPrimary = typedSource.IsPrimary; + } + else + { + JToken token; + if(source.TryGetProperty("Email", out token) && token.Type != JTokenType.Null) + { + Email = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("IsConfirmed", out token) && token.Type != JTokenType.Null) + { + IsConfirmed = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IsPrimary", out token) && token.Type != JTokenType.Null) + { + IsPrimary = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EmailSupport.cs b/src/ShareFile.Api.Client/Models/EmailSupport.cs new file mode 100644 index 0000000..622c748 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EmailSupport.cs @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class EmailSupport : SupportMethod + { + public string Email { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EmailSupport; + if(typedSource != null) + { + Email = typedSource.Email; + } + else + { + JToken token; + if(source.TryGetProperty("Email", out token) && token.Type != JTokenType.Null) + { + Email = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EncryptedEmail.cs b/src/ShareFile.Api.Client/Models/EncryptedEmail.cs new file mode 100644 index 0000000..420e679 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EncryptedEmail.cs @@ -0,0 +1,142 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Encrypted Email + /// + public class EncryptedEmail : ODataObject + { + /// + /// Message subject + /// + public string Subject { get; set; } + /// + /// Direct To recipients + /// + public IEnumerable ToRecipients { get; set; } + /// + /// Copied recipients + /// + public IEnumerable CcRecipients { get; set; } + /// + /// Only available to the sender. + /// + public IEnumerable BccRecipients { get; set; } + /// + /// Original encrypted email. + /// + public EncryptedEmail OriginalEncryptedEmail { get; set; } + /// + /// Encrypted email that this message is in reply to. + /// + public EncryptedEmail InReplyTo { get; set; } + /// + /// Sender of the encrypted email + /// + public User Sender { get; set; } + /// + /// Only available to the sender. + /// + public Share Share { get; set; } + /// + /// Used to access the attachments. Only available for a recipient. + /// + public ShareAlias ShareAlias { get; set; } + /// + /// Link to view the email in the web portal. + /// + public Uri Uri { get; set; } + /// + /// Date the encrypted email was sent + /// + public DateTime? SentDate { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EncryptedEmail; + if(typedSource != null) + { + Subject = typedSource.Subject; + ToRecipients = typedSource.ToRecipients; + CcRecipients = typedSource.CcRecipients; + BccRecipients = typedSource.BccRecipients; + OriginalEncryptedEmail = typedSource.OriginalEncryptedEmail; + InReplyTo = typedSource.InReplyTo; + Sender = typedSource.Sender; + Share = typedSource.Share; + ShareAlias = typedSource.ShareAlias; + Uri = typedSource.Uri; + SentDate = typedSource.SentDate; + } + else + { + JToken token; + if(source.TryGetProperty("Subject", out token) && token.Type != JTokenType.Null) + { + Subject = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ToRecipients", out token) && token.Type != JTokenType.Null) + { + ToRecipients = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("CcRecipients", out token) && token.Type != JTokenType.Null) + { + CcRecipients = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("BccRecipients", out token) && token.Type != JTokenType.Null) + { + BccRecipients = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("OriginalEncryptedEmail", out token) && token.Type != JTokenType.Null) + { + OriginalEncryptedEmail = (EncryptedEmail)serializer.Deserialize(token.CreateReader(), typeof(EncryptedEmail)); + } + if(source.TryGetProperty("InReplyTo", out token) && token.Type != JTokenType.Null) + { + InReplyTo = (EncryptedEmail)serializer.Deserialize(token.CreateReader(), typeof(EncryptedEmail)); + } + if(source.TryGetProperty("Sender", out token) && token.Type != JTokenType.Null) + { + Sender = (User)serializer.Deserialize(token.CreateReader(), typeof(User)); + } + if(source.TryGetProperty("Share", out token) && token.Type != JTokenType.Null) + { + Share = (Share)serializer.Deserialize(token.CreateReader(), typeof(Share)); + } + if(source.TryGetProperty("ShareAlias", out token) && token.Type != JTokenType.Null) + { + ShareAlias = (ShareAlias)serializer.Deserialize(token.CreateReader(), typeof(ShareAlias)); + } + if(source.TryGetProperty("Uri", out token) && token.Type != JTokenType.Null) + { + Uri = (Uri)serializer.Deserialize(token.CreateReader(), typeof(Uri)); + } + if(source.TryGetProperty("SentDate", out token) && token.Type != JTokenType.Null) + { + SentDate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EncryptedEmailCreateParams.cs b/src/ShareFile.Api.Client/Models/EncryptedEmailCreateParams.cs new file mode 100644 index 0000000..59348f1 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EncryptedEmailCreateParams.cs @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// EncryptedEmail Create Params + /// + public class EncryptedEmailCreateParams : EncryptedEmailReplyParams + { + /// + /// Whether the EncryptedEmail requires User Information (Name, Email, Company) to be read + /// + public bool? RequireUserInfo { get; set; } + /// + /// Whether the EncryptedEmail requires the recipient to login + /// + public bool? RequireLogin { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EncryptedEmailCreateParams; + if(typedSource != null) + { + RequireUserInfo = typedSource.RequireUserInfo; + RequireLogin = typedSource.RequireLogin; + } + else + { + JToken token; + if(source.TryGetProperty("RequireUserInfo", out token) && token.Type != JTokenType.Null) + { + RequireUserInfo = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("RequireLogin", out token) && token.Type != JTokenType.Null) + { + RequireLogin = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EncryptedEmailParams.cs b/src/ShareFile.Api.Client/Models/EncryptedEmailParams.cs new file mode 100644 index 0000000..633a21e --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EncryptedEmailParams.cs @@ -0,0 +1,72 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ +#if !ShareFile + /// + /// EncryptedEmail Creation Parameters + /// + public class EncryptedEmailParams : ODataObject + { + /// + /// Message Subject + /// + public string Subject { get; set; } + /// + /// Days before message expires + /// + public int? ExpirationDays { get; set; } + /// + /// Whether the Sender will receive an email when the EncryptedEmail is opened + /// + public bool? NotifyOnUse { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EncryptedEmailParams; + if(typedSource != null) + { + Subject = typedSource.Subject; + ExpirationDays = typedSource.ExpirationDays; + NotifyOnUse = typedSource.NotifyOnUse; + } + else + { + JToken token; + if(source.TryGetProperty("Subject", out token) && token.Type != JTokenType.Null) + { + Subject = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ExpirationDays", out token) && token.Type != JTokenType.Null) + { + ExpirationDays = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("NotifyOnUse", out token) && token.Type != JTokenType.Null) + { + NotifyOnUse = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + } + } + } +#endif +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EncryptedEmailRecipient.cs b/src/ShareFile.Api.Client/Models/EncryptedEmailRecipient.cs new file mode 100644 index 0000000..ad7aec9 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EncryptedEmailRecipient.cs @@ -0,0 +1,97 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Encrypted Email Recipient + /// + public class EncryptedEmailRecipient : ODataObject + { + /// + /// User entity for the Recipient + /// + public User User { get; set; } + /// + /// First Name + /// + public string FirstName { get; set; } + /// + /// Last Name + /// + public string LastName { get; set; } + /// + /// Company Name + /// + public string Company { get; set; } + /// + /// Email address + /// + public string Email { get; set; } + /// + /// Full Name + /// + public string FullName { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EncryptedEmailRecipient; + if(typedSource != null) + { + User = typedSource.User; + FirstName = typedSource.FirstName; + LastName = typedSource.LastName; + Company = typedSource.Company; + Email = typedSource.Email; + FullName = typedSource.FullName; + } + else + { + JToken token; + if(source.TryGetProperty("User", out token) && token.Type != JTokenType.Null) + { + User = (User)serializer.Deserialize(token.CreateReader(), typeof(User)); + } + if(source.TryGetProperty("FirstName", out token) && token.Type != JTokenType.Null) + { + FirstName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("LastName", out token) && token.Type != JTokenType.Null) + { + LastName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Company", out token) && token.Type != JTokenType.Null) + { + Company = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Email", out token) && token.Type != JTokenType.Null) + { + Email = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("FullName", out token) && token.Type != JTokenType.Null) + { + FullName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EncryptedEmailReplyParams.cs b/src/ShareFile.Api.Client/Models/EncryptedEmailReplyParams.cs new file mode 100644 index 0000000..c66e8b0 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EncryptedEmailReplyParams.cs @@ -0,0 +1,70 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// EncryptedEmail Reply Params + /// + public class EncryptedEmailReplyParams : EncryptedEmailParams + { + /// + /// To Recipients + /// + public IEnumerable ToRecipients { get; set; } + /// + /// CC Recipients + /// + public IEnumerable CcRecipients { get; set; } + /// + /// BCC Recipients + /// + public IEnumerable BccRecipients { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EncryptedEmailReplyParams; + if(typedSource != null) + { + ToRecipients = typedSource.ToRecipients; + CcRecipients = typedSource.CcRecipients; + BccRecipients = typedSource.BccRecipients; + } + else + { + JToken token; + if(source.TryGetProperty("ToRecipients", out token) && token.Type != JTokenType.Null) + { + ToRecipients = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("CcRecipients", out token) && token.Type != JTokenType.Null) + { + CcRecipients = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("BccRecipients", out token) && token.Type != JTokenType.Null) + { + BccRecipients = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EncryptedEmailSendParams.cs b/src/ShareFile.Api.Client/Models/EncryptedEmailSendParams.cs new file mode 100644 index 0000000..849c806 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/EncryptedEmailSendParams.cs @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// EncryptedEmail Send Parameters + /// + public class EncryptedEmailSendParams : ODataObject + { + /// + /// Item for a plain text file that will serve as the message body + /// + public Item Message { get; set; } + /// + /// Items that will be attached to the Email + /// + public IEnumerable Attachments { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as EncryptedEmailSendParams; + if(typedSource != null) + { + Message = typedSource.Message; + Attachments = typedSource.Attachments; + } + else + { + JToken token; + if(source.TryGetProperty("Message", out token) && token.Type != JTokenType.Null) + { + Message = (Item)serializer.Deserialize(token.CreateReader(), typeof(Item)); + } + if(source.TryGetProperty("Attachments", out token) && token.Type != JTokenType.Null) + { + Attachments = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/EnsEventType.cs b/src/ShareFile.Api.Client/Models/EnsEventType.cs index e76e57f..7da9846 100644 --- a/src/ShareFile.Api.Client/Models/EnsEventType.cs +++ b/src/ShareFile.Api.Client/Models/EnsEventType.cs @@ -5,14 +5,18 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + + /// + /// Type of ENS Event + /// [Flags] - public enum EnsEventType + public enum EnsEventType { None = 0, Create = 1, @@ -20,4 +24,4 @@ public enum EnsEventType Delete = 4, All = 7 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/EnsSubscriberConfiguration.cs b/src/ShareFile.Api.Client/Models/EnsSubscriberConfiguration.cs index c8f4344..4cce83a 100644 --- a/src/ShareFile.Api.Client/Models/EnsSubscriberConfiguration.cs +++ b/src/ShareFile.Api.Client/Models/EnsSubscriberConfiguration.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,25 +17,43 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class EnsSubscriberConfiguration : ODataObject { - + /// + /// Is ENS enabled? + /// public bool IsEnsEnabled { get; set; } - + /// + /// The ENS Server URL + /// public string EnsServerUrl { get; set; } - + /// + /// Version string + /// public string Version { get; set; } - + /// + /// RecommendedPollingSyncInterval will control how often a cloud check is done when we are not using ENS. + /// public TimeSpan RecommendedPollingSyncInterval { get; set; } - + /// + /// RecommendedNotificationSyncInterval will control how soon we respond to notification events with a cloud check when we are using ENS. + /// public TimeSpan RecommendedNotificationSyncInterval { get; set; } - + /// + /// NotificationConfigurationCount will control how often we check to see if we should be using ENS or not. + /// This value is a count that gets multiplied by the RecommendedPollingSyncInterval to determine the actual interval. + /// public int NotificationConfigurationCount { get; set; } - + /// + /// FailSafePollingCount will only be used when ENS is enabled and will get multiplied by the RecommendedNotificationSyncInterval + /// to determine how often we do a cloudcheck if we have not received any notifications. + /// public int FailSafePollingCount { get; set; } - + /// + /// MaxNotificationSyncWaitCount will control how long the sync client waits before doing a cloud check after receiving a series of notification events. + /// public int MaxNotificationSyncWaitCount { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/EnsSubscriptionRequest.cs b/src/ShareFile.Api.Client/Models/EnsSubscriptionRequest.cs index 72f7d63..a01c3ee 100644 --- a/src/ShareFile.Api.Client/Models/EnsSubscriptionRequest.cs +++ b/src/ShareFile.Api.Client/Models/EnsSubscriptionRequest.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,19 +17,14 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class EnsSubscriptionRequest : ODataObject { - public string EnsServerUrl { get; set; } - public string ClientId { get; set; } - public ODataObject Entity { get; set; } - public SafeEnum EventTypes { get; set; } - public bool IncludeProgeny { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/EnsSubscriptionToken.cs b/src/ShareFile.Api.Client/Models/EnsSubscriptionToken.cs index ba8586c..a7b97ee 100644 --- a/src/ShareFile.Api.Client/Models/EnsSubscriptionToken.cs +++ b/src/ShareFile.Api.Client/Models/EnsSubscriptionToken.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,19 +17,14 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class EnsSubscriptionToken : ODataObject { - public string SubscriptionId { get; set; } - public string EntityId { get; set; } - public SafeEnum EventTypes { get; set; } - public bool IncludeProgeny { get; set; } - public long LastEventCount { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/EntityTypeMap.cs b/src/ShareFile.Api.Client/Models/EntityTypeMap.cs index 5bf6751..2bf049a 100644 --- a/src/ShareFile.Api.Client/Models/EntityTypeMap.cs +++ b/src/ShareFile.Api.Client/Models/EntityTypeMap.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; using System.Collections.Generic; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public static class EntityTypeMap { @@ -27,16 +27,64 @@ public static Dictionary GetEntityTypeMap() _entityTypeMap.Add("AccessControlsBulkParamss", typeof(AccessControlsBulkParams)); _entityTypeMap.Add("AccessControlParam", typeof(AccessControlParam)); _entityTypeMap.Add("AccessControlParams", typeof(AccessControlParam)); + _entityTypeMap.Add("BaseAccountCreationParameters", typeof(BaseAccountCreationParameters)); + _entityTypeMap.Add("BaseAccountCreationParameterss", typeof(BaseAccountCreationParameters)); + _entityTypeMap.Add("BaseCspAccountParameters", typeof(BaseCspAccountParameters)); + _entityTypeMap.Add("BaseCspAccountParameterss", typeof(BaseCspAccountParameters)); + _entityTypeMap.Add("CspTenantAccountParameters", typeof(CspTenantAccountParameters)); + _entityTypeMap.Add("CspTenantAccountParameterss", typeof(CspTenantAccountParameters)); + _entityTypeMap.Add("BillingContact", typeof(BillingContact)); + _entityTypeMap.Add("BillingContacts", typeof(BillingContact)); + _entityTypeMap.Add("CompanyContactInformation", typeof(CompanyContactInformation)); + _entityTypeMap.Add("CompanyContactInformations", typeof(CompanyContactInformation)); + _entityTypeMap.Add("RequestedPlan", typeof(RequestedPlan)); + _entityTypeMap.Add("RequestedPlans", typeof(RequestedPlan)); _entityTypeMap.Add("AccountMessageCode", typeof(AccountMessageCode)); _entityTypeMap.Add("AccountMessageCodes", typeof(AccountMessageCode)); _entityTypeMap.Add("AccessControlsCloneParams", typeof(AccessControlsCloneParams)); _entityTypeMap.Add("AccessControlsCloneParamss", typeof(AccessControlsCloneParams)); + _entityTypeMap.Add("ActivationToken", typeof(ActivationToken)); + _entityTypeMap.Add("ActivationTokens", typeof(ActivationToken)); + _entityTypeMap.Add("Bandwidth", typeof(Bandwidth)); + _entityTypeMap.Add("Bandwidths", typeof(Bandwidth)); + _entityTypeMap.Add("Cancellation", typeof(Cancellation)); + _entityTypeMap.Add("Cancellations", typeof(Cancellation)); + _entityTypeMap.Add("CustomMessage", typeof(CustomMessage)); + _entityTypeMap.Add("CustomMessages", typeof(CustomMessage)); + _entityTypeMap.Add("EmailAddress", typeof(EmailAddress)); + _entityTypeMap.Add("EmailAddresss", typeof(EmailAddress)); + _entityTypeMap.Add("Favorite", typeof(Favorite)); + _entityTypeMap.Add("Favorites", typeof(Favorite)); + _entityTypeMap.Add("FileAndFolderSettingOptions", typeof(FileAndFolderSettingOptions)); + _entityTypeMap.Add("FileAndFolderSettingOptionss", typeof(FileAndFolderSettingOptions)); + _entityTypeMap.Add("ForbiddenOAuthClientNameWords", typeof(ForbiddenOAuthClientNameWords)); + _entityTypeMap.Add("ForbiddenOAuthClientNameWordss", typeof(ForbiddenOAuthClientNameWords)); + _entityTypeMap.Add("ReportFilter", typeof(ReportFilter)); + _entityTypeMap.Add("ReportFilters", typeof(ReportFilter)); + _entityTypeMap.Add("ActivityReportFilter", typeof(ActivityReportFilter)); + _entityTypeMap.Add("ActivityReportFilters", typeof(ActivityReportFilter)); + _entityTypeMap.Add("UserSummaryReportFilter", typeof(UserSummaryReportFilter)); + _entityTypeMap.Add("UserSummaryReportFilters", typeof(UserSummaryReportFilter)); + _entityTypeMap.Add("StorageCenterUrls", typeof(StorageCenterUrls)); + _entityTypeMap.Add("StorageCenterUrlss", typeof(StorageCenterUrls)); + _entityTypeMap.Add("TenantAccountCreationParameters", typeof(TenantAccountCreationParameters)); + _entityTypeMap.Add("TenantAccountCreationParameterss", typeof(TenantAccountCreationParameters)); + _entityTypeMap.Add("UserBulkOperationRequest", typeof(UserBulkOperationRequest)); + _entityTypeMap.Add("UserBulkOperationRequests", typeof(UserBulkOperationRequest)); + _entityTypeMap.Add("UserBulkDowngradeRequest", typeof(UserBulkDowngradeRequest)); + _entityTypeMap.Add("UserBulkDowngradeRequests", typeof(UserBulkDowngradeRequest)); + _entityTypeMap.Add("ResetPasswordRequest", typeof(ResetPasswordRequest)); + _entityTypeMap.Add("ResetPasswordRequests", typeof(ResetPasswordRequest)); + _entityTypeMap.Add("SubdomainAvailabilityResult", typeof(SubdomainAvailabilityResult)); + _entityTypeMap.Add("SubdomainAvailabilityResults", typeof(SubdomainAvailabilityResult)); _entityTypeMap.Add("BrandingLinks", typeof(BrandingLinks)); _entityTypeMap.Add("BrandingLinkss", typeof(BrandingLinks)); _entityTypeMap.Add("PolicyUsage", typeof(PolicyUsage)); _entityTypeMap.Add("PolicyUsages", typeof(PolicyUsage)); _entityTypeMap.Add("FileAndFolderSettings", typeof(FileAndFolderSettings)); _entityTypeMap.Add("FileAndFolderSettingss", typeof(FileAndFolderSettings)); + _entityTypeMap.Add("ConnectedApp", typeof(ConnectedApp)); + _entityTypeMap.Add("ConnectedApps", typeof(ConnectedApp)); _entityTypeMap.Add("EditingPlatformInfo", typeof(EditingPlatformInfo)); _entityTypeMap.Add("EditingPlatformInfos", typeof(EditingPlatformInfo)); _entityTypeMap.Add("FolderInvite", typeof(FolderInvite)); @@ -86,6 +134,8 @@ public static Dictionary GetEntityTypeMap() _entityTypeMap.Add("FolderTemplateItems", typeof(FolderTemplateItem)); _entityTypeMap.Add("ShareSettings", typeof(ShareSettings)); _entityTypeMap.Add("ShareSettingss", typeof(ShareSettings)); + _entityTypeMap.Add("TwoFactorAuthApp", typeof(TwoFactorAuthApp)); + _entityTypeMap.Add("TwoFactorAuthApps", typeof(TwoFactorAuthApp)); _entityTypeMap.Add("UserAccessSettings", typeof(UserAccessSettings)); _entityTypeMap.Add("UserAccessSettingss", typeof(UserAccessSettings)); _entityTypeMap.Add("UserConfirmRequirement", typeof(UserConfirmRequirement)); @@ -104,12 +154,26 @@ public static Dictionary GetEntityTypeMap() _entityTypeMap.Add("UploadRequestParamss", typeof(UploadRequestParams)); _entityTypeMap.Add("RemoteUploadRequestParams", typeof(RemoteUploadRequestParams)); _entityTypeMap.Add("RemoteUploadRequestParamss", typeof(RemoteUploadRequestParams)); + _entityTypeMap.Add("EncryptedEmail", typeof(EncryptedEmail)); + _entityTypeMap.Add("EncryptedEmails", typeof(EncryptedEmail)); + _entityTypeMap.Add("EncryptedEmailParams", typeof(EncryptedEmailParams)); + _entityTypeMap.Add("EncryptedEmailParamss", typeof(EncryptedEmailParams)); + _entityTypeMap.Add("EncryptedEmailReplyParams", typeof(EncryptedEmailReplyParams)); + _entityTypeMap.Add("EncryptedEmailReplyParamss", typeof(EncryptedEmailReplyParams)); + _entityTypeMap.Add("EncryptedEmailCreateParams", typeof(EncryptedEmailCreateParams)); + _entityTypeMap.Add("EncryptedEmailCreateParamss", typeof(EncryptedEmailCreateParams)); + _entityTypeMap.Add("EncryptedEmailSendParams", typeof(EncryptedEmailSendParams)); + _entityTypeMap.Add("EncryptedEmailSendParamss", typeof(EncryptedEmailSendParams)); + _entityTypeMap.Add("EncryptedEmailRecipient", typeof(EncryptedEmailRecipient)); + _entityTypeMap.Add("EncryptedEmailRecipients", typeof(EncryptedEmailRecipient)); _entityTypeMap.Add("ESignature", typeof(ESignature)); _entityTypeMap.Add("ESignatures", typeof(ESignature)); _entityTypeMap.Add("MarketAnalytics", typeof(MarketAnalytics)); _entityTypeMap.Add("MarketAnalyticss", typeof(MarketAnalytics)); _entityTypeMap.Add("FileLock", typeof(FileLock)); _entityTypeMap.Add("FileLocks", typeof(FileLock)); + _entityTypeMap.Add("ClientUpgradeWeb", typeof(ClientUpgradeWeb)); + _entityTypeMap.Add("ClientUpgradeWebs", typeof(ClientUpgradeWeb)); _entityTypeMap.Add("PowerTools", typeof(PowerTools)); _entityTypeMap.Add("PowerToolss", typeof(PowerTools)); _entityTypeMap.Add("ConnectorGroupZone", typeof(ConnectorGroupZone)); @@ -121,6 +185,16 @@ public static Dictionary GetEntityTypeMap() _entityTypeMap.Add("PreviewPlatformInfo", typeof(PreviewPlatformInfo)); _entityTypeMap.Add("PreviewPlatformInfos", typeof(PreviewPlatformInfo)); _entityTypeMap.Add("ShareResendParams", typeof(ShareResendParams)); + _entityTypeMap.Add("Support", typeof(Support)); + _entityTypeMap.Add("Supports", typeof(Support)); + _entityTypeMap.Add("SupportMethod", typeof(SupportMethod)); + _entityTypeMap.Add("SupportMethods", typeof(SupportMethod)); + _entityTypeMap.Add("PhoneSupport", typeof(PhoneSupport)); + _entityTypeMap.Add("PhoneSupports", typeof(PhoneSupport)); + _entityTypeMap.Add("EmailSupport", typeof(EmailSupport)); + _entityTypeMap.Add("EmailSupports", typeof(EmailSupport)); + _entityTypeMap.Add("DailyAvailability", typeof(DailyAvailability)); + _entityTypeMap.Add("DailyAvailabilitys", typeof(DailyAvailability)); _entityTypeMap.Add("ToolInformation", typeof(ToolInformation)); _entityTypeMap.Add("ToolInformations", typeof(ToolInformation)); _entityTypeMap.Add("AccessControl", typeof(AccessControl)); @@ -183,8 +257,8 @@ public static Dictionary GetEntityTypeMap() _entityTypeMap.Add("Metadata", typeof(Metadata)); _entityTypeMap.Add("Metadatas", typeof(Metadata)); _entityTypeMap.Add("MobileSecuritySettings", typeof(MobileSecuritySettings)); - _entityTypeMap.Add("Notification", typeof(Notification)); - _entityTypeMap.Add("Notifications", typeof(Notification)); + _entityTypeMap.Add("SentNotification", typeof(SentNotification)); + _entityTypeMap.Add("SentNotifications", typeof(SentNotification)); _entityTypeMap.Add("OutlookInformation", typeof(OutlookInformation)); _entityTypeMap.Add("OutlookInformations", typeof(OutlookInformation)); _entityTypeMap.Add("OutlookInformationOptionBool", typeof(OutlookInformationOptionBool)); @@ -252,6 +326,30 @@ public static Dictionary GetEntityTypeMap() _entityTypeMap.Add("UserPreferences", typeof(UserPreferences)); _entityTypeMap.Add("UserSecurity", typeof(UserSecurity)); _entityTypeMap.Add("UserSecurities", typeof(UserSecurity)); + _entityTypeMap.Add("WebhookCapabilities", typeof(WebhookCapabilities)); + _entityTypeMap.Add("WebhookCapabilitiess", typeof(WebhookCapabilities)); + _entityTypeMap.Add("WebhookClient", typeof(WebhookClient)); + _entityTypeMap.Add("WebhookClients", typeof(WebhookClient)); + _entityTypeMap.Add("WebhookSignatureKeys", typeof(WebhookSignatureKeys)); + _entityTypeMap.Add("WebhookSignatureKeyss", typeof(WebhookSignatureKeys)); + _entityTypeMap.Add("WebhookSubscription", typeof(WebhookSubscription)); + _entityTypeMap.Add("WebhookSubscriptions", typeof(WebhookSubscription)); + _entityTypeMap.Add("SubscribedResourceEvent", typeof(SubscribedResourceEvent)); + _entityTypeMap.Add("SubscribedResourceEvents", typeof(SubscribedResourceEvent)); + _entityTypeMap.Add("SubscriptionContext", typeof(SubscriptionContext)); + _entityTypeMap.Add("SubscriptionContexts", typeof(SubscriptionContext)); + _entityTypeMap.Add("WebhookSupportedContext", typeof(WebhookSupportedContext)); + _entityTypeMap.Add("WebhookSupportedContexts", typeof(WebhookSupportedContext)); + _entityTypeMap.Add("WebhookSupportedEvents", typeof(WebhookSupportedEvents)); + _entityTypeMap.Add("WebhookSupportedEventss", typeof(WebhookSupportedEvents)); + _entityTypeMap.Add("CreateWorkflowParams", typeof(CreateWorkflowParams)); + _entityTypeMap.Add("CreateWorkflowParamss", typeof(CreateWorkflowParams)); + _entityTypeMap.Add("WorkflowParticipant", typeof(WorkflowParticipant)); + _entityTypeMap.Add("WorkflowParticipants", typeof(WorkflowParticipant)); + _entityTypeMap.Add("Workflow", typeof(Workflow)); + _entityTypeMap.Add("Workflows", typeof(Workflow)); + _entityTypeMap.Add("SupportFeedback", typeof(SupportFeedback)); + _entityTypeMap.Add("SupportFeedbacks", typeof(SupportFeedback)); _entityTypeMap.Add("AccountZoneUsage", typeof(AccountZoneUsage)); _entityTypeMap.Add("AccountZoneUsages", typeof(AccountZoneUsage)); _entityTypeMap.Add("TenantZoneUsageReport", typeof(TenantZoneUsageReport)); diff --git a/src/ShareFile.Api.Client/Models/ExceptionReason.cs b/src/ShareFile.Api.Client/Models/ExceptionReason.cs index c12660f..30b9b31 100644 --- a/src/ShareFile.Api.Client/Models/ExceptionReason.cs +++ b/src/ShareFile.Api.Client/Models/ExceptionReason.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ExceptionReason + public enum ExceptionReason { Unspecified = 0, FileTooLarge = 1, @@ -29,9 +29,21 @@ public enum ExceptionReason Throttled = 13, EmployeeLicensesExceeded = 14, ClientMustBeCreatedAsEmployee = 15, + + /// + /// Preview is not supported for View-only shares + /// VosPreviewNotAvailable = 16, + + /// + /// View-only permissions are available only for PDFs and Microsoft Office files. + /// UnsupportedVosFileType = 17, ErrorGeneratingPreview = 18, + + /// + /// Checked out files do not support this operation + /// FileIsLocked = 19, ViewLimitReached = 20, DownloadLimitReached = 21, @@ -44,23 +56,112 @@ public enum ExceptionReason UpdateSecurityQuestionError = 28, InvalidPassword = 29, ServiceUnavailable = 30, + + /// + /// View-only permissions are available only for PDFs, Microsoft Office and Image files. + /// UnsupportedVosWithImgFileType = 31, EmailWhitelistViolation = 32, EmailBlacklistViolation = 33, + + /// + /// Default IRM Classification error + /// IrmClassificationError = 34, + + /// + /// File type not supported by IRM + /// UnsupportedIrmFileType = 35, + + /// + /// IRM classification disabled + /// IrmClassificationDisabled = 36, + + /// + /// IRM classification not found + /// IrmClassificationNotFound = 37, + + /// + /// IRM classification with the same name already exists + /// DuplicateIrmClassificationName = 38, + + /// + /// Error accessing customer's Key Management Service + /// KmsError = 39, + + /// + /// Error trying to create new file + /// ErrorCreatingNewFile = 40, + + /// + /// Unsupported filetype for OfficeOnline CreateNewFile + /// UnsupportedCreateNewFileType = 41, + + /// + /// Connectivity failure (timeout, etc) + /// TemporaryConnectivityFailure = 42, + + /// + /// File is inaccessible due to an anti-virus restriction in place on account + /// FilesRestrictedByAntiVirus = 43, + + /// + /// The address on the account is bad. Could not find a corresponding TaxAreaCode + /// BadAddress = 44, + + /// + /// Account is unavailable due to maintenance window + /// MaintenanceMode = 45, + + /// + /// Operation target is invalid + /// InvalidTarget = 46, + + /// + /// Not enough disk space on the zone's storage location + /// InsufficientDiskSpace = 47, - StorageZoneServerError = 48 + + /// + /// A generic error occurred in the Storage Zone + /// + StorageZoneServerError = 48, + + /// + /// A conflict is detected during FileUpload. + /// + FileUploadConflict = 49, + + /// + /// Unlicensed user and must be forced to upgrade as valid user. + /// + UnlicensedUser = 50, + + /// + /// Method not implemented. + /// + MethodNotImplemented = 51, + + /// + /// A user with default zone which is 'Restricted' is not allowed to perform certain operation + /// + UserWithDefaultRestrictedZoneNotAllowed = 52, + + /// + /// Zone is unavailable + /// + ZoneUnavailable = 53 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/Favorite.cs b/src/ShareFile.Api.Client/Models/Favorite.cs new file mode 100644 index 0000000..835c899 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/Favorite.cs @@ -0,0 +1,88 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Class representing an item which has been marked as Favorite + /// + public class Favorite : ODataObject + { + /// + /// Creator of the Favorite + /// + public User User { get; set; } + /// + /// The item which is marked as Favorite + /// + public Item Item { get; set; } + /// + /// The position within the set of Favorite items where this Favorite should be displayed + /// + public int? DisplayPosition { get; set; } + /// + /// The alias name of the Favorite + /// + public string Alias { get; set; } + /// + /// Date when the item was marked favorite + /// + public DateTime? CreationDate { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as Favorite; + if(typedSource != null) + { + User = typedSource.User; + Item = typedSource.Item; + DisplayPosition = typedSource.DisplayPosition; + Alias = typedSource.Alias; + CreationDate = typedSource.CreationDate; + } + else + { + JToken token; + if(source.TryGetProperty("User", out token) && token.Type != JTokenType.Null) + { + User = (User)serializer.Deserialize(token.CreateReader(), typeof(User)); + } + if(source.TryGetProperty("Item", out token) && token.Type != JTokenType.Null) + { + Item = (Item)serializer.Deserialize(token.CreateReader(), typeof(Item)); + } + if(source.TryGetProperty("DisplayPosition", out token) && token.Type != JTokenType.Null) + { + DisplayPosition = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("Alias", out token) && token.Type != JTokenType.Null) + { + Alias = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("CreationDate", out token) && token.Type != JTokenType.Null) + { + CreationDate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/FavoriteFolder.cs b/src/ShareFile.Api.Client/Models/FavoriteFolder.cs index 653eb7f..13188e8 100644 --- a/src/ShareFile.Api.Client/Models/FavoriteFolder.cs +++ b/src/ShareFile.Api.Client/Models/FavoriteFolder.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,29 +17,22 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class FavoriteFolder : ODataObject { - public User User { get; set; } - public Item Folder { get; set; } - public int? SortOrder { get; set; } - public string FolderAlias { get; set; } - + /// + /// Name of the favorite folder + /// public string FolderName { get; set; } - public string Path { get; set; } - public long? FileSize { get; set; } - public DateTime? CreationDate { get; set; } - public string CreatorFirstName { get; set; } - public string CreatorLastName { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/File.cs b/src/ShareFile.Api.Client/Models/File.cs index 6344e1a..8de4255 100644 --- a/src/ShareFile.Api.Client/Models/File.cs +++ b/src/ShareFile.Api.Client/Models/File.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,29 +17,56 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// File represent a ShareFile File object. File is a subclass of Item. It is + /// not a container - it cannot contain other files. + /// public class File : Item { - + /// + /// Represents the Object Storage Identifier for this File. This field is + /// used in Object Storage providers - including sharefile.com and Storage Zones. Other + /// providers like CIFS and SharePoint do not need external references for object + /// blobs and do not populate this field. + /// public string FilePath { get; set; } - + /// + /// MD5 Hash of the File contents. + /// public string Hash { get; set; } - + /// + /// Indicates that the File has an image Preview. + /// public bool? HasPreview { get; set; } - + /// + /// Current Anti-Virus scanning status for this file + /// public SafeEnum VirusStatus { get; set; } - + /// + /// Data Loss Prevention information for this file. + /// public ItemDlpInfo DlpInfo { get; set; } - + /// + /// Effective Access Control permissions for this file + /// public ItemInfo Info { get; set; } - + /// + /// Indicates the user that has locked the file + /// public User LockedBy { get; set; } - + /// + /// File lock info + /// public FileLock FileLockInfo { get; set; } - + /// + /// File version. + /// public float? Version { get; set; } - + /// + /// Electronic signature object associated with this item + /// public ESignature ESignatureDocument { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/FileAndFolderPolicy.cs b/src/ShareFile.Api.Client/Models/FileAndFolderPolicy.cs index 20e79ec..d02bd9d 100644 --- a/src/ShareFile.Api.Client/Models/FileAndFolderPolicy.cs +++ b/src/ShareFile.Api.Client/Models/FileAndFolderPolicy.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,16 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a File and Folder Category Policy definition for use within ShareFile's Policy Based Administration + /// public class FileAndFolderPolicy : Policy { - + /// + /// The settings managed for this Policy + /// public FileAndFolderSettings Settings { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/FileAndFolderSettingOptions.cs b/src/ShareFile.Api.Client/Models/FileAndFolderSettingOptions.cs new file mode 100644 index 0000000..8d1c92e --- /dev/null +++ b/src/ShareFile.Api.Client/Models/FileAndFolderSettingOptions.cs @@ -0,0 +1,89 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Represents the options applicable to a File and Folder Setting definition for a File and Folder Policy. + /// This setting can either be locked to users with a default value or allow users to select from a range. + /// + public class FileAndFolderSettingOptions : ODataObject + { + /// + /// Represents the setting option type selected: Locked or Range + /// + public bool? LockedSelection { get; set; } + /// + /// Default value for the locked setting option + /// + public int? LockedDefault { get; set; } + /// + /// Maximum value for the range setting option + /// + public int? RangeMax { get; set; } + /// + /// Minimum value for the range setting option + /// + public int? RangeMin { get; set; } + /// + /// Default value for the range setting option + /// + public int? RangeDefault { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as FileAndFolderSettingOptions; + if(typedSource != null) + { + LockedSelection = typedSource.LockedSelection; + LockedDefault = typedSource.LockedDefault; + RangeMax = typedSource.RangeMax; + RangeMin = typedSource.RangeMin; + RangeDefault = typedSource.RangeDefault; + } + else + { + JToken token; + if(source.TryGetProperty("LockedSelection", out token) && token.Type != JTokenType.Null) + { + LockedSelection = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("LockedDefault", out token) && token.Type != JTokenType.Null) + { + LockedDefault = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("RangeMax", out token) && token.Type != JTokenType.Null) + { + RangeMax = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("RangeMin", out token) && token.Type != JTokenType.Null) + { + RangeMin = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("RangeDefault", out token) && token.Type != JTokenType.Null) + { + RangeDefault = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/FileAndFolderSettings.cs b/src/ShareFile.Api.Client/Models/FileAndFolderSettings.cs index 10f832d..4edab96 100644 --- a/src/ShareFile.Api.Client/Models/FileAndFolderSettings.cs +++ b/src/ShareFile.Api.Client/Models/FileAndFolderSettings.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,12 +17,18 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents the settings applicable to a File and Folder Category Policy definition for use within ShareFile's Policy Based Administration + /// public class FileAndFolderSettings : ODataObject { - public int? QuotaLimitInGB { get; set; } + public bool? CanEditFolderExpirationDate { get; set; } + public bool? CanEditFolderVersioning { get; set; } + public FileAndFolderSettingOptions FileRetention { get; set; } + public FileAndFolderSettingOptions FileMaxVersion { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -33,6 +39,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) if(typedSource != null) { QuotaLimitInGB = typedSource.QuotaLimitInGB; + CanEditFolderExpirationDate = typedSource.CanEditFolderExpirationDate; + CanEditFolderVersioning = typedSource.CanEditFolderVersioning; + FileRetention = typedSource.FileRetention; + FileMaxVersion = typedSource.FileMaxVersion; } else { @@ -41,6 +51,22 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { QuotaLimitInGB = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); } + if(source.TryGetProperty("CanEditFolderExpirationDate", out token) && token.Type != JTokenType.Null) + { + CanEditFolderExpirationDate = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("CanEditFolderVersioning", out token) && token.Type != JTokenType.Null) + { + CanEditFolderVersioning = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("FileRetention", out token) && token.Type != JTokenType.Null) + { + FileRetention = (FileAndFolderSettingOptions)serializer.Deserialize(token.CreateReader(), typeof(FileAndFolderSettingOptions)); + } + if(source.TryGetProperty("FileMaxVersion", out token) && token.Type != JTokenType.Null) + { + FileMaxVersion = (FileAndFolderSettingOptions)serializer.Deserialize(token.CreateReader(), typeof(FileAndFolderSettingOptions)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/FileLock.cs b/src/ShareFile.Api.Client/Models/FileLock.cs index 8c0d90a..4c91ccb 100644 --- a/src/ShareFile.Api.Client/Models/FileLock.cs +++ b/src/ShareFile.Api.Client/Models/FileLock.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,27 +17,26 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { #if !ShareFile + /// + /// FileLock + /// public class FileLock : ODataObject { - /// /// Lock Id /// public string LockId { get; set; } - /// /// User who owns the Lock /// public Principal Owner { get; set; } - /// /// Expiration time in minutes. /// public int? ExpirationTimeInMinutes { get; set; } - /// /// Expiration date. Takes precedence over ExpirationTimeInMinutes if both are provided /// diff --git a/src/ShareFile.Api.Client/Models/FileVirusStatus.cs b/src/ShareFile.Api.Client/Models/FileVirusStatus.cs index 38960ad..be98aee 100644 --- a/src/ShareFile.Api.Client/Models/FileVirusStatus.cs +++ b/src/ShareFile.Api.Client/Models/FileVirusStatus.cs @@ -5,16 +5,32 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum FileVirusStatus + + /// + /// Enumeration for Virus Scan status of an Item. + /// + public enum FileVirusStatus { + + /// + /// File was scanned and an A/V warning was received + /// VirusWarning = -1, + + /// + /// File has not been scanned yet + /// NotScanned = 0, + + /// + /// File was scanned and no viruses were found + /// Clean = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/FindSubdomainParams.cs b/src/ShareFile.Api.Client/Models/FindSubdomainParams.cs index 73ee500..1c30f90 100644 --- a/src/ShareFile.Api.Client/Models/FindSubdomainParams.cs +++ b/src/ShareFile.Api.Client/Models/FindSubdomainParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Request model for looking up valid subdomains for a user. + /// public class FindSubdomainParams : ODataObject { - /// /// Short reprepsetnation of the username /// public string UsernameShort { get; set; } - /// /// User password /// public string Password { get; set; } - /// /// Constrains request to accounts on which the user is an employee. /// diff --git a/src/ShareFile.Api.Client/Models/FindSubdomainResult.cs b/src/ShareFile.Api.Client/Models/FindSubdomainResult.cs index 8b4b4f7..ae24eb6 100644 --- a/src/ShareFile.Api.Client/Models/FindSubdomainResult.cs +++ b/src/ShareFile.Api.Client/Models/FindSubdomainResult.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,31 +17,29 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents an account with which a user is associated. + /// public class FindSubdomainResult : ODataObject { - /// /// UserId /// public string UserID { get; set; } - /// /// Email /// public string Email { get; set; } - /// /// AcocuntId /// public string AccountID { get; set; } - /// /// Company name /// public string CompanyName { get; set; } - /// /// Primary subdomain for the account. /// diff --git a/src/ShareFile.Api.Client/Models/Folder.cs b/src/ShareFile.Api.Client/Models/Folder.cs index 529b227..b7a4eb7 100644 --- a/src/ShareFile.Api.Client/Models/Folder.cs +++ b/src/ShareFile.Api.Client/Models/Folder.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,24 +17,40 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { #if !ShareFile + /// + /// Represents a ShareFile Folder container. Folder is a subclass of Item. A Folder + /// contains a list of Children. + /// public class Folder : Item { - + /// + /// Number of Items defined under this Folder, including sub-folder counts. + /// public int? FileCount { get; set; } - + /// + /// List of Children defined under this folder. + /// public IEnumerable Children { get; set; } - + /// + /// Defines whether the request to retreive Children is to be navigated to a remote endpoint. + /// public bool? HasRemoteChildren { get; set; } - + /// + /// Effective Access Control Permissions for this Folder + /// public ItemInfo Info { get; set; } - + /// + /// Redirection endpoint for this Item. + /// public Redirection Redirection { get; set; } - + /// + /// Favorite Folder object associated to this item + /// (This property would be deprecated in favor of the new 'Favorite' property under Item) + /// public FavoriteFolder FavoriteFolder { get; set; } - public SafeEnum ZoneService { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/FolderInvite.cs b/src/ShareFile.Api.Client/Models/FolderInvite.cs index 2c19234..82789ff 100644 --- a/src/ShareFile.Api.Client/Models/FolderInvite.cs +++ b/src/ShareFile.Api.Client/Models/FolderInvite.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,111 +17,93 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// This class represents options available in a Folder Invite such as whether the recipient can download, upload, view and get notifications etc. + /// public class FolderInvite : ODataObject { - /// /// Title of the folder invite /// public string Title { get; set; } - /// /// Short description for the folder invite /// public string Description { get; set; } - /// /// Date when the folder invititation was created. /// public DateTime? CreationDate { get; set; } - /// /// Expiration date of the folder invite. /// public DateTime? ExpirationDate { get; set; } - /// /// Unique identifier for the Creator of the folder invite. /// public string CreatorId { get; set; } - /// /// Short version of items creator's name. E.g., J. Doe. /// public string CreatorNameShort { get; set; } - /// /// AccountId of the folder invite. /// public string AccountId { get; set; } - /// /// Maxixmum registrations allowed for the folder invite. /// public int? MaxRegistrations { get; set; } - /// /// Total registrations on the the folder invite. /// public int? TotalRegistrations { get; set; } - /// /// Notify the creator when a user registers for the folder. /// public bool? NotifyCreatorOnRegistration { get; set; } - /// /// Unique identifier of the folder whose invite has been created or edited /// public string FolderId { get; set; } - /// /// Indicates whether the recipient of the invite can download files from the folder. /// public bool? CanDownload { get; set; } - /// /// Indicates whether the recipient of the invite can view files of the folder. /// public bool? CanView { get; set; } - /// /// Indicates whether the recipient of the invite can upload files to the folder. /// public bool? CanUpload { get; set; } - /// /// Indicates whether the recipient of the invite can delete files from the folder. /// public bool? CanDelete { get; set; } - /// /// Indicates whether the recipient of the invite can get notified when uploding files to the folder. /// public bool? NotifyOnUpload { get; set; } - /// /// Indicates whether the recipient of the invite can get notified when downloading files from the folder. /// public bool? NotifyOnDownload { get; set; } - /// /// Url that redirects the user to registration page. /// public string InviteUrl { get; set; } - /// /// User exists. /// public bool? IsExistingUser { get; set; } - /// /// User exists and already confirmed. /// public bool? IsConfirmed { get; set; } - /// /// Has exceeded Maximum failed attempts. /// diff --git a/src/ShareFile.Api.Client/Models/FolderOption.cs b/src/ShareFile.Api.Client/Models/FolderOption.cs index e4a9e46..578eec4 100644 --- a/src/ShareFile.Api.Client/Models/FolderOption.cs +++ b/src/ShareFile.Api.Client/Models/FolderOption.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum FolderOption + public enum FolderOption { ForcedSort = 0, ForcedThumbnails = 1, @@ -22,4 +22,4 @@ public enum FolderOption EnableWatermarkedDownloads = 6, MaxVersions = 7 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/FolderTemplate.cs b/src/ShareFile.Api.Client/Models/FolderTemplate.cs index d68216a..1a9746c 100644 --- a/src/ShareFile.Api.Client/Models/FolderTemplate.cs +++ b/src/ShareFile.Api.Client/Models/FolderTemplate.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,17 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class FolderTemplate : ODataObject { - public string Name { get; set; } - public string Description { get; set; } - public User Creator { get; set; } - public IEnumerable Items { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/FolderTemplateItem.cs b/src/ShareFile.Api.Client/Models/FolderTemplateItem.cs index 28e5c47..b02edd6 100644 --- a/src/ShareFile.Api.Client/Models/FolderTemplateItem.cs +++ b/src/ShareFile.Api.Client/Models/FolderTemplateItem.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,15 +17,12 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class FolderTemplateItem : ODataObject { - public string Name { get; set; } - public string Description { get; set; } - public IEnumerable Items { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ForbiddenOAuthClientNameWords.cs b/src/ShareFile.Api.Client/Models/ForbiddenOAuthClientNameWords.cs new file mode 100644 index 0000000..3814387 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ForbiddenOAuthClientNameWords.cs @@ -0,0 +1,49 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// ForbiddenOAuthClientNameWords + /// + public class ForbiddenOAuthClientNameWords : ODataObject + { + public IEnumerable Words { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as ForbiddenOAuthClientNameWords; + if(typedSource != null) + { + Words = typedSource.Words; + } + else + { + JToken token; + if(source.TryGetProperty("Words", out token) && token.Type != JTokenType.Null) + { + Words = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/GenericConfig.cs b/src/ShareFile.Api.Client/Models/GenericConfig.cs index e20bdc4..06d37d6 100644 --- a/src/ShareFile.Api.Client/Models/GenericConfig.cs +++ b/src/ShareFile.Api.Client/Models/GenericConfig.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,15 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class GenericConfig : ODataObject { - public User User { get; set; } - public string ConfigName { get; set; } - public int? ConfigSize { get; set; } - public DateTime? CreationDate { get; set; } - public DateTime? ModifiedDate { get; set; } - public string Config { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Group.cs b/src/ShareFile.Api.Client/Models/Group.cs index 98fd9fc..46aba8c 100644 --- a/src/ShareFile.Api.Client/Models/Group.cs +++ b/src/ShareFile.Api.Client/Models/Group.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,17 +17,32 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Distribution Group + /// public class Group : Principal { - + /// + /// The group's owner + /// public User Owner { get; set; } - + /// + /// Account + /// public Account Account { get; set; } - + /// + /// Whether this group is public + /// public bool? IsShared { get; set; } - + /// + /// Number of group contacts + /// + public int? NumberOfContacts { get; set; } + /// + /// List of group contacts + /// public IEnumerable Contacts { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) @@ -41,6 +56,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) Owner = typedSource.Owner; Account = typedSource.Account; IsShared = typedSource.IsShared; + NumberOfContacts = typedSource.NumberOfContacts; Contacts = typedSource.Contacts; } else @@ -58,6 +74,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { IsShared = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } + if(source.TryGetProperty("NumberOfContacts", out token) && token.Type != JTokenType.Null) + { + NumberOfContacts = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } if(source.TryGetProperty("Contacts", out token) && token.Type != JTokenType.Null) { Contacts = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); diff --git a/src/ShareFile.Api.Client/Models/Image32Action.cs b/src/ShareFile.Api.Client/Models/Image32Action.cs index 951fb8d..e5b5ea3 100644 --- a/src/ShareFile.Api.Client/Models/Image32Action.cs +++ b/src/ShareFile.Api.Client/Models/Image32Action.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum Image32Action + public enum Image32Action { View = 0, ViewThumbnail = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/InboxMetadata.cs b/src/ShareFile.Api.Client/Models/InboxMetadata.cs index 381e4b8..9790579 100644 --- a/src/ShareFile.Api.Client/Models/InboxMetadata.cs +++ b/src/ShareFile.Api.Client/Models/InboxMetadata.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,13 +17,14 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// InboxMetadata contains metadata of the inbox for a user. + /// public class InboxMetadata : ODataObject { - public int UnreadSendUnarchived { get; set; } - public int UnreadRequestUnarchived { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Industry.cs b/src/ShareFile.Api.Client/Models/Industry.cs index b99bc01..5af2dc8 100644 --- a/src/ShareFile.Api.Client/Models/Industry.cs +++ b/src/ShareFile.Api.Client/Models/Industry.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,10 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class Industry : ODataObject { - public string Name { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/IntegrationProvider.cs b/src/ShareFile.Api.Client/Models/IntegrationProvider.cs index 49d52e3..c3915b3 100644 --- a/src/ShareFile.Api.Client/Models/IntegrationProvider.cs +++ b/src/ShareFile.Api.Client/Models/IntegrationProvider.cs @@ -5,18 +5,19 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum IntegrationProvider + public enum IntegrationProvider { RightSignature = 0, RightSignature4 = 1, DocumentApprovalWorkflow = 2, Image32 = 3, - ContentViewer = 4 + ContentViewer = 4, + ThirdPartyCloudSyncService = 5 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/IrmClassification.cs b/src/ShareFile.Api.Client/Models/IrmClassification.cs index ac19b88..f5e0b9b 100644 --- a/src/ShareFile.Api.Client/Models/IrmClassification.cs +++ b/src/ShareFile.Api.Client/Models/IrmClassification.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,32 +17,30 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents Irm Classification. ShareFile Admin can define properties on this Irm Classification. + /// public class IrmClassification : ODataObject { - /// /// Name of the Irm Classification /// public string Name { get; set; } - /// /// Description of the Irm Classification if any /// public string Description { get; set; } - /// /// AccessRight permissions on an IRM Classification /// public IrmPrimaryAccessRightParams PrimaryAccessRightParams { get; set; } - /// /// Use this flag to enable/ disable the Irm Classification. /// If disabled, this Irm Classification won't show up in the List of active IrmClassifications on an account. /// public bool? IsEnabled { get; set; } - /// /// Defines the numner of days after which the user won't be access the documents protected with this classification. /// diff --git a/src/ShareFile.Api.Client/Models/IrmPrimaryAccessRightParams.cs b/src/ShareFile.Api.Client/Models/IrmPrimaryAccessRightParams.cs index 13ffeb0..c07d2c1 100644 --- a/src/ShareFile.Api.Client/Models/IrmPrimaryAccessRightParams.cs +++ b/src/ShareFile.Api.Client/Models/IrmPrimaryAccessRightParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,51 +17,45 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents AccessRight permissions on an IRM Classification + /// public class IrmPrimaryAccessRightParams : ODataObject { - /// /// Allows user to view the documents /// public bool? View { get; set; } - /// /// Allows user to use LightViewer client to view the documents /// public bool? LightViewer { get; set; } - /// /// Allows user to print the documents /// public bool? Print { get; set; } - /// /// Allows user to edit the documents /// public bool? Edit { get; set; } - /// /// Allows user to have full control over the document. /// public bool? FullControl { get; set; } - /// /// Allows user to copy the content into clipboard from the document. /// public bool? CopyData { get; set; } - /// /// Allows user to use native screen capture tools. /// public bool? ScreenCapture { get; set; } - /// /// Allows user to run macros. User cannot even view a macro file if this access right is set to false. /// public bool? Macro { get; set; } - /// /// Allows user to access the documents offline /// diff --git a/src/ShareFile.Api.Client/Models/Item.cs b/src/ShareFile.Api.Client/Models/Item.cs index 045b946..5ed3c30 100644 --- a/src/ShareFile.Api.Client/Models/Item.cs +++ b/src/ShareFile.Api.Client/Models/Item.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,88 +17,193 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { #if !ShareFile + /// + /// Represents a ShareFile Item: an element that can exist inside a ShareFile Folder. + /// This include Files and Folders, as well as other classes that are listed inside + /// directory structures: Links, Notes and Symbolic Links. + /// public class Item : ODataObject { - + /// + /// Item Name + /// public string Name { get; set; } - + /// + /// Item File Name. ShareFile allows Items to have different Display and File names: display + /// names are shown during client navigation, while file names are used when the item is + /// downloaded. + /// public string FileName { get; set; } - + /// + /// User that Created this Item + /// public User Creator { get; set; } - + /// + /// Parent container of the Item. A container is usually a Folder object, with a few exceptions - + /// the "Account" is the container of top-level folders. + /// public Item Parent { get; set; } - + /// + /// List of Access Controls for this Item. This is not the effective ACL on the Item, just the + /// ACLs directly attached to this Item. Use the "Info" reference to retrieve effective ACL + /// public IEnumerable AccessControls { get; set; } - + /// + /// The Storage Zone that contains this Item. + /// public Zone Zone { get; set; } - + /// + /// Item Creation Date. + /// public DateTime? CreationDate { get; set; } - + /// + /// The last modified date of this item and all of its children, recursively. This parameter + /// is not supported in all ShareFile providers - it is always set in sharefile.com hosting, but + /// not in some StorageZone connectors. The Capability object of the provider indicates whether + /// the provider supports this field or not. + /// public DateTime? ProgenyEditDate { get; set; } - + /// + /// Client device filesystem Created Date of this Item. + /// public DateTime? ClientCreatedDate { get; set; } - + /// + /// Client device filesystem last Modified Date of this Item. + /// public DateTime? ClientModifiedDate { get; set; } - + /// + /// Defines the Retention Policy for this Item. After this date, the item is automatically moved + /// to recycle bin. + /// public DateTime? ExpirationDate { get; set; } - + /// + /// Item description + /// public string Description { get; set; } - + /// + /// Disk space limit for the Item. Define the maximum amount of bytes that this container can + /// hold at any given time. + /// public int? DiskSpaceLimit { get; set; } - + /// + /// Defines whether the Item has a 'hidden' flag. + /// public bool? IsHidden { get; set; } - + /// + /// Bandwidth limit for the Item. Define the maximum amount of bytes that can be added and + /// retrieved from this item. + /// public int? BandwidthLimitInMB { get; set; } - + /// + /// User Owner of this Item. + /// public User Owner { get; set; } - /// - /// Configuration for the current ShareFile account in regards to this status provider + /// ShareFile Account containing this item. /// public Account Account { get; set; } - + /// + /// Item size in Kilobytes. For containers, this field includes all children sizes, recursively. + /// public int? FileSizeInKB { get; set; } - + /// + /// Contains a ItemID path, separated by /, from the virtual root to this given file. Example + /// /accountID/folderID/folderID/itemID + /// public string Path { get; set; } - + /// + /// First name of the user that created this item + /// public string CreatorFirstName { get; set; } - + /// + /// Last name of the user that created this item + /// public string CreatorLastName { get; set; } - + /// + /// Amount of days until this item expireses (see ExpirationDate) + /// public int? ExpirationDays { get; set; } - + /// + /// Item size in bytes. For containers, this field will include all children sizes, recursively. + /// public long? FileSizeBytes { get; set; } - + /// + /// Indicates whether a preview image is available for this Item. + /// + /// ShareFile.com always create previews for known file types, although there is a delay from the file + /// creation until the preview is available. Some Storage Zones Providers do not create previews, depending + /// on version and deployment options. + /// + /// Previews are not created for unknown file types + /// public SafeEnum PreviewStatus { get; set; } - + /// + /// Indicates a list of PreviewPlatforms supported for this item. + /// public IEnumerable PreviewPlatformsSupported { get; set; } - + /// + /// Indicates a list of EditingPlatforms supported for this item. + /// public IEnumerable EditingPlatformsSupported { get; set; } - public int? MaxPreviewSize { get; set; } - + /// + /// Indicates that the Item is pending for removal. At the next execution of the Cleanup process, the data + /// blob associated with this item will be removed. This parameter is not used for certain Storage Zone + /// Providers. For example, in CIFS and SharePoint connectors, removals are performed imediately. The + /// Capability "HasRecycleBin" indicates whether this field is used or not in the provider. + /// public bool? HasPendingDeletion { get; set; } - + /// + /// Folder Template reference. If set, it indicates that this Item was created from a Folder Template. Modifications + /// to the folder template are propagated to the associated items. + /// + /// The Capability FolderTemplate indicates whether the provider supports Folder Templates. + /// public string AssociatedFolderTemplateID { get; set; } - + /// + /// Indicates whether the item is owned by a Folder Template. If set, it indicates that this Item was created from a + /// Folder Template. Modifications to the folder template are propagated to the associated items. + /// + /// The Capability FolderTemplate indicates whether the provider supports Folder Templates. + /// public bool? IsTemplateOwned { get; set; } - public bool? HasPermissionInfo { get; set; } - public int? State { get; set; } - + /// + /// Identifier for the Item stream. An Item represents a single version of a file system object. The stream identifies + /// all versions of the same file system object. For example, when users upload or modify an existing file, a new Item + /// is created with the same StreamID. All Item enumerations return only the latest version of a given stream. You can + /// access the previous versions of a file using the StreamID reference. + /// public string StreamID { get; set; } - + /// + /// Short version of items creator's name. E.g., J. Doe. + /// public string CreatorNameShort { get; set; } - + /// + /// Specifies whether there are other versions of this item. Not all providers support file versioning. The + /// Capability FileVersioning indicates whether the provider supports file versions. + /// public bool? HasMultipleVersions { get; set; } - + /// + /// Specifies whether or not an Item has a pending async operation. + /// public bool? HasPendingAsyncOp { get; set; } - + /// + /// List of custom metadata object associated with this item + /// public IEnumerable Metadata { get; set; } + /// + /// Favorite item object associated with the item + /// + public Favorite Favorite { get; set; } + /// + /// Item Path using Folder names + /// + public string SemanticPath { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -145,6 +250,8 @@ public override void Copy(ODataObject source, JsonSerializer serializer) HasMultipleVersions = typedSource.HasMultipleVersions; HasPendingAsyncOp = typedSource.HasPendingAsyncOp; Metadata = typedSource.Metadata; + Favorite = typedSource.Favorite; + SemanticPath = typedSource.SemanticPath; } else { @@ -297,6 +404,14 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { Metadata = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); } + if(source.TryGetProperty("Favorite", out token) && token.Type != JTokenType.Null) + { + Favorite = (Favorite)serializer.Deserialize(token.CreateReader(), typeof(Favorite)); + } + if(source.TryGetProperty("SemanticPath", out token) && token.Type != JTokenType.Null) + { + SemanticPath = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/ItemAction.cs b/src/ShareFile.Api.Client/Models/ItemAction.cs index 8f19570..82a6a59 100644 --- a/src/ShareFile.Api.Client/Models/ItemAction.cs +++ b/src/ShareFile.Api.Client/Models/ItemAction.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ItemAction + public enum ItemAction { Download = 0, Upload = 1, @@ -47,4 +47,4 @@ public enum ItemAction Document_Edit = 31, Item_Archive = 32 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ItemDlpInfo.cs b/src/ShareFile.Api.Client/Models/ItemDlpInfo.cs index 8be431e..7b8bb7e 100644 --- a/src/ShareFile.Api.Client/Models/ItemDlpInfo.cs +++ b/src/ShareFile.Api.Client/Models/ItemDlpInfo.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Data Loss Prevention information for a specific Item. + /// public class ItemDlpInfo : ODataObject { - /// /// File scan status /// diff --git a/src/ShareFile.Api.Client/Models/ItemInfo.cs b/src/ShareFile.Api.Client/Models/ItemInfo.cs index f957ec4..2761f9b 100644 --- a/src/ShareFile.Api.Client/Models/ItemInfo.cs +++ b/src/ShareFile.Api.Client/Models/ItemInfo.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,91 +17,61 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ItemInfo : ODataObject { - public AccessControl CurrentAccessControl { get; set; } - public bool? HasVroot { get; set; } - public bool? IsSystemRoot { get; set; } - public bool? IsAccountRoot { get; set; } - public bool? IsVRoot { get; set; } - public bool? IsMyFolders { get; set; } - public bool? IsAHomeFolder { get; set; } - public bool? IsMyHomeFolder { get; set; } - public bool? IsAStartFolder { get; set; } - public bool? IsSharedFolder { get; set; } - public bool? IsPassthrough { get; set; } - public bool? IsVersioned { get; set; } - public bool? CanAddFolder { get; set; } - public bool? CanAddNode { get; set; } - public bool? CanView { get; set; } - public bool? CanDownload { get; set; } - public bool? CanWatermarkDownload { get; set; } - public bool? CanDocViewerPrint { get; set; } - public bool? CanUpload { get; set; } - public bool? CanSend { get; set; } - public bool? CanDeleteCurrentItem { get; set; } - public bool? CanDeleteChildItems { get; set; } - public bool? CanManagePermissions { get; set; } - public bool? CanEditFolderOpts { get; set; } - + /// + /// Indicates whether the current user has permission to change folder retention policies (ExpirationDays) + /// public bool? CanEditRetentionPolicy { get; set; } - + public bool? CanEditFolderExpirationDays { get; set; } + public bool? CanEditFolderExpirationDate { get; set; } + public bool? CanEditFolderMaxVersions { get; set; } + public bool? CanEditFolderVersioning { get; set; } + public bool? CanCreateOfficeDocuments { get; set; } public string FolderPayID { get; set; } - public bool? ShowFolderPayBuyButton { get; set; } - public SafeEnum TreeMode { get; set; } - public SafeEnum Versioning { get; set; } - public bool? TreeModeOperationAllowed { get; set; } - public string TreeModeSourceId { get; set; } - public SafeEnum ForcedSortField { get; set; } - public SafeEnum ForcedSortOrder { get; set; } - public int? MaxVersions { get; set; } - public SafeEnum DocumentViewerPrinting { get; set; } - public SafeEnum WatermarkedDownloads { get; set; } - public IEnumerable> OptionPropagation { get; set; } - public string ViewOnlyWatermarkText { get; set; } - public SafeEnum SortField { get; set; } - public SafeEnum SortDirection { get; set; } - + /// + /// Info on a folder to create a request list bundle + /// public bool? CanCreateRequestList { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) @@ -137,6 +107,11 @@ public override void Copy(ODataObject source, JsonSerializer serializer) CanManagePermissions = typedSource.CanManagePermissions; CanEditFolderOpts = typedSource.CanEditFolderOpts; CanEditRetentionPolicy = typedSource.CanEditRetentionPolicy; + CanEditFolderExpirationDays = typedSource.CanEditFolderExpirationDays; + CanEditFolderExpirationDate = typedSource.CanEditFolderExpirationDate; + CanEditFolderMaxVersions = typedSource.CanEditFolderMaxVersions; + CanEditFolderVersioning = typedSource.CanEditFolderVersioning; + CanCreateOfficeDocuments = typedSource.CanCreateOfficeDocuments; FolderPayID = typedSource.FolderPayID; ShowFolderPayBuyButton = typedSource.ShowFolderPayBuyButton; TreeMode = typedSource.TreeMode; @@ -257,6 +232,26 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { CanEditRetentionPolicy = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } + if(source.TryGetProperty("CanEditFolderExpirationDays", out token) && token.Type != JTokenType.Null) + { + CanEditFolderExpirationDays = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("CanEditFolderExpirationDate", out token) && token.Type != JTokenType.Null) + { + CanEditFolderExpirationDate = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("CanEditFolderMaxVersions", out token) && token.Type != JTokenType.Null) + { + CanEditFolderMaxVersions = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("CanEditFolderVersioning", out token) && token.Type != JTokenType.Null) + { + CanEditFolderVersioning = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("CanCreateOfficeDocuments", out token) && token.Type != JTokenType.Null) + { + CanCreateOfficeDocuments = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } if(source.TryGetProperty("FolderPayID", out token) && token.Type != JTokenType.Null) { FolderPayID = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); diff --git a/src/ShareFile.Api.Client/Models/ItemOperations.cs b/src/ShareFile.Api.Client/Models/ItemOperations.cs new file mode 100644 index 0000000..0c46912 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ItemOperations.cs @@ -0,0 +1,38 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +namespace ShareFile.Api.Client.Models +{ + [Flags] + public enum ItemOperations + { + None = 0, + CanDownload = 1, + CanShareEmail = 2, + CanShareLink = 4, + CanDelete = 8, + CanEditMetadata = 16, + CanMove = 32, + CanCopy = 64, + CanEditDocument = 128, + CanSignRS3 = 256, + CanSignRS4 = 512, + CanCheckOut = 1024, + CanCheckIn = 2048, + CanDiscardCheckout = 4096, + CanToggleFavorite = 8192, + CanInitiateApproval = 16384, + CanCreateOfficeDocuments = 32768, + CanUnzipFiles = 65536, + CanPreview = 131072, + CanRequestFiles = 262144 + } +} diff --git a/src/ShareFile.Api.Client/Models/ItemOrderingMode.cs b/src/ShareFile.Api.Client/Models/ItemOrderingMode.cs index a43f8c7..de8f4ba 100644 --- a/src/ShareFile.Api.Client/Models/ItemOrderingMode.cs +++ b/src/ShareFile.Api.Client/Models/ItemOrderingMode.cs @@ -5,16 +5,28 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ItemOrderingMode + public enum ItemOrderingMode { + + /// + /// Default ordering mode is to sort with the folders first if no $orderby is specified, otherwise obey the $orderby exclusively + /// Default = 0, + + /// + /// Sort folders to the top of result set prior to applying any $orderby + /// FoldersFirst = 1, + + /// + /// Sort folders based on the persisted folder sort options. If the folder options call for "UserPreferences", honor $orderby, otherwise override. + /// UseFolderOptions = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ItemProtocolLink.cs b/src/ShareFile.Api.Client/Models/ItemProtocolLink.cs index 6f02e5a..0915e79 100644 --- a/src/ShareFile.Api.Client/Models/ItemProtocolLink.cs +++ b/src/ShareFile.Api.Client/Models/ItemProtocolLink.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,13 +17,11 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ItemProtocolLink : ODataObject { - public string Link { get; set; } - public Redirection Redirection { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Link.cs b/src/ShareFile.Api.Client/Models/Link.cs index 03b3644..3964c9b 100644 --- a/src/ShareFile.Api.Client/Models/Link.cs +++ b/src/ShareFile.Api.Client/Models/Link.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents an URL object that can be added to a ShareFile Folder and shared with + /// other users. + /// + /// Some Storage Zones providers do not support Link objects - for example CIFS providers. The + /// ItemLink Capability indicates whether Links are supported in a provider + /// public class Link : Item { - /// /// Universal Reference Identifier for this Link object /// diff --git a/src/ShareFile.Api.Client/Models/MarketAnalytics.cs b/src/ShareFile.Api.Client/Models/MarketAnalytics.cs index adf39a5..d6b47af 100644 --- a/src/ShareFile.Api.Client/Models/MarketAnalytics.cs +++ b/src/ShareFile.Api.Client/Models/MarketAnalytics.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,17 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class MarketAnalytics : ODataObject { - public decimal? ConversionIndex { get; set; } - public decimal? ConversionIndex2 { get; set; } - public decimal? LtvIndex { get; set; } - public decimal? PlanValue { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Metadata.cs b/src/ShareFile.Api.Client/Models/Metadata.cs index 063d578..7550f3e 100644 --- a/src/ShareFile.Api.Client/Models/Metadata.cs +++ b/src/ShareFile.Api.Client/Models/Metadata.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a custom metadata entry associated with an Item + /// public class Metadata : ODataObject { - /// /// The name of a custom metadata entry /// public string Name { get; set; } - /// /// The value of a custom metadata entry /// public string Value { get; set; } - /// /// Whether the metadata entry is public or private. Used only by the zone or storage center metadata where only zone admins have access to private metadata. /// diff --git a/src/ShareFile.Api.Client/Models/MobileSecuritySettings.cs b/src/ShareFile.Api.Client/Models/MobileSecuritySettings.cs index ea1fdc8..28f519f 100644 --- a/src/ShareFile.Api.Client/Models/MobileSecuritySettings.cs +++ b/src/ShareFile.Api.Client/Models/MobileSecuritySettings.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,29 +17,19 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class MobileSecuritySettings : ODataObject { - public int PoisonPillInterval { get; set; } - public bool? EnableOpenExternal { get; set; } - public bool? EnableOfflineCache { get; set; } - public bool? EnableAutoLogin { get; set; } - public bool? RestrictModifiedDevices { get; set; } - public SafeEnum PinLockType { get; set; } - public int? PinLockMaxAttempts { get; set; } - public int? PinLockLockoutIntervalSeconds { get; set; } - public int? PinLockExternalActionGraceIntervalSeconds { get; set; } - public int? PinLockInternalActionGraceIntervalSeconds { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Note.cs b/src/ShareFile.Api.Client/Models/Note.cs index 460a4c3..2d07e4e 100644 --- a/src/ShareFile.Api.Client/Models/Note.cs +++ b/src/ShareFile.Api.Client/Models/Note.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,8 +17,15 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a Note object that can be added to a ShareFile Folder and shared with + /// other users. + /// + /// Some Storage Zones providers do not support Note objects - for example CIFS providers. The + /// ItemNote Capability indicates whether Notes are supported in a provider + /// public class Note : Item { diff --git a/src/ShareFile.Api.Client/Models/Notification.cs b/src/ShareFile.Api.Client/Models/Notification.cs deleted file mode 100644 index cd1c47d..0000000 --- a/src/ShareFile.Api.Client/Models/Notification.cs +++ /dev/null @@ -1,201 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. -// -// ------------------------------------------------------------------------------ -using System; -using System.Collections.Generic; -using System.Net; - -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.Exceptions; - -namespace ShareFile.Api.Models -{ - public class Notification : ODataObject - { - - public string NotificationType { get; set; } - - public string EventID { get; set; } - - public string SenderID { get; set; } - - public string RecipientID { get; set; } - - public string FromName { get; set; } - - public string FromEmail { get; set; } - - public string ReplyTo { get; set; } - - public string To { get; set; } - - public string CC { get; set; } - - public string BCC { get; set; } - - public string Subject { get; set; } - - public string Message { get; set; } - - public string PlainTextMessage { get; set; } - - public DateTime? DateSent { get; set; } - - public string Status { get; set; } - - public bool? IsImportant { get; set; } - - public bool? ReadReceipt { get; set; } - - public IEnumerable AttachmentPaths { get; set; } - - public bool ForceEmailFromShareFile { get; set; } - - public IEnumerable MergeNames { get; set; } - - public IEnumerable MergeValues { get; set; } - - public bool? RecordSend { get; set; } - - public bool? IsModelBased { get; set; } - - public override void Copy(ODataObject source, JsonSerializer serializer) - { - if(source == null || serializer == null) return; - base.Copy(source, serializer); - - var typedSource = source as Notification; - if(typedSource != null) - { - NotificationType = typedSource.NotificationType; - EventID = typedSource.EventID; - SenderID = typedSource.SenderID; - RecipientID = typedSource.RecipientID; - FromName = typedSource.FromName; - FromEmail = typedSource.FromEmail; - ReplyTo = typedSource.ReplyTo; - To = typedSource.To; - CC = typedSource.CC; - BCC = typedSource.BCC; - Subject = typedSource.Subject; - Message = typedSource.Message; - PlainTextMessage = typedSource.PlainTextMessage; - DateSent = typedSource.DateSent; - Status = typedSource.Status; - IsImportant = typedSource.IsImportant; - ReadReceipt = typedSource.ReadReceipt; - AttachmentPaths = typedSource.AttachmentPaths; - ForceEmailFromShareFile = typedSource.ForceEmailFromShareFile; - MergeNames = typedSource.MergeNames; - MergeValues = typedSource.MergeValues; - RecordSend = typedSource.RecordSend; - IsModelBased = typedSource.IsModelBased; - } - else - { - JToken token; - if(source.TryGetProperty("NotificationType", out token) && token.Type != JTokenType.Null) - { - NotificationType = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("EventID", out token) && token.Type != JTokenType.Null) - { - EventID = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("SenderID", out token) && token.Type != JTokenType.Null) - { - SenderID = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("RecipientID", out token) && token.Type != JTokenType.Null) - { - RecipientID = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("FromName", out token) && token.Type != JTokenType.Null) - { - FromName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("FromEmail", out token) && token.Type != JTokenType.Null) - { - FromEmail = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("ReplyTo", out token) && token.Type != JTokenType.Null) - { - ReplyTo = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("To", out token) && token.Type != JTokenType.Null) - { - To = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("CC", out token) && token.Type != JTokenType.Null) - { - CC = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("BCC", out token) && token.Type != JTokenType.Null) - { - BCC = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("Subject", out token) && token.Type != JTokenType.Null) - { - Subject = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("Message", out token) && token.Type != JTokenType.Null) - { - Message = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("PlainTextMessage", out token) && token.Type != JTokenType.Null) - { - PlainTextMessage = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("DateSent", out token) && token.Type != JTokenType.Null) - { - DateSent = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); - } - if(source.TryGetProperty("Status", out token) && token.Type != JTokenType.Null) - { - Status = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); - } - if(source.TryGetProperty("IsImportant", out token) && token.Type != JTokenType.Null) - { - IsImportant = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); - } - if(source.TryGetProperty("ReadReceipt", out token) && token.Type != JTokenType.Null) - { - ReadReceipt = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); - } - if(source.TryGetProperty("AttachmentPaths", out token) && token.Type != JTokenType.Null) - { - AttachmentPaths = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); - } - if(source.TryGetProperty("ForceEmailFromShareFile", out token) && token.Type != JTokenType.Null) - { - ForceEmailFromShareFile = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); - } - if(source.TryGetProperty("MergeNames", out token) && token.Type != JTokenType.Null) - { - MergeNames = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); - } - if(source.TryGetProperty("MergeValues", out token) && token.Type != JTokenType.Null) - { - MergeValues = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); - } - if(source.TryGetProperty("RecordSend", out token) && token.Type != JTokenType.Null) - { - RecordSend = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); - } - if(source.TryGetProperty("IsModelBased", out token) && token.Type != JTokenType.Null) - { - IsModelBased = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); - } - } - } - } -} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/NotificationLocale.cs b/src/ShareFile.Api.Client/Models/NotificationLocale.cs index 868120b..66b00e3 100644 --- a/src/ShareFile.Api.Client/Models/NotificationLocale.cs +++ b/src/ShareFile.Api.Client/Models/NotificationLocale.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum NotificationLocale + public enum NotificationLocale { Invariant = 0, English = 1, @@ -25,4 +25,4 @@ public enum NotificationLocale Korean = 9, Portuguese = 10 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/NotifyUsersParams.cs b/src/ShareFile.Api.Client/Models/NotifyUsersParams.cs index 41883a5..4acaf97 100644 --- a/src/ShareFile.Api.Client/Models/NotifyUsersParams.cs +++ b/src/ShareFile.Api.Client/Models/NotifyUsersParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,13 +17,11 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class NotifyUsersParams : ODataObject { - public IEnumerable UserIds { get; set; } - public string CustomMessage { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ODataFeed.cs b/src/ShareFile.Api.Client/Models/ODataFeed.cs index a8b74fa..a4766eb 100644 --- a/src/ShareFile.Api.Client/Models/ODataFeed.cs +++ b/src/ShareFile.Api.Client/Models/ODataFeed.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,17 +17,14 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ODataFeed : ODataObject { - [JsonProperty(PropertyName = "odata.count")] public int count { get; set; } - [JsonProperty(PropertyName = "value")] public IEnumerable Feed { get; set; } - [JsonProperty(PropertyName = "odata.nextLink")] public string NextLink { get; set; } diff --git a/src/ShareFile.Api.Client/Models/ODataObject.cs b/src/ShareFile.Api.Client/Models/ODataObject.cs index 8c6d0a6..1cc0ae9 100644 --- a/src/ShareFile.Api.Client/Models/ODataObject.cs +++ b/src/ShareFile.Api.Client/Models/ODataObject.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,25 +17,24 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Base class for v2 Model classes that implement ODATA metadata and deferred links + /// public class ODataObject : object { - /// /// ODATA Metadata information about the model instance /// [JsonProperty(PropertyName = "odata.metadata")] public string MetadataUrl { get; set; } - [JsonProperty(PropertyName = "odata.type")] public string __type { get; set; } - /// /// Object Identifier /// public string Id { get; set; } - public Uri url { get; set; } [JsonExtensionData] diff --git a/src/ShareFile.Api.Client/Models/ODataObjectType.cs b/src/ShareFile.Api.Client/Models/ODataObjectType.cs index 7aab55e..ecf89f4 100644 --- a/src/ShareFile.Api.Client/Models/ODataObjectType.cs +++ b/src/ShareFile.Api.Client/Models/ODataObjectType.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ODataObjectType + public enum ODataObjectType { ComplexType = 0, Entity = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/OutlookInformation.cs b/src/ShareFile.Api.Client/Models/OutlookInformation.cs index d6834ba..1bd4264 100644 --- a/src/ShareFile.Api.Client/Models/OutlookInformation.cs +++ b/src/ShareFile.Api.Client/Models/OutlookInformation.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,86 +17,73 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Settings used by the ShareFile Outlook Plugin. + /// public class OutlookInformation : ODataObject { - /// /// DownloadInfo Level /// public OutlookInformationOptionString DownloadInfoLevel { get; set; } - /// /// UploadInfo Level /// public OutlookInformationOptionString UploadInfoLevel { get; set; } - /// /// Notify on download of Share /// public OutlookInformationOptionBool NotifyOnDownload { get; set; } - /// /// Notify on upload of Share /// public OutlookInformationOptionBool NotifyOnUpload { get; set; } - /// /// Max downloads /// public OutlookInformationOptionInt MaxDownloads { get; set; } - /// /// Link expiration /// public OutlookInformationOptionString LinkExpiration { get; set; } - /// /// Default text when requesting files /// public OutlookInformationOptionString RequestText { get; set; } - /// /// Default text when sending files /// public OutlookInformationOptionString SendText { get; set; } - /// /// Banner HTML /// public OutlookInformationOptionString BannerHTML { get; set; } - /// /// Use banner /// public OutlookInformationOptionBool UseBanner { get; set; } - /// /// Auto convert /// public OutlookInformationOptionBool AutoConvert { get; set; } - /// /// Auto convert /// public OutlookInformationOptionInt ConvertAbove { get; set; } - /// /// Attach paperclip /// public OutlookInformationOptionBool AttachPaperclip { get; set; } - /// /// Encrypted Email Recipient Verification /// public OutlookInformationOptionString EncryptedEmailRecipientVerification { get; set; } - /// /// Default Encrypted Email Expiration /// public OutlookInformationOptionString EncryptedEmailExpiration { get; set; } - /// /// Default Encrypted Email Notify on Read /// diff --git a/src/ShareFile.Api.Client/Models/OutlookInformationOptionBool.cs b/src/ShareFile.Api.Client/Models/OutlookInformationOptionBool.cs index 1b498ab..8547cda 100644 --- a/src/ShareFile.Api.Client/Models/OutlookInformationOptionBool.cs +++ b/src/ShareFile.Api.Client/Models/OutlookInformationOptionBool.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// OutlookInformationOptionBool + /// public class OutlookInformationOptionBool : ODataObject { - /// /// Setting is locked. /// public bool Locked { get; set; } - /// /// Value /// diff --git a/src/ShareFile.Api.Client/Models/OutlookInformationOptionInt.cs b/src/ShareFile.Api.Client/Models/OutlookInformationOptionInt.cs index 202769b..edf34ba 100644 --- a/src/ShareFile.Api.Client/Models/OutlookInformationOptionInt.cs +++ b/src/ShareFile.Api.Client/Models/OutlookInformationOptionInt.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// OutlookInformationOptionInt + /// public class OutlookInformationOptionInt : ODataObject { - /// /// Setting is locked. /// public bool Locked { get; set; } - /// /// Value /// diff --git a/src/ShareFile.Api.Client/Models/OutlookInformationOptionString.cs b/src/ShareFile.Api.Client/Models/OutlookInformationOptionString.cs index b2bdf50..bb82f1a 100644 --- a/src/ShareFile.Api.Client/Models/OutlookInformationOptionString.cs +++ b/src/ShareFile.Api.Client/Models/OutlookInformationOptionString.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// OutlookInformationOptionString + /// public class OutlookInformationOptionString : ODataObject { - /// /// Setting is locked. /// public bool Locked { get; set; } - /// /// Value /// diff --git a/src/ShareFile.Api.Client/Models/PasswordPolicy.cs b/src/ShareFile.Api.Client/Models/PasswordPolicy.cs index c55c276..4f3f48e 100644 --- a/src/ShareFile.Api.Client/Models/PasswordPolicy.cs +++ b/src/ShareFile.Api.Client/Models/PasswordPolicy.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,55 +17,49 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// The password policy for the Account, specifying password strength, age, and reuse policies. + /// public class PasswordPolicy : ODataObject { - /// /// Number of days a password is allowed to be used before being required to change it. /// public int? MaxAgeDays { get; set; } - /// /// The number of previously used passwords to disallow when a user updates their password. /// public int? HistoryCount { get; set; } - /// /// The minimum length a password is required to be. /// Must be greater than or equal to 8. /// Cannot be smaller than the combination of required special characters + required numerics + 1 Upper Case character + 1 Lower Case character. /// public int? MinimumLength { get; set; } - /// /// The minimum number of special characters a password must contain. /// Special Characters are defined in the AllowedSpecialCharacters field. /// public int? MinimumSpecialCharacters { get; set; } - /// /// The miminum number of numeric characters a password must contain. /// Must be greater than or equal to 1. /// public int? MinimumNumeric { get; set; } - /// /// Read only field - the special characters allowed in a password. /// public string AllowedSpecialCharacters { get; set; } - /// /// Read only field - The full Regular Expression used to determine if a password meets the strength policy. /// public string ValidationRegEx { get; set; } - /// /// Read only field - Colon separated regular expression rules. /// public string ValidationRegExFormula { get; set; } - /// /// Read only field - A localized description of the password strength policy /// diff --git a/src/ShareFile.Api.Client/Models/PhoneSupport.cs b/src/ShareFile.Api.Client/Models/PhoneSupport.cs new file mode 100644 index 0000000..7ee4aca --- /dev/null +++ b/src/ShareFile.Api.Client/Models/PhoneSupport.cs @@ -0,0 +1,70 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class PhoneSupport : SupportMethod + { + public string CountryCode { get; set; } + public string AreaCode { get; set; } + public string Number { get; set; } + public IEnumerable Availability { get; set; } + public int UTCOffsetMins { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as PhoneSupport; + if(typedSource != null) + { + CountryCode = typedSource.CountryCode; + AreaCode = typedSource.AreaCode; + Number = typedSource.Number; + Availability = typedSource.Availability; + UTCOffsetMins = typedSource.UTCOffsetMins; + } + else + { + JToken token; + if(source.TryGetProperty("CountryCode", out token) && token.Type != JTokenType.Null) + { + CountryCode = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("AreaCode", out token) && token.Type != JTokenType.Null) + { + AreaCode = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Number", out token) && token.Type != JTokenType.Null) + { + Number = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Availability", out token) && token.Type != JTokenType.Null) + { + Availability = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("UTCOffsetMins", out token) && token.Type != JTokenType.Null) + { + UTCOffsetMins = (int)serializer.Deserialize(token.CreateReader(), typeof(int)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/PinLockType.cs b/src/ShareFile.Api.Client/Models/PinLockType.cs index ff804e3..3a07898 100644 --- a/src/ShareFile.Api.Client/Models/PinLockType.cs +++ b/src/ShareFile.Api.Client/Models/PinLockType.cs @@ -5,17 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum PinLockType + public enum PinLockType { None = -1, UserSelected = 0, Numeric = 1, Alphanumeric = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/PlanFeatures.cs b/src/ShareFile.Api.Client/Models/PlanFeatures.cs index efcfa78..24e9379 100644 --- a/src/ShareFile.Api.Client/Models/PlanFeatures.cs +++ b/src/ShareFile.Api.Client/Models/PlanFeatures.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,166 +17,137 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// PlanFeatures + /// public class PlanFeatures : ODataObject { - /// /// PlanType /// public string PlanType { get; set; } - /// /// API /// public bool API { get; set; } - /// /// Outlook enabled /// public bool Outlook { get; set; } - /// /// DriveMapping enabled /// public bool DriveMapping { get; set; } - /// /// ShareFile CLI enabled /// public bool CLI { get; set; } - /// /// FTP access enabled /// public bool FTP { get; set; } - /// /// FTPS access enabled /// public bool FTPS { get; set; } - /// /// Sync tool enabled /// public bool Sync { get; set; } - /// /// Virus scanning enabled /// public bool AntiVirus { get; set; } - /// /// Require login on share downloads /// public bool RequireLoginOnDownload { get; set; } - /// /// Max File Size supported in megabytes /// public int MaxFileMB { get; set; } - /// /// Max plan storage in megabytes /// public int PlanStorMB { get; set; } - /// /// Max plan bandwidth in megabytes /// public int PlanBandMB { get; set; } - /// /// SystemName /// public string SystemName { get; set; } - /// /// SystemType /// public string SystemType { get; set; } - /// /// HasOutlookOptions configured /// public bool HasOutlookOptions { get; set; } - /// /// Outlook Options - SimpleMAPI /// public bool? SimpleMAPI { get; set; } - /// /// Outlook Options - Force Attach Links /// public bool? ForceAttachLink { get; set; } - /// /// Current storage used in megabytes /// public string UsedStorMB { get; set; } - /// /// Last time storage used calculated. /// public string UsedStorUtcTicks { get; set; } - /// /// Current storage used in bytes. /// public string UsedStorBytes { get; set; } - /// /// User is Employee /// public bool IsEmployee { get; set; } - /// /// User is Administrator /// public bool IsAdministrator { get; set; } - /// /// Can create root folders /// public bool CanCreateRootFolders { get; set; } - /// /// Can use file box /// public bool CanUseFileBox { get; set; } - /// /// User is confirmed /// public bool IsConfirmed { get; set; } - /// /// Can reset password /// public bool CanResetPassword { get; set; } - /// /// Password requirements as regular expression /// public string PasswordRegEx { get; set; } - /// /// Can manage my settings /// public bool CanManageMySettings { get; set; } - /// /// Home Folder Id /// public string HomeFolder { get; set; } - /// /// Enable Auto Update for tools /// public bool? EnableAutoUpdate { get; set; } - public bool EnableTopLevelView { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Policy.cs b/src/ShareFile.Api.Client/Models/Policy.cs index 37ba451..948ef0d 100644 --- a/src/ShareFile.Api.Client/Models/Policy.cs +++ b/src/ShareFile.Api.Client/Models/Policy.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,24 +17,46 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { #if !ShareFile + /// + /// Represents a Policy definition for use within ShareFile's Policy Based Administration + /// Policies allows the admin to control specific areas of ShareFile. There are currently three types + /// of policy categories: UserAccessPolicy, StoragePolicy, and FileAndFolderPolicy + /// UserAccessPolicy allows the admin to define settings for what a user can and cannot do. + /// StoragePolicy allows the admin to define the default storage zone for a user. + /// FileAndFolderPolicy allows the admin to control settings for files and folders for a user, such as quota. + /// public class Policy : ODataObject { - + /// + /// Name of Policy + /// public string Name { get; set; } - + /// + /// Indicates this is the default policy for the category specified + /// public bool? IsDefault { get; set; } - + /// + /// Creator of Policy + /// public User CreatedBy { get; set; } - + /// + /// Created Date + /// public DateTime? CreationDate { get; set; } - + /// + /// User who last modified Policy or Policy Settings + /// public User UpdatedBy { get; set; } - + /// + /// Date Policy or Policy Settings were last modified + /// public DateTime? UpdatedDate { get; set; } - + /// + /// Metrics of Users attached to policy + /// public PolicyUsage Usage { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/PolicyUsage.cs b/src/ShareFile.Api.Client/Models/PolicyUsage.cs index 396e292..1a2fa8b 100644 --- a/src/ShareFile.Api.Client/Models/PolicyUsage.cs +++ b/src/ShareFile.Api.Client/Models/PolicyUsage.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,13 +17,11 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class PolicyUsage : ODataObject { - public int? ActiveUsersCount { get; set; } - public int? InactiveUsersCount { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/PowerTools.cs b/src/ShareFile.Api.Client/Models/PowerTools.cs index 72c3871..029682d 100644 --- a/src/ShareFile.Api.Client/Models/PowerTools.cs +++ b/src/ShareFile.Api.Client/Models/PowerTools.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,61 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class PowerTools : ODataObject { - - public bool EnableDesktopToolsPage { get; set; } - - public bool EnableMobileApps { get; set; } - - public bool ShowMobileTools { get; set; } + public bool? EnableDesktopToolsPage { get; set; } + public bool? ShowMobileTools { get; set; } + /// + /// This gives the ability to access Apps page in web app. + /// + public bool? ShowApps { get; set; } + /// + /// Access your computer files and apps on your tablet. + /// + public bool? EnableShareConnect { get; set; } + /// + /// SFCLI is a command-line interface to ShareFile. It can be used with a task scheduler to make regular backups or scheduled uploads to ShareFile. + /// + public bool? EnableCLI { get; set; } + /// + /// The ShareFile Outlook Plug-in integrates with Outlook 2007, 2010, 2013 and 2016 to provide an easy interface to ShareFile, allowing you to quickly send and request files through e-mail. + /// + public bool? EnableOutlook { get; set; } + /// + /// Using Right Signature, you can send documents for signature online. + /// + public bool? EnableRightSignature { get; set; } + /// + /// FTP Access allows you to connect to your ShareFile account and upload and download using a typical FTP client, useful if you have clients already familiar with FTP, or business processes scheduled to run over FTP. + /// + public bool? EnableFTP { get; set; } + /// + /// FTPS Access allows you to use FTP with SSL/TLS encryption, for an extra layer of security. If FTPS is enabled but regular FTP Access is disabled, you can ensure that transfers over FTP will always be encrypted. + /// Note: Connections using should be made using 'Implicit SSL/TLS' mode over Port 990. + /// + public bool? EnableSFTP { get; set; } + /// + /// Enables sync access. + /// + public bool? EnableSync { get; set; } + /// + /// Enables sync auto update. + /// + public bool? EnableSyncAutoUpdate { get; set; } + /// + /// ShareFile Drive Mapper allows Employee users to connect their account as a mapped drive on the Windows file system, without performing a full sync of account content. + /// + public bool? EnableDriveMapping { get; set; } + /// + /// WebDAV access allows you to connect to your ShareFile account through a WebDAV client on your computer or mobile device. Depending on the client, these files can then be edited, and directly saved back into ShareFile. + /// + public bool? EnableWebDAV { get; set; } + /// + /// Provide or generate key to override Sync access control. + /// + public string SyncOverrideKey { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -37,23 +82,78 @@ public override void Copy(ODataObject source, JsonSerializer serializer) if(typedSource != null) { EnableDesktopToolsPage = typedSource.EnableDesktopToolsPage; - EnableMobileApps = typedSource.EnableMobileApps; ShowMobileTools = typedSource.ShowMobileTools; + ShowApps = typedSource.ShowApps; + EnableShareConnect = typedSource.EnableShareConnect; + EnableCLI = typedSource.EnableCLI; + EnableOutlook = typedSource.EnableOutlook; + EnableRightSignature = typedSource.EnableRightSignature; + EnableFTP = typedSource.EnableFTP; + EnableSFTP = typedSource.EnableSFTP; + EnableSync = typedSource.EnableSync; + EnableSyncAutoUpdate = typedSource.EnableSyncAutoUpdate; + EnableDriveMapping = typedSource.EnableDriveMapping; + EnableWebDAV = typedSource.EnableWebDAV; + SyncOverrideKey = typedSource.SyncOverrideKey; } else { JToken token; if(source.TryGetProperty("EnableDesktopToolsPage", out token) && token.Type != JTokenType.Null) { - EnableDesktopToolsPage = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + EnableDesktopToolsPage = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } - if(source.TryGetProperty("EnableMobileApps", out token) && token.Type != JTokenType.Null) + if(source.TryGetProperty("ShowMobileTools", out token) && token.Type != JTokenType.Null) { - EnableMobileApps = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + ShowMobileTools = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } - if(source.TryGetProperty("ShowMobileTools", out token) && token.Type != JTokenType.Null) + if(source.TryGetProperty("ShowApps", out token) && token.Type != JTokenType.Null) + { + ShowApps = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableShareConnect", out token) && token.Type != JTokenType.Null) + { + EnableShareConnect = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableCLI", out token) && token.Type != JTokenType.Null) + { + EnableCLI = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableOutlook", out token) && token.Type != JTokenType.Null) + { + EnableOutlook = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableRightSignature", out token) && token.Type != JTokenType.Null) + { + EnableRightSignature = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableFTP", out token) && token.Type != JTokenType.Null) + { + EnableFTP = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableSFTP", out token) && token.Type != JTokenType.Null) + { + EnableSFTP = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableSync", out token) && token.Type != JTokenType.Null) + { + EnableSync = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableSyncAutoUpdate", out token) && token.Type != JTokenType.Null) + { + EnableSyncAutoUpdate = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableDriveMapping", out token) && token.Type != JTokenType.Null) + { + EnableDriveMapping = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("EnableWebDAV", out token) && token.Type != JTokenType.Null) + { + EnableWebDAV = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("SyncOverrideKey", out token) && token.Type != JTokenType.Null) { - ShowMobileTools = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + SyncOverrideKey = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); } } } diff --git a/src/ShareFile.Api.Client/Models/PreviewPlatform.cs b/src/ShareFile.Api.Client/Models/PreviewPlatform.cs index d7b2cfa..ab3e0fe 100644 --- a/src/ShareFile.Api.Client/Models/PreviewPlatform.cs +++ b/src/ShareFile.Api.Client/Models/PreviewPlatform.cs @@ -5,17 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum PreviewPlatform + public enum PreviewPlatform { Web = 0, WebAndMobile = 1, Mobile = 2, All = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/PreviewPlatformInfo.cs b/src/ShareFile.Api.Client/Models/PreviewPlatformInfo.cs index 902d9e0..f7f0f46 100644 --- a/src/ShareFile.Api.Client/Models/PreviewPlatformInfo.cs +++ b/src/ShareFile.Api.Client/Models/PreviewPlatformInfo.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents the information about the PreviewPlatform + /// public class PreviewPlatformInfo : ODataObject { - /// /// Indicates the Preview platform /// public SafeEnum PreviewPlatform { get; set; } - /// /// Indicates the ItemProtocolLink for this Preview platform /// diff --git a/src/ShareFile.Api.Client/Models/PreviewStatus.cs b/src/ShareFile.Api.Client/Models/PreviewStatus.cs index ac4e772..0339a01 100644 --- a/src/ShareFile.Api.Client/Models/PreviewStatus.cs +++ b/src/ShareFile.Api.Client/Models/PreviewStatus.cs @@ -5,14 +5,14 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { [Flags] - public enum PreviewStatus + public enum PreviewStatus { None = 0, HasThumb = 1, @@ -24,4 +24,4 @@ public enum PreviewStatus Processing = 64, Failed = 128 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/Principal.cs b/src/ShareFile.Api.Client/Models/Principal.cs index 3252115..94dd3e3 100644 --- a/src/ShareFile.Api.Client/Models/Principal.cs +++ b/src/ShareFile.Api.Client/Models/Principal.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,27 +17,26 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents an authenticated authority in ShareFile + /// public class Principal : ODataObject { - /// /// User name /// public string Name { get; set; } - /// /// Email address /// public string Email { get; set; } - /// /// Username for the account - the value used for login. This is the same as Email for ShareFile accounts, but /// may be different on Connectors /// public string Username { get; set; } - /// /// Account domain /// diff --git a/src/ShareFile.Api.Client/Models/ProductDefaults.cs b/src/ShareFile.Api.Client/Models/ProductDefaults.cs index b1a68ec..33d1475 100644 --- a/src/ShareFile.Api.Client/Models/ProductDefaults.cs +++ b/src/ShareFile.Api.Client/Models/ProductDefaults.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,41 +17,25 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ProductDefaults : ODataObject { - public string ProductName { get; set; } - public string DefaultWindowTitle { get; set; } - public string TopLevelDomain { get; set; } - public string APITopLevelDomain { get; set; } - public string DefaultApiVersion { get; set; } - public string DefaultSmtpServer { get; set; } - public string NoReplyUserName { get; set; } - public string NoReplyUserEmail { get; set; } - public string SupportUserName { get; set; } - public string SupportUserEmail { get; set; } - public string DefaultEmailFooter { get; set; } - public string DefaultEmailFooterHtml { get; set; } - public string DefaultEmailFooterPlaintext { get; set; } - public string DefaultEmailOverview { get; set; } - public string SupportUserNotificationEmail { get; set; } - public string SystemType { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Query.cs b/src/ShareFile.Api.Client/Models/Query.cs index 0c98733..5003bc5 100644 --- a/src/ShareFile.Api.Client/Models/Query.cs +++ b/src/ShareFile.Api.Client/Models/Query.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,41 +17,37 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Describes an advanced search query + /// public class Query : ODataObject { - /// /// Types of items to search for (ex "File", "Folder", etc.) /// public IEnumerable ItemTypes { get; set; } - /// /// Parent id constraints on search results /// public IEnumerable ParentID { get; set; } - /// /// Creator id constraints on search results /// public IEnumerable CreatorID { get; set; } - /// /// Search term to search for /// public string SearchQuery { get; set; } - /// /// Item creation date range constraint start date in UTC /// public string CreateStartDate { get; set; } - /// /// Item creation date range constraint end date in UTC /// public string CreateEndDate { get; set; } - /// /// Whether item content should be included in the search or not. /// diff --git a/src/ShareFile.Api.Client/Models/QueryPaging.cs b/src/ShareFile.Api.Client/Models/QueryPaging.cs index 7215680..892a115 100644 --- a/src/ShareFile.Api.Client/Models/QueryPaging.cs +++ b/src/ShareFile.Api.Client/Models/QueryPaging.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,26 +17,27 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Paging information for a search query's results + /// public class QueryPaging : ODataObject { - /// /// Deprecated, use the Skip property to skip some number of results /// + [Obsolete("Use Skip property", false)] public int PageNumber { get; set; } - /// /// Deprecated, use the Count property /// + [Obsolete("Use Count property", false)] public int PageSize { get; set; } - /// /// The number of search results to get /// public int Count { get; set; } - /// /// How many results to skip before returning "Count" number results. /// diff --git a/src/ShareFile.Api.Client/Models/QuerySorting.cs b/src/ShareFile.Api.Client/Models/QuerySorting.cs index 53e72b2..cc58f64 100644 --- a/src/ShareFile.Api.Client/Models/QuerySorting.cs +++ b/src/ShareFile.Api.Client/Models/QuerySorting.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// How results should be sorted + /// public class QuerySorting : ODataObject { - /// /// What property to sort the search results by. Set to "" to not sort them /// public string SortBy { get; set; } - /// /// Whether the sort order should be ascending or not /// diff --git a/src/ShareFile.Api.Client/Models/Redirection.cs b/src/ShareFile.Api.Client/Models/Redirection.cs index ea9dd2f..0307a5e 100644 --- a/src/ShareFile.Api.Client/Models/Redirection.cs +++ b/src/ShareFile.Api.Client/Models/Redirection.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,31 +17,20 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class Redirection : ODataObject { - public string Method { get; set; } - public string Root { get; set; } - public Zone Zone { get; set; } - public object Domain { get; set; } - public Uri Uri { get; set; } - public Uri FormsUri { get; set; } - public Uri SessionUri { get; set; } - public Uri TokenUri { get; set; } - public bool SessionCheck { get; set; } - public string Body { get; set; } - public bool Available { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/RemoteUpload.cs b/src/ShareFile.Api.Client/Models/RemoteUpload.cs index 3f30ef0..7b0b728 100644 --- a/src/ShareFile.Api.Client/Models/RemoteUpload.cs +++ b/src/ShareFile.Api.Client/Models/RemoteUpload.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,38 +17,35 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// This class represents Users and the Options like IsPublic, RequireUserInfo and SelectRecipient in a Remote Upload. + /// public class RemoteUpload : ODataObject { - /// /// The Name of this Remote Upload. /// public string Name { get; set; } - /// /// Uri to access the Remote Upload through the Web portal /// public string Uri { get; set; } - /// /// Indicates whether the Remote Upload is public or not. /// One File Drop on your account can be marked as public, meaning that it is accessible from the short link https://example.sharefile.com/filedrop. /// Any additional File Drops on your account can be linked to on your web site using the link at the top of this page /// public bool? IsPublic { get; set; } - /// /// Indicates whether the Remote Upload requires user information ( first name, last name, email , company). /// public bool? RequireUserInfo { get; set; } - /// /// When it's true, visitors of this Remote Upload can select a recipient from a list. /// public bool? SelectRecipient { get; set; } - /// /// Users who can have access to this Remote Upload. /// diff --git a/src/ShareFile.Api.Client/Models/RemoteUploadRequestParams.cs b/src/ShareFile.Api.Client/Models/RemoteUploadRequestParams.cs index 507d0e7..fd2a03f 100644 --- a/src/ShareFile.Api.Client/Models/RemoteUploadRequestParams.cs +++ b/src/ShareFile.Api.Client/Models/RemoteUploadRequestParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,10 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class RemoteUploadRequestParams : UploadRequestParams { - public Contact Creator { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Report.cs b/src/ShareFile.Api.Client/Models/Report.cs index 55406bb..2f29c5b 100644 --- a/src/ShareFile.Api.Client/Models/Report.cs +++ b/src/ShareFile.Api.Client/Models/Report.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,68 +17,121 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a ShareFile Report: a set of configuration data used to generate JSON data + /// public class Report : ODataObject { - + /// + /// The Account ID associated with this Report + /// public string AccountId { get; set; } - + /// + /// The name the Report will appear under in the Reporting UI + /// public string Title { get; set; } - + /// + /// Access, Activity, Storage, Messaging, BandwidthDetail, BandwidthSummary, EncryptedEmail, StorageSummary, AccessChange, SharesSend, or SharesRequest + /// public SafeEnum ReportType { get; set; } - + /// + /// Account, Folder, or User + /// public SafeEnum ObjectType { get; set; } - + /// + /// If ObjectType is specified, this is the Id of the object to run the Report against + /// public string ObjectId { get; set; } - + /// + /// (For non-Access reports) Specific, Today, Yesterday, ThisWeek, LastWeek, ThisMonth, LastMonth, or Last30Days + /// public SafeEnum DateOption { get; set; } - + /// + /// (For Activity reports) A comma-delimited list of Login, LoginFail, LoginLocked, Download, View, WatermarkDownload, Upload, ZipUpload, Item_Delete, Item_Edit, Move, Item_Restore, NewFolder, NewNote, NewLink, DLP_Scan_Accept, DLP_Scan_Reject, DLP_Share_Allow, DLP_Share_Deny, Item_Archive, TFA_Login, TFA_LoginFail, TFA_InvalidCode, LoginFail_OAuthTokenExpired + /// public string ActivityTypes { get; set; } - /// - /// The Start Date of the range the ReportRecord will be run against + /// If Specific is the DateOption, the beginning of the date range to report on /// public DateTime? StartDate { get; set; } - /// - /// The End Date of the range the ReportRecord will be run against + /// If specific is the DateOption, the end of the data range to report on /// public DateTime? EndDate { get; set; } - + /// + /// The last time this Report was run + /// public DateTime? LastRunDate { get; set; } - + /// + /// True if the Report should run regularly + /// public bool? IsRecurring { get; set; } - + /// + /// Should match IsRecurring + /// public bool? IsScheduled { get; set; } - + /// + /// If the ObjectType selected is Folder, whether or not subfolders should be included in the Report + /// public bool? IncludeSubFolders { get; set; } - + /// + /// True if the result of this Report should be directly saved to a ShareFile folder + /// public bool? SaveToFolder { get; set; } - + /// + /// If SaveToFolder is true, the format the Report should be saved in + /// public string SaveFormat { get; set; } - + /// + /// If SaveToFolder is true, the Id of the folder the Report should be saved in + /// public string SaveFolderId { get; set; } - + /// + /// The Item object representing the folder selected with SaveFolderId + /// public Item SaveFolder { get; set; } - + /// + /// The creator of the report + /// public User Creator { get; set; } - + /// + /// The user ID of the creator of the Report + /// public string CreatorId { get; set; } - + /// + /// An expandable property that includes all the ReportRecord objects associated with this Report + /// public IEnumerable Records { get; set; } - + /// + /// When this Report was originally created + /// public DateTime? CreateDate { get; set; } - + /// + /// If this Report is scheduled and recurring, when the Report should be run again - Once, Daily, Weekly, or Monthly + /// public SafeEnum Frequency { get; set; } - + /// + /// If the Report is scheduled to run weekly, the day of the week to run on (Sunday is 0, Saturday is 6) + /// public int? DayOfWeek { get; set; } - + /// + /// If the Report is scheduled to run monthly, the day of the month to run on + /// public int? DayOfMonth { get; set; } - + /// + /// If true, the Report will send an email when it finishes executing + /// public bool? EmailNotice { get; set; } - + /// + /// If EmailNotice is true, the email address to notify + /// public string EmailToNotify { get; set; } + /// + /// Specifies the custom Filters specific to each type of Report + /// + public ReportFilter Filter { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -114,6 +167,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) DayOfMonth = typedSource.DayOfMonth; EmailNotice = typedSource.EmailNotice; EmailToNotify = typedSource.EmailToNotify; + Filter = typedSource.Filter; } else { @@ -222,6 +276,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { EmailToNotify = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); } + if(source.TryGetProperty("Filter", out token) && token.Type != JTokenType.Null) + { + Filter = (ReportFilter)serializer.Deserialize(token.CreateReader(), typeof(ReportFilter)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/ReportDateOption.cs b/src/ShareFile.Api.Client/Models/ReportDateOption.cs index 6574221..a5a5485 100644 --- a/src/ShareFile.Api.Client/Models/ReportDateOption.cs +++ b/src/ShareFile.Api.Client/Models/ReportDateOption.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ReportDateOption + public enum ReportDateOption { Specific = 0, Today = 1, @@ -22,4 +22,4 @@ public enum ReportDateOption LastMonth = 6, Last30Days = 7 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ReportFilter.cs b/src/ShareFile.Api.Client/Models/ReportFilter.cs new file mode 100644 index 0000000..1904d5b --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ReportFilter.cs @@ -0,0 +1,32 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class ReportFilter : ODataObject + { + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/ReportObjectType.cs b/src/ShareFile.Api.Client/Models/ReportObjectType.cs index c306e66..382dce8 100644 --- a/src/ShareFile.Api.Client/Models/ReportObjectType.cs +++ b/src/ShareFile.Api.Client/Models/ReportObjectType.cs @@ -5,16 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ReportObjectType + public enum ReportObjectType { Account = 0, Folder = 1, - User = 2 + User = 2, + Group = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ReportRecord.cs b/src/ShareFile.Api.Client/Models/ReportRecord.cs index 87abf26..eb15391 100644 --- a/src/ShareFile.Api.Client/Models/ReportRecord.cs +++ b/src/ShareFile.Api.Client/Models/ReportRecord.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,37 +17,32 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a ShareFile ReportRecord: an individual execution of a ShareFile Report + /// public class ReportRecord : ODataObject { - public Report Report { get; set; } - /// /// The Start Date of the range the ReportRecord will be run against /// public DateTime? StartDate { get; set; } - /// /// The End Date of the range the ReportRecord will be run against /// public DateTime? EndDate { get; set; } - /// /// The Time this ReportRecord began processing /// public DateTime? StartRunTime { get; set; } - /// /// The Time this ReportRecord finished processing /// public DateTime? EndRunTime { get; set; } - public SafeEnum Status { get; set; } - public bool? HasData { get; set; } - public string Message { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ReportRunFrequency.cs b/src/ShareFile.Api.Client/Models/ReportRunFrequency.cs index b55b9bb..e7b6d00 100644 --- a/src/ShareFile.Api.Client/Models/ReportRunFrequency.cs +++ b/src/ShareFile.Api.Client/Models/ReportRunFrequency.cs @@ -5,17 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ReportRunFrequency + public enum ReportRunFrequency { Once = 0, Daily = 1, Weekly = 2, Monthly = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ReportRunStatus.cs b/src/ShareFile.Api.Client/Models/ReportRunStatus.cs index 2637b89..8fb5a2a 100644 --- a/src/ShareFile.Api.Client/Models/ReportRunStatus.cs +++ b/src/ShareFile.Api.Client/Models/ReportRunStatus.cs @@ -5,17 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ReportRunStatus + public enum ReportRunStatus { Pending = 0, Running = 1, Success = 2, Failed = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ReportType.cs b/src/ShareFile.Api.Client/Models/ReportType.cs index ca3af5d..906070a 100644 --- a/src/ShareFile.Api.Client/Models/ReportType.cs +++ b/src/ShareFile.Api.Client/Models/ReportType.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ReportType + public enum ReportType { Access = 0, Activity = 1, @@ -19,6 +19,11 @@ public enum ReportType Messaging = 3, BandwidthDetail = 4, BandwidthSummary = 5, - EncryptedEmail = 6 + EncryptedEmail = 6, + StorageSummary = 7, + UserSummary = 8, + AccessChange = 9, + SharesSend = 10, + SharesRequest = 11 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/RequestedPlan.cs b/src/ShareFile.Api.Client/Models/RequestedPlan.cs new file mode 100644 index 0000000..3acf46c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/RequestedPlan.cs @@ -0,0 +1,70 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Requested Plan + /// + public class RequestedPlan : ODataObject + { + /// + /// Billing Rate estimate in US Dollars + /// + public decimal? BaseBillingRate { get; set; } + /// + /// Number of User licenses for the account + /// + public int? BaseUsers { get; set; } + /// + /// Base amount of Cloud Storage to provision + /// + public int? BaseDiskSpaceInGB { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as RequestedPlan; + if(typedSource != null) + { + BaseBillingRate = typedSource.BaseBillingRate; + BaseUsers = typedSource.BaseUsers; + BaseDiskSpaceInGB = typedSource.BaseDiskSpaceInGB; + } + else + { + JToken token; + if(source.TryGetProperty("BaseBillingRate", out token) && token.Type != JTokenType.Null) + { + BaseBillingRate = (decimal?)serializer.Deserialize(token.CreateReader(), typeof(decimal?)); + } + if(source.TryGetProperty("BaseUsers", out token) && token.Type != JTokenType.Null) + { + BaseUsers = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("BaseDiskSpaceInGB", out token) && token.Type != JTokenType.Null) + { + BaseDiskSpaceInGB = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/RequireSubdomainResult.cs b/src/ShareFile.Api.Client/Models/RequireSubdomainResult.cs index 6a016c9..a4a605d 100644 --- a/src/ShareFile.Api.Client/Models/RequireSubdomainResult.cs +++ b/src/ShareFile.Api.Client/Models/RequireSubdomainResult.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Response object for RequestSubdomain requests. + /// public class RequireSubdomainResult : ODataObject { - /// /// Indicates if subdomain is required. /// diff --git a/src/ShareFile.Api.Client/Models/RequireWebPopResult.cs b/src/ShareFile.Api.Client/Models/RequireWebPopResult.cs index 03812f1..4baa7f3 100644 --- a/src/ShareFile.Api.Client/Models/RequireWebPopResult.cs +++ b/src/ShareFile.Api.Client/Models/RequireWebPopResult.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class RequireWebPopResult : ODataObject { - + /// + /// Indicates if WebPop is required for authentication. + /// public bool RequireWebPop { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ResetPasswordRequest.cs b/src/ShareFile.Api.Client/Models/ResetPasswordRequest.cs new file mode 100644 index 0000000..c78156c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/ResetPasswordRequest.cs @@ -0,0 +1,67 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// The parameters required to reset password with token + /// + public class ResetPasswordRequest : ODataObject + { + public string Token { get; set; } + public string Password { get; set; } + public string Subdomain { get; set; } + public string Tool { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as ResetPasswordRequest; + if(typedSource != null) + { + Token = typedSource.Token; + Password = typedSource.Password; + Subdomain = typedSource.Subdomain; + Tool = typedSource.Tool; + } + else + { + JToken token; + if(source.TryGetProperty("Token", out token) && token.Type != JTokenType.Null) + { + Token = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Password", out token) && token.Type != JTokenType.Null) + { + Password = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Subdomain", out token) && token.Type != JTokenType.Null) + { + Subdomain = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Tool", out token) && token.Type != JTokenType.Null) + { + Tool = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/SFTool.cs b/src/ShareFile.Api.Client/Models/SFTool.cs index a37138f..1c4124c 100644 --- a/src/ShareFile.Api.Client/Models/SFTool.cs +++ b/src/ShareFile.Api.Client/Models/SFTool.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum SFTool + public enum SFTool { DriveMapping = 1, EnterpriseSync = 2, @@ -36,4 +36,4 @@ public enum SFTool WindowsPhone = 536870923, Unknown = 536870924 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/SSOAccountProvider.cs b/src/ShareFile.Api.Client/Models/SSOAccountProvider.cs index 883b508..35f11e9 100644 --- a/src/ShareFile.Api.Client/Models/SSOAccountProvider.cs +++ b/src/ShareFile.Api.Client/Models/SSOAccountProvider.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,43 +17,26 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class SSOAccountProvider : ODataObject { - public string LogoutUrl { get; set; } - public string LoginUrl { get; set; } - public string IPRestrictions { get; set; } - public bool? ForceSSO { get; set; } - public string Certificate { get; set; } - public Account Account { get; set; } - public string EntityID { get; set; } - public string SFEntityID { get; set; } - public string SSOProvidersToAccountsID { get; set; } - public string SPInitatedAuthContext { get; set; } - public string SPInitatedAuthMethod { get; set; } - public bool? UseWebAuthentication { get; set; } - public bool? IsActive { get; set; } - public bool? IsDefault { get; set; } - public string ProviderID { get; set; } - public bool? DebugMode { get; set; } - public bool? LenientSignatures { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/SSOInfo.cs b/src/ShareFile.Api.Client/Models/SSOInfo.cs index 50f83bb..ace361c 100644 --- a/src/ShareFile.Api.Client/Models/SSOInfo.cs +++ b/src/ShareFile.Api.Client/Models/SSOInfo.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,15 +17,24 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// SSO Info + /// public class SSOInfo : ODataObject { - + /// + /// Collection of entries + /// public IEnumerable Info { get; set; } - + /// + /// Top level domain for ShareFile application + /// public string AppControlPlane { get; set; } - + /// + /// Top level domain for ShareFile API + /// public string ApiControlPlane { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/SSOInfoEntry.cs b/src/ShareFile.Api.Client/Models/SSOInfoEntry.cs index 76f9742..e4dbad9 100644 --- a/src/ShareFile.Api.Client/Models/SSOInfoEntry.cs +++ b/src/ShareFile.Api.Client/Models/SSOInfoEntry.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// SSO Info Entry + /// public class SSOInfoEntry : ODataObject { - /// /// Key /// public string Key { get; set; } - /// /// Value /// diff --git a/src/ShareFile.Api.Client/Models/SalesTaxQuote.cs b/src/ShareFile.Api.Client/Models/SalesTaxQuote.cs index c4ebcb3..347783e 100644 --- a/src/ShareFile.Api.Client/Models/SalesTaxQuote.cs +++ b/src/ShareFile.Api.Client/Models/SalesTaxQuote.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,15 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class SalesTaxQuote : ODataObject { - + /// + /// Tax rate used to calculate the Total Tax, in decimal form, e.g, 7% is 0.07 + /// public decimal? TaxRate { get; set; } - + /// + /// Total Tax quoted, in $US + /// public decimal? TotalTax { get; set; } - + /// + /// If Tax could not be calculated, this property will provide a message + /// public string ErrorMessage { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/SearchQuery.cs b/src/ShareFile.Api.Client/Models/SearchQuery.cs index feb523d..dceaa5c 100644 --- a/src/ShareFile.Api.Client/Models/SearchQuery.cs +++ b/src/ShareFile.Api.Client/Models/SearchQuery.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,26 +17,25 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Advanced search query object + /// public class SearchQuery : ODataObject { - /// /// Information about the query to run /// public Query Query { get; set; } - /// /// Paging info about the search results /// public QueryPaging Paging { get; set; } - /// /// How the search results should be sorted /// public QuerySorting Sort { get; set; } - /// /// Timeout for the search request in seconds /// diff --git a/src/ShareFile.Api.Client/Models/SearchResult.cs b/src/ShareFile.Api.Client/Models/SearchResult.cs index fb43242..0f3cee9 100644 --- a/src/ShareFile.Api.Client/Models/SearchResult.cs +++ b/src/ShareFile.Api.Client/Models/SearchResult.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,61 +17,35 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class SearchResult : ODataObject { - public int Rank { get; set; } - public decimal Score { get; set; } - public string ItemID { get; set; } - public string ParentID { get; set; } - public string ParentName { get; set; } - public string ItemType { get; set; } - public string FileName { get; set; } - public string DisplayName { get; set; } - public long Size { get; set; } - public string CreatorID { get; set; } - public string CreatorName { get; set; } - public string CreatorFirstName { get; set; } - public string CreatorLastName { get; set; } - - public string CreationDate { get; set; } - + public DateTime? CreationDate { get; set; } public string Details { get; set; } - public string MD5 { get; set; } - public int PreviewStatus { get; set; } - public int VirusStatus { get; set; } - public string Url { get; set; } - public bool CanDownload { get; set; } - public bool CanView { get; set; } - public bool CanDelete { get; set; } - public string ParentSemanticPath { get; set; } - public string Path { get; set; } - public string StreamID { get; set; } - public string AccountID { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) @@ -166,7 +140,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) } if(source.TryGetProperty("CreationDate", out token) && token.Type != JTokenType.Null) { - CreationDate = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + CreationDate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); } if(source.TryGetProperty("Details", out token) && token.Type != JTokenType.Null) { diff --git a/src/ShareFile.Api.Client/Models/SearchResults.cs b/src/ShareFile.Api.Client/Models/SearchResults.cs index 729793f..1a6fbbd 100644 --- a/src/ShareFile.Api.Client/Models/SearchResults.cs +++ b/src/ShareFile.Api.Client/Models/SearchResults.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Collection of search results from a search query + /// public class SearchResults : ODataObject { - /// /// Are these only partial results? /// public bool PartialResults { get; set; } - /// /// Collection of search result hits /// public IEnumerable Results { get; set; } - /// /// Did the search query timeout? /// diff --git a/src/ShareFile.Api.Client/Models/SecurityQuestion.cs b/src/ShareFile.Api.Client/Models/SecurityQuestion.cs index 4def0f5..1421c5c 100644 --- a/src/ShareFile.Api.Client/Models/SecurityQuestion.cs +++ b/src/ShareFile.Api.Client/Models/SecurityQuestion.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,15 +17,12 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class SecurityQuestion : ODataObject { - public string Question { get; set; } - public string Answer { get; set; } - public bool? IsResetRequired { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/SentNotification.cs b/src/ShareFile.Api.Client/Models/SentNotification.cs new file mode 100644 index 0000000..f027fd7 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/SentNotification.cs @@ -0,0 +1,58 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class SentNotification : ODataObject + { + public DateTime? DateSent { get; set; } + public string Subject { get; set; } + public string To { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as SentNotification; + if(typedSource != null) + { + DateSent = typedSource.DateSent; + Subject = typedSource.Subject; + To = typedSource.To; + } + else + { + JToken token; + if(source.TryGetProperty("DateSent", out token) && token.Type != JTokenType.Null) + { + DateSent = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + if(source.TryGetProperty("Subject", out token) && token.Type != JTokenType.Null) + { + Subject = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("To", out token) && token.Type != JTokenType.Null) + { + To = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/Service.cs b/src/ShareFile.Api.Client/Models/Service.cs index 24a420e..4dd34b0 100644 --- a/src/ShareFile.Api.Client/Models/Service.cs +++ b/src/ShareFile.Api.Client/Models/Service.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,19 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents an add-on service available to a given account + /// public class Service : ODataObject { - public string AddOnCode { get; set; } - public int? Licenses { get; set; } - + public int? LicensesUsed { get; set; } /// /// Unit price per license, per billing cycle /// public decimal? PricePerLicense { get; set; } + public int? PlanAddonBundleId { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -41,7 +43,9 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { AddOnCode = typedSource.AddOnCode; Licenses = typedSource.Licenses; + LicensesUsed = typedSource.LicensesUsed; PricePerLicense = typedSource.PricePerLicense; + PlanAddonBundleId = typedSource.PlanAddonBundleId; } else { @@ -54,10 +58,18 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { Licenses = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); } + if(source.TryGetProperty("LicensesUsed", out token) && token.Type != JTokenType.Null) + { + LicensesUsed = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } if(source.TryGetProperty("PricePerLicense", out token) && token.Type != JTokenType.Null) { PricePerLicense = (decimal?)serializer.Deserialize(token.CreateReader(), typeof(decimal?)); } + if(source.TryGetProperty("PlanAddonBundleId", out token) && token.Type != JTokenType.Null) + { + PlanAddonBundleId = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/ServicesCollection.cs b/src/ShareFile.Api.Client/Models/ServicesCollection.cs index 0e53ebe..b1c5e22 100644 --- a/src/ShareFile.Api.Client/Models/ServicesCollection.cs +++ b/src/ShareFile.Api.Client/Models/ServicesCollection.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,25 +17,29 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Encapsulates the add-on services available on a given account + /// public class ServicesCollection : ODataObject { - /// /// RightSignature account service /// public Service RightSignature { get; set; } - /// /// ShareConnect account service /// public Service ShareConnect { get; set; } - /// /// ShareFile Legal account service /// public Service ShareFileLegal { get; set; } + /// + /// Podio account service + /// + public Service Podio { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -48,6 +52,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) RightSignature = typedSource.RightSignature; ShareConnect = typedSource.ShareConnect; ShareFileLegal = typedSource.ShareFileLegal; + Podio = typedSource.Podio; } else { @@ -64,6 +69,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { ShareFileLegal = (Service)serializer.Deserialize(token.CreateReader(), typeof(Service)); } + if(source.TryGetProperty("Podio", out token) && token.Type != JTokenType.Null) + { + Podio = (Service)serializer.Deserialize(token.CreateReader(), typeof(Service)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/Session.cs b/src/ShareFile.Api.Client/Models/Session.cs index 2f86f8c..1ed4ab4 100644 --- a/src/ShareFile.Api.Client/Models/Session.cs +++ b/src/ShareFile.Api.Client/Models/Session.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,27 +17,18 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class Session : ODataObject { - public Principal Principal { get; set; } - public string AuthenticationType { get; set; } - public string OAuth2ClientName { get; set; } - public string Tool { get; set; } - public string Version { get; set; } - public string ClientIPAddress { get; set; } - public bool IsAuthenticated { get; set; } - public string Name { get; set; } - public DeviceUser DeviceUser { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/Share.cs b/src/ShareFile.Api.Client/Models/Share.cs index 33428fd..8e39b41 100644 --- a/src/ShareFile.Api.Client/Models/Share.cs +++ b/src/ShareFile.Api.Client/Models/Share.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,82 +17,148 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Shares represent the "Send File" and "Request File" actions initiated by ShareFile users. Shares allows users to give temporary access to specific set of files or folders, allowing other + /// users to download or upload files even though they would not have permissions otherwise. + /// public class Share : ODataObject { - + /// + /// When a Share is sent to multiple users, with RequireLogin or RequireUserInfo set, then a different + /// Share Alias is created for each user. The email ShareFile sends to these users will contain different + /// AliasIDs, allowing ShareFile to track the user activity on the share. + /// For anonymous Shares, the AliasID will be the same as the Share ID. + /// public string AliasID { get; set; } - + /// + /// Either "Send" or "Request". Send Shares are used to Send files and folders to the specified users. Request + /// shares are used to allow users to upload files to the share owner chosen location. + /// public SafeEnum ShareType { get; set; } - + /// + /// Share title + /// public string Title { get; set; } - + /// + /// Flag to indicate if ShareFile has sent email messages for this Share + /// public bool? HasSentMessage { get; set; } - + /// + /// Subject of Share email message + /// public string SentMessageTitle { get; set; } - + /// + /// If set, only authenticated users can download files from this share. + /// public bool? RequireLogin { get; set; } - + /// + /// If set, users must provide Name, Email and Company information to download files from the share. + /// public bool? RequireUserInfo { get; set; } - + /// + /// Folder location that contain the share files (Send); or the folder were files will be uploaded to + /// (Request). + /// public Item Parent { get; set; } - + /// + /// User that created this Share. + /// public User Creator { get; set; } - + /// + /// User given permission to use this share - used for Aliases. + /// public User User { get; set; } - + /// + /// List of shared Items (for Send Shares only) + /// public IEnumerable Items { get; set; } - + /// + /// Date the share was created + /// public DateTime? CreationDate { get; set; } - + /// + /// Date the share expires + /// public DateTime? ExpirationDate { get; set; } - + /// + /// Maximum number of downloads each user can perform. + /// public int? MaxDownloads { get; set; } - + /// + /// Total number of times a share has been downloaded by a user. + /// public int? TotalDownloads { get; set; } - + /// + /// Used for Virtual Data Room accounts - indicates the files in the share can only be + /// downloaded with an applied watermark. + /// public bool? IsViewOnly { get; set; } - + /// + /// User activity on this share will be tracked up to this date. + /// public DateTime? TrackUntilDate { get; set; } - public int? SendFrequency { get; set; } - public int? SendInterval { get; set; } - public DateTime? LastDateSent { get; set; } - + /// + /// Indicates whether or not this Share has been downloaded + /// public bool? IsConsumed { get; set; } - + /// + /// Indicates whether the contents of this share have been viewed by a valid, authenticated recipient + /// public bool? IsRead { get; set; } - public bool? IsArchived { get; set; } - public string SendTool { get; set; } - public string SendMethod { get; set; } - + /// + /// When enabled the items are identified by stream IDs instead of item IDs. + /// Applies to Send Shares only. + /// public bool? UsesStreamIDs { get; set; } - + /// + /// Uri to access the share through the Web portal + /// public Uri Uri { get; set; } - + /// + /// List of users that have access to this share. + /// public IEnumerable Recipients { get; set; } - + /// + /// The Storage Zone that contains this Share. + /// public Zone Zone { get; set; } - + /// + /// HMAC Signature for the Share data + /// public string Signature { get; set; } - + /// + /// Defines whether the request to retrieve Share Items is to be navigated to a remote endpoint. + /// public bool? HasRemoteChildren { get; set; } - + /// + /// Redirection endpoint for this Share. + /// public Redirection Redirection { get; set; } - public SafeEnum ShareSubType { get; set; } - + /// + /// Shared item history. + /// public IEnumerable ShareItemHistory { get; set; } - + /// + /// Current Settings for the Share + /// public ShareSettings Settings { get; set; } - + /// + /// Type of the Share + /// public ShareAccessRight ShareAccessRight { get; set; } + /// + /// Flag determining whether the share is protected through IRM (Information Rights Management) + /// + public bool? IrmProtected { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -138,6 +204,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) ShareItemHistory = typedSource.ShareItemHistory; Settings = typedSource.Settings; ShareAccessRight = typedSource.ShareAccessRight; + IrmProtected = typedSource.IrmProtected; } else { @@ -286,6 +353,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { ShareAccessRight = (ShareAccessRight)serializer.Deserialize(token.CreateReader(), typeof(ShareAccessRight)); } + if(source.TryGetProperty("IrmProtected", out token) && token.Type != JTokenType.Null) + { + IrmProtected = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/ShareAccessRight.cs b/src/ShareFile.Api.Client/Models/ShareAccessRight.cs index a4a1598..fb34f1d 100644 --- a/src/ShareFile.Api.Client/Models/ShareAccessRight.cs +++ b/src/ShareFile.Api.Client/Models/ShareAccessRight.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Model that contains share option type, properties and display names + /// public class ShareAccessRight : ODataObject { - /// /// Localized text for downstream clients to use for displaying options /// public string DisplayText { get; set; } - /// /// Share Access Right Type /// diff --git a/src/ShareFile.Api.Client/Models/ShareAccessRightType.cs b/src/ShareFile.Api.Client/Models/ShareAccessRightType.cs index 4057778..a1ed9f6 100644 --- a/src/ShareFile.Api.Client/Models/ShareAccessRightType.cs +++ b/src/ShareFile.Api.Client/Models/ShareAccessRightType.cs @@ -5,16 +5,22 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ShareAccessRightType + + /// + /// Share type + /// + public enum ShareAccessRightType { ViewOnline = 0, - IRM = 1, - FullControl = 2 + ViewWatermarked = 1, + DownloadWatermarked = 2, + IRM = 3, + FullControl = 4 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ShareActionType.cs b/src/ShareFile.Api.Client/Models/ShareActionType.cs index b0f32f8..74855c9 100644 --- a/src/ShareFile.Api.Client/Models/ShareActionType.cs +++ b/src/ShareFile.Api.Client/Models/ShareActionType.cs @@ -5,15 +5,19 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ShareActionType + + /// + /// Share action type + /// + public enum ShareActionType { Link = 0, Email = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ShareAlias.cs b/src/ShareFile.Api.Client/Models/ShareAlias.cs index 9d8c3a3..c3616e7 100644 --- a/src/ShareFile.Api.Client/Models/ShareAlias.cs +++ b/src/ShareFile.Api.Client/Models/ShareAlias.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,46 +17,41 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Share Alias + /// public class ShareAlias : ODataObject { - /// /// User to whom the share is associated. /// public User User { get; set; } - /// /// Share /// public Share Share { get; set; } - /// /// Email /// public string Email { get; set; } - /// /// Number of downloads /// public int? Downloads { get; set; } - /// /// IsConsumed /// public bool? IsConsumed { get; set; } - /// /// IsArchived /// public bool? IsArchived { get; set; } - /// /// IsRead /// public bool? IsRead { get; set; } - /// /// Uri to access the share through the Web portal /// diff --git a/src/ShareFile.Api.Client/Models/ShareFileAccessRights.cs b/src/ShareFile.Api.Client/Models/ShareFileAccessRights.cs index e327453..abcc965 100644 --- a/src/ShareFile.Api.Client/Models/ShareFileAccessRights.cs +++ b/src/ShareFile.Api.Client/Models/ShareFileAccessRights.cs @@ -5,25 +5,73 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + + /// + /// IRM ShareFile specific access rights + /// [Flags] - public enum ShareFileAccessRights + public enum ShareFileAccessRights { + + /// + /// No Access + /// NoAccess = 0, + + /// + /// User can only view. + /// View = 1, + + /// + /// Can use Light viewer by Seclore to access protected file. + /// LightViewer = 2, + + /// + /// User can print + /// Print = 4, + + /// + /// User can edit + /// Edit = 8, + + /// + /// Give user the full control on protected file. + /// FullControl = 16, + + /// + /// Disable copying data + /// CopyData = 32, + + /// + /// Disable screen Capture + /// ScreenCapture = 64, + + /// + /// Disable macros. + /// Macro = 128, + + /// + /// Provide offline access. + /// OfflineAccess = 256, + + /// + /// Allow users to redistribute protected files. + /// Redistribute = 512 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ShareItemHistory.cs b/src/ShareFile.Api.Client/Models/ShareItemHistory.cs index 6eb7abf..2ae1c64 100644 --- a/src/ShareFile.Api.Client/Models/ShareItemHistory.cs +++ b/src/ShareFile.Api.Client/Models/ShareItemHistory.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,17 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ShareItemHistory : ODataObject { - public string Title { get; set; } - public string Recipient { get; set; } - public SafeEnum ActivityType { get; set; } - public DateTime? DownloadDate { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ShareRequestParams.cs b/src/ShareFile.Api.Client/Models/ShareRequestParams.cs index e916d08..c8d9f7d 100644 --- a/src/ShareFile.Api.Client/Models/ShareRequestParams.cs +++ b/src/ShareFile.Api.Client/Models/ShareRequestParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,56 +17,49 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// ShareRequestParams + /// public class ShareRequestParams : ODataObject { - /// /// The Folder Id for this Request. Has precedence over FolderPath /// public string FolderId { get; set; } - /// /// The path to the Folder for this Request /// public string FolderPath { get; set; } - /// /// List of emails to whom this Share should be sent /// public IEnumerable Emails { get; set; } - /// /// The subject of the Share email /// public string Subject { get; set; } - /// /// A message to be included in the Share email body /// public string Body { get; set; } - /// /// If true, the Share sender will be cc'd in the Share email /// public bool CcSender { get; set; } - /// /// If true, recipients will need to login to access the Share /// public bool RequireLogin { get; set; } - /// /// Number of days until access to this Share expires /// public int ExpirationDays { get; set; } - /// /// If true, the sender will receive an email notification when files are uploaded to the Share /// public bool NotifyOnUpload { get; set; } - /// /// If true, the Share items can only be viewed but not downloaded. Not applicable for Request Shares /// diff --git a/src/ShareFile.Api.Client/Models/ShareResendParams.cs b/src/ShareFile.Api.Client/Models/ShareResendParams.cs index a5b5028..91439fd 100644 --- a/src/ShareFile.Api.Client/Models/ShareResendParams.cs +++ b/src/ShareFile.Api.Client/Models/ShareResendParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,33 +17,30 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Parameters used to re-send an existing share + /// public class ShareResendParams : ODataObject { - /// /// The ID of the existing share /// public string ShareId { get; set; } - /// /// These can be email addresses or group IDs /// public IEnumerable Recipients { get; set; } - public string Subject { get; set; } - /// /// Message included in the share notification /// public string Body { get; set; } - /// /// Send a copy of the notification to the cender /// public bool CcSender { get; set; } - public bool NotifyOnUse { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ShareSendParams.cs b/src/ShareFile.Api.Client/Models/ShareSendParams.cs index 7608bc5..944b3a8 100644 --- a/src/ShareFile.Api.Client/Models/ShareSendParams.cs +++ b/src/ShareFile.Api.Client/Models/ShareSendParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,77 +17,66 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// SendShareParams + /// public class ShareSendParams : ODataObject { - /// /// List of Item Ids to be sent /// public IEnumerable Items { get; set; } - /// /// List of emails to whom this Share should be sent /// public IEnumerable Emails { get; set; } - /// /// The subject of the Share email /// public string Subject { get; set; } - /// /// A message to be included in the Share email body /// public string Body { get; set; } - /// /// If true, the Share sender will be cc'd in the Share email /// public bool CcSender { get; set; } - /// /// If true, recipients will need to login to access the Share /// public bool RequireLogin { get; set; } - /// /// If true, anyone with the link can access the Share. Cannot be true if RequireLogin is true /// public bool SendAnon { get; set; } - /// /// If true, a recipient will need to provide their full name and email to access the Share. Cannot be true if RequireLogin is true /// public bool RequireUserInfo { get; set; } - /// /// Number of days until access to this Share expires /// public int ExpirationDays { get; set; } - /// /// If true, the sender will receive an email notification when the Share items are downloaded /// public bool NotifyOnDownload { get; set; } - /// /// If true, the Share items can only be viewed but not downloaded. Requires account preference EnableViewOnly to work /// public bool IsViewOnly { get; set; } - /// /// Maximum number of times each recipient can download the Share items /// public int MaxDownloads { get; set; } - /// /// When enabled the items are identified by stream IDs instead of item IDs. /// Applies to Send Shares only. (FINRA enabled accounts cannot use this) /// public bool? UsesStreamIDs { get; set; } - /// /// Used to define the share type and share action types /// diff --git a/src/ShareFile.Api.Client/Models/ShareSettings.cs b/src/ShareFile.Api.Client/Models/ShareSettings.cs index 8fd9758..66e1ed1 100644 --- a/src/ShareFile.Api.Client/Models/ShareSettings.cs +++ b/src/ShareFile.Api.Client/Models/ShareSettings.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ShareSettings : ODataObject { - + /// + /// Notify the creator when Share is used. + /// public bool? NotifyOnUse { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ShareSubType.cs b/src/ShareFile.Api.Client/Models/ShareSubType.cs index 5405c2d..30a11a9 100644 --- a/src/ShareFile.Api.Client/Models/ShareSubType.cs +++ b/src/ShareFile.Api.Client/Models/ShareSubType.cs @@ -5,17 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ShareSubType + public enum ShareSubType { None = 0, Email = 1, Connector = 2, ConnectorWithIrm = 3 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ShareType.cs b/src/ShareFile.Api.Client/Models/ShareType.cs index 6463514..9b3d24e 100644 --- a/src/ShareFile.Api.Client/Models/ShareType.cs +++ b/src/ShareFile.Api.Client/Models/ShareType.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ShareType + public enum ShareType { Request = 0, Send = 1, Both = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/SimpleQuery.cs b/src/ShareFile.Api.Client/Models/SimpleQuery.cs index 8639b4a..1e31b00 100644 --- a/src/ShareFile.Api.Client/Models/SimpleQuery.cs +++ b/src/ShareFile.Api.Client/Models/SimpleQuery.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,41 +17,38 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Describes a simplified advanced search query. Some constraints have been changed to take only a single id + /// instead of a list of ids + /// public class SimpleQuery : ODataObject { - /// /// Item type to search for (ex "File", "Folder", etc.) /// public string ItemType { get; set; } - /// /// Parent id constraint on search results /// public string ParentID { get; set; } - /// /// Creator id constraint on search results /// public string CreatorID { get; set; } - /// /// Search term to search for /// public string SearchQuery { get; set; } - /// /// Item creation date range constraint start date in UTC /// public string CreateStartDate { get; set; } - /// /// Item creation date range constraint end date in UTC /// public string CreateEndDate { get; set; } - /// /// Whether item content should be included in the search or not. /// diff --git a/src/ShareFile.Api.Client/Models/SimpleSearchQuery.cs b/src/ShareFile.Api.Client/Models/SimpleSearchQuery.cs index e293857..3a0ce74 100644 --- a/src/ShareFile.Api.Client/Models/SimpleSearchQuery.cs +++ b/src/ShareFile.Api.Client/Models/SimpleSearchQuery.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,26 +17,25 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Simplified advanced search query object. Same as the SearchQuery object, but uses the simplified SimpleQuery child object + /// public class SimpleSearchQuery : ODataObject { - /// /// Information about the query to run /// public SimpleQuery Query { get; set; } - /// /// Paging info about the search results /// public QueryPaging Paging { get; set; } - /// /// How the search results should be sorted /// public QuerySorting Sort { get; set; } - /// /// Timeout for the search request in seconds /// diff --git a/src/ShareFile.Api.Client/Models/SortDirection.cs b/src/ShareFile.Api.Client/Models/SortDirection.cs index fdfedbd..327b21a 100644 --- a/src/ShareFile.Api.Client/Models/SortDirection.cs +++ b/src/ShareFile.Api.Client/Models/SortDirection.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum SortDirection + public enum SortDirection { None = 0, Ascending = 1, Descending = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/SortField.cs b/src/ShareFile.Api.Client/Models/SortField.cs index 76bc5db..13e797c 100644 --- a/src/ShareFile.Api.Client/Models/SortField.cs +++ b/src/ShareFile.Api.Client/Models/SortField.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum SortField + public enum SortField { UsersPreferences = 0, Name = 1, @@ -22,4 +22,4 @@ public enum SortField Type = 6, None = 7 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/StorageCenter.cs b/src/ShareFile.Api.Client/Models/StorageCenter.cs index f40bca6..a78e18c 100644 --- a/src/ShareFile.Api.Client/Models/StorageCenter.cs +++ b/src/ShareFile.Api.Client/Models/StorageCenter.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,37 +17,26 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class StorageCenter : ODataObject { - public Zone Zone { get; set; } - public string Address { get; set; } - public string LocalAddress { get; set; } - public string ExternalAddress { get; set; } - public string DefaultExternalUrl { get; set; } - public string HostName { get; set; } - public SafeEnum Services { get; set; } - public string Version { get; set; } - public bool? Enabled { get; set; } - public DateTime? LastHeartBeat { get; set; } - public string ExternalUrl { get; set; } - public string MetadataProxyAddress { get; set; } - public DateTime? LastPingBack { get; set; } - + /// + /// List of metadata objects associated with this zone + /// public IEnumerable Metadata { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/StorageCenterUrls.cs b/src/ShareFile.Api.Client/Models/StorageCenterUrls.cs new file mode 100644 index 0000000..36cfd45 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/StorageCenterUrls.cs @@ -0,0 +1,49 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class StorageCenterUrls : ODataObject + { + /// + /// HealthStats endpoint url + /// + public Uri HealthStatsUrl { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as StorageCenterUrls; + if(typedSource != null) + { + HealthStatsUrl = typedSource.HealthStatsUrl; + } + else + { + JToken token; + if(source.TryGetProperty("HealthStatsUrl", out token) && token.Type != JTokenType.Null) + { + HealthStatsUrl = (Uri)serializer.Deserialize(token.CreateReader(), typeof(Uri)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/StoragePolicy.cs b/src/ShareFile.Api.Client/Models/StoragePolicy.cs index ef821b6..dff57ee 100644 --- a/src/ShareFile.Api.Client/Models/StoragePolicy.cs +++ b/src/ShareFile.Api.Client/Models/StoragePolicy.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,16 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a Storage Category Policy definition for use within ShareFile's Policy Based Administration + /// public class StoragePolicy : Policy { - + /// + /// The settings managed for this Policy + /// public StorageSettings Settings { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/StorageSettings.cs b/src/ShareFile.Api.Client/Models/StorageSettings.cs index 76860bb..3f9fdcb 100644 --- a/src/ShareFile.Api.Client/Models/StorageSettings.cs +++ b/src/ShareFile.Api.Client/Models/StorageSettings.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,13 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents the settings applicable to a Storage Category Policy definition for use within ShareFile's Policy Based Administration + /// public class StorageSettings : ODataObject { - public string StorageZoneId { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/SubdomainAvailabilityResult.cs b/src/ShareFile.Api.Client/Models/SubdomainAvailabilityResult.cs new file mode 100644 index 0000000..5b2cff0 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/SubdomainAvailabilityResult.cs @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Response object for SubdomainAvailability requests. + /// + public class SubdomainAvailabilityResult : ODataObject + { + /// + /// Indicates if subdomain is available to claim for an account + /// + public bool IsSubdomainAvailable { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as SubdomainAvailabilityResult; + if(typedSource != null) + { + IsSubdomainAvailable = typedSource.IsSubdomainAvailable; + } + else + { + JToken token; + if(source.TryGetProperty("IsSubdomainAvailable", out token) && token.Type != JTokenType.Null) + { + IsSubdomainAvailable = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/SubscribedResourceEvent.cs b/src/ShareFile.Api.Client/Models/SubscribedResourceEvent.cs new file mode 100644 index 0000000..976d211 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/SubscribedResourceEvent.cs @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// The event type a subscription will process + /// + public class SubscribedResourceEvent : ODataObject + { + /// + /// The Event Resource Type + /// + public string ResourceType { get; set; } + /// + /// The Event Operation Name + /// + public string OperationName { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as SubscribedResourceEvent; + if(typedSource != null) + { + ResourceType = typedSource.ResourceType; + OperationName = typedSource.OperationName; + } + else + { + JToken token; + if(source.TryGetProperty("ResourceType", out token) && token.Type != JTokenType.Null) + { + ResourceType = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("OperationName", out token) && token.Type != JTokenType.Null) + { + OperationName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/SubscriptionContext.cs b/src/ShareFile.Api.Client/Models/SubscriptionContext.cs new file mode 100644 index 0000000..6f436ec --- /dev/null +++ b/src/ShareFile.Api.Client/Models/SubscriptionContext.cs @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// The context for Webhook Subscription, allowing a constraint on which events are received + /// + public class SubscriptionContext : ODataObject + { + /// + /// The Context Resource Type + /// + public string ResourceType { get; set; } + /// + /// The Context Resource Id, Can only be empty for Account Context + /// + public string ResourceId { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as SubscriptionContext; + if(typedSource != null) + { + ResourceType = typedSource.ResourceType; + ResourceId = typedSource.ResourceId; + } + else + { + JToken token; + if(source.TryGetProperty("ResourceType", out token) && token.Type != JTokenType.Null) + { + ResourceType = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ResourceId", out token) && token.Type != JTokenType.Null) + { + ResourceId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/Support.cs b/src/ShareFile.Api.Client/Models/Support.cs new file mode 100644 index 0000000..b4fe6cb --- /dev/null +++ b/src/ShareFile.Api.Client/Models/Support.cs @@ -0,0 +1,94 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class Support : ODataObject + { + public IEnumerable EmailAddresses { get; set; } + public IEnumerable PhoneNumbers { get; set; } + public string KBUrl { get; set; } + public string KBSearchUrl { get; set; } + public bool? ShowLiveChat { get; set; } + public bool? ShowAccountManager { get; set; } + public string TicketTarget { get; set; } + public bool? IsCustom { get; set; } + public bool? ShowFeedback { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as Support; + if(typedSource != null) + { + EmailAddresses = typedSource.EmailAddresses; + PhoneNumbers = typedSource.PhoneNumbers; + KBUrl = typedSource.KBUrl; + KBSearchUrl = typedSource.KBSearchUrl; + ShowLiveChat = typedSource.ShowLiveChat; + ShowAccountManager = typedSource.ShowAccountManager; + TicketTarget = typedSource.TicketTarget; + IsCustom = typedSource.IsCustom; + ShowFeedback = typedSource.ShowFeedback; + } + else + { + JToken token; + if(source.TryGetProperty("EmailAddresses", out token) && token.Type != JTokenType.Null) + { + EmailAddresses = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("PhoneNumbers", out token) && token.Type != JTokenType.Null) + { + PhoneNumbers = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("KBUrl", out token) && token.Type != JTokenType.Null) + { + KBUrl = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("KBSearchUrl", out token) && token.Type != JTokenType.Null) + { + KBSearchUrl = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ShowLiveChat", out token) && token.Type != JTokenType.Null) + { + ShowLiveChat = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("ShowAccountManager", out token) && token.Type != JTokenType.Null) + { + ShowAccountManager = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("TicketTarget", out token) && token.Type != JTokenType.Null) + { + TicketTarget = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("IsCustom", out token) && token.Type != JTokenType.Null) + { + IsCustom = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("ShowFeedback", out token) && token.Type != JTokenType.Null) + { + ShowFeedback = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/SupportFeedback.cs b/src/ShareFile.Api.Client/Models/SupportFeedback.cs new file mode 100644 index 0000000..210055a --- /dev/null +++ b/src/ShareFile.Api.Client/Models/SupportFeedback.cs @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class SupportFeedback : ODataObject + { + public int? Rating { get; set; } + public string Comments { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as SupportFeedback; + if(typedSource != null) + { + Rating = typedSource.Rating; + Comments = typedSource.Comments; + } + else + { + JToken token; + if(source.TryGetProperty("Rating", out token) && token.Type != JTokenType.Null) + { + Rating = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("Comments", out token) && token.Type != JTokenType.Null) + { + Comments = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/SupportMethod.cs b/src/ShareFile.Api.Client/Models/SupportMethod.cs new file mode 100644 index 0000000..c33a65f --- /dev/null +++ b/src/ShareFile.Api.Client/Models/SupportMethod.cs @@ -0,0 +1,70 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class SupportMethod : ODataObject + { + public int Order { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string Region { get; set; } + public bool ShowAlways { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as SupportMethod; + if(typedSource != null) + { + Order = typedSource.Order; + Name = typedSource.Name; + Description = typedSource.Description; + Region = typedSource.Region; + ShowAlways = typedSource.ShowAlways; + } + else + { + JToken token; + if(source.TryGetProperty("Order", out token) && token.Type != JTokenType.Null) + { + Order = (int)serializer.Deserialize(token.CreateReader(), typeof(int)); + } + if(source.TryGetProperty("Name", out token) && token.Type != JTokenType.Null) + { + Name = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Description", out token) && token.Type != JTokenType.Null) + { + Description = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Region", out token) && token.Type != JTokenType.Null) + { + Region = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ShowAlways", out token) && token.Type != JTokenType.Null) + { + ShowAlways = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/SymbolicLink.cs b/src/ShareFile.Api.Client/Models/SymbolicLink.cs index ac5e7d1..24bf2ef 100644 --- a/src/ShareFile.Api.Client/Models/SymbolicLink.cs +++ b/src/ShareFile.Api.Client/Models/SymbolicLink.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,13 +17,19 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Symbolic Links represent a remote folder in a ShareFile file system structure. A + /// Symbolic Link uses the URL field to point to another provider. Client must query + /// the url location to retrieve Item information. In some cases, the Symbolic Link + /// fields may be populated in the remote provider - for example, Storage Zone Connectors + /// populate the "Name" field in the ShareFile provider. In this case, clients can use + /// the available fields without the remote call to the provider. + /// public class SymbolicLink : Folder { - public Uri Link { get; set; } - public ConnectorGroup ConnectorGroup { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/TenantAccountCreationParameters.cs b/src/ShareFile.Api.Client/Models/TenantAccountCreationParameters.cs new file mode 100644 index 0000000..ae7440c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/TenantAccountCreationParameters.cs @@ -0,0 +1,76 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class TenantAccountCreationParameters : ODataObject + { + /// + /// Account to be assigned as Partner + /// + public string PartnerAccountId { get; set; } + /// + /// AccountId to be added as Tenant - Required + /// + public string TenantAccountId { get; set; } + /// + /// Email from Partner Account user to be added as Admin for the Tenant - Required + /// + public string PartnerAdminEmail { get; set; } + /// + /// MultiTenantZone to be added to Tenant - Optional + /// + public string MultiTenantZoneId { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as TenantAccountCreationParameters; + if(typedSource != null) + { + PartnerAccountId = typedSource.PartnerAccountId; + TenantAccountId = typedSource.TenantAccountId; + PartnerAdminEmail = typedSource.PartnerAdminEmail; + MultiTenantZoneId = typedSource.MultiTenantZoneId; + } + else + { + JToken token; + if(source.TryGetProperty("PartnerAccountId", out token) && token.Type != JTokenType.Null) + { + PartnerAccountId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("TenantAccountId", out token) && token.Type != JTokenType.Null) + { + TenantAccountId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("PartnerAdminEmail", out token) && token.Type != JTokenType.Null) + { + PartnerAdminEmail = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("MultiTenantZoneId", out token) && token.Type != JTokenType.Null) + { + MultiTenantZoneId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/TenantZoneUsageReport.cs b/src/ShareFile.Api.Client/Models/TenantZoneUsageReport.cs index d5f7629..fccc9a3 100644 --- a/src/ShareFile.Api.Client/Models/TenantZoneUsageReport.cs +++ b/src/ShareFile.Api.Client/Models/TenantZoneUsageReport.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,10 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class TenantZoneUsageReport : ODataObject { - public IDictionary TenantsToZones { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ToolInformation.cs b/src/ShareFile.Api.Client/Models/ToolInformation.cs index 02a6191..933c71f 100644 --- a/src/ShareFile.Api.Client/Models/ToolInformation.cs +++ b/src/ShareFile.Api.Client/Models/ToolInformation.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,16 +17,17 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Outlook Information + /// public class ToolInformation : ODataObject { - /// /// Tool Name /// public string ToolName { get; set; } - /// /// Tool Version /// diff --git a/src/ShareFile.Api.Client/Models/TreeMode.cs b/src/ShareFile.Api.Client/Models/TreeMode.cs index 1088c57..6172cdc 100644 --- a/src/ShareFile.Api.Client/Models/TreeMode.cs +++ b/src/ShareFile.Api.Client/Models/TreeMode.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum TreeMode + public enum TreeMode { Standard = 0, Copy = 1, @@ -19,4 +19,4 @@ public enum TreeMode Sync = 3, Manage = 4 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/TwoFactorAuthApp.cs b/src/ShareFile.Api.Client/Models/TwoFactorAuthApp.cs new file mode 100644 index 0000000..456b206 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/TwoFactorAuthApp.cs @@ -0,0 +1,79 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Represents a device or application that provides a Two Factor Authentication login code + /// + public class TwoFactorAuthApp : ODataObject + { + /// + /// TFA App Name + /// + public string Name { get; set; } + /// + /// Last Login Date for the TFA App + /// + public DateTime? LastLoginDate { get; set; } + /// + /// The type of Passcode, such as Cookie, associated with this App + /// + public SafeEnum PasscodeType { get; set; } + /// + /// User associated with the TFA App + /// + public string UserId { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as TwoFactorAuthApp; + if(typedSource != null) + { + Name = typedSource.Name; + LastLoginDate = typedSource.LastLoginDate; + PasscodeType = typedSource.PasscodeType; + UserId = typedSource.UserId; + } + else + { + JToken token; + if(source.TryGetProperty("Name", out token) && token.Type != JTokenType.Null) + { + Name = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("LastLoginDate", out token) && token.Type != JTokenType.Null) + { + LastLoginDate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + if(source.TryGetProperty("PasscodeType", out token) && token.Type != JTokenType.Null) + { + PasscodeType = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); + } + if(source.TryGetProperty("UserId", out token) && token.Type != JTokenType.Null) + { + UserId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/TwoFactorAuthPasscodeType.cs b/src/ShareFile.Api.Client/Models/TwoFactorAuthPasscodeType.cs new file mode 100644 index 0000000..ef391e4 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/TwoFactorAuthPasscodeType.cs @@ -0,0 +1,20 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +namespace ShareFile.Api.Client.Models +{ + public enum TwoFactorAuthPasscodeType + { + OneTime = 0, + ApplicationSpecific = 1, + Cookie = 2 + } +} diff --git a/src/ShareFile.Api.Client/Models/TypeOfTour.cs b/src/ShareFile.Api.Client/Models/TypeOfTour.cs index 241621c..94dd046 100644 --- a/src/ShareFile.Api.Client/Models/TypeOfTour.cs +++ b/src/ShareFile.Api.Client/Models/TypeOfTour.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum TypeOfTour + public enum TypeOfTour { NoTour = 0, Welcome = 1, @@ -27,4 +27,4 @@ public enum TypeOfTour ScanSnap = 11, CheckInCheckOut = 12 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/UXMode.cs b/src/ShareFile.Api.Client/Models/UXMode.cs index 6c3c5d8..93623d6 100644 --- a/src/ShareFile.Api.Client/Models/UXMode.cs +++ b/src/ShareFile.Api.Client/Models/UXMode.cs @@ -5,15 +5,15 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum UXMode + public enum UXMode { Classic = 0, TabView = 1 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/UploadMethod.cs b/src/ShareFile.Api.Client/Models/UploadMethod.cs index 4c22567..d5a947b 100644 --- a/src/ShareFile.Api.Client/Models/UploadMethod.cs +++ b/src/ShareFile.Api.Client/Models/UploadMethod.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum UploadMethod + public enum UploadMethod { Standard = 0, Streamed = 1, Threaded = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/UploadRequestParams.cs b/src/ShareFile.Api.Client/Models/UploadRequestParams.cs index 6c7e56d..7f0db9d 100644 --- a/src/ShareFile.Api.Client/Models/UploadRequestParams.cs +++ b/src/ShareFile.Api.Client/Models/UploadRequestParams.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,50 +17,36 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class UploadRequestParams : ODataObject { - public SafeEnum Method { get; set; } - public bool? Raw { get; set; } - public string FileName { get; set; } - public long? FileSize { get; set; } - public string BatchId { get; set; } - public bool? BatchLast { get; set; } - public bool? CanResume { get; set; } - public bool? StartOver { get; set; } - public bool? Unzip { get; set; } - public bool? Overwrite { get; set; } - public string Opid { get; set; } - public string Title { get; set; } - public string Tool { get; set; } - public string Details { get; set; } - public bool? IsSend { get; set; } - public string SendGuid { get; set; } - public bool? Notify { get; set; } - public int? ThreadCount { get; set; } - public DateTime? ClientCreatedDate { get; set; } - public DateTime? ClientModifiedDate { get; set; } + /// + /// BaseFileId is a used to check conflict in file during File Upload. + /// BaseFileId is passed by client and contains value of their local copy itemId. + /// API will check if the version passed is still current or someone else has updated file since clients last read. + /// + public string BaseFileId { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -90,6 +76,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) ThreadCount = typedSource.ThreadCount; ClientCreatedDate = typedSource.ClientCreatedDate; ClientModifiedDate = typedSource.ClientModifiedDate; + BaseFileId = typedSource.BaseFileId; } else { @@ -174,6 +161,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { ClientModifiedDate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); } + if(source.TryGetProperty("BaseFileId", out token) && token.Type != JTokenType.Null) + { + BaseFileId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/UploadSpecification.cs b/src/ShareFile.Api.Client/Models/UploadSpecification.cs index 641c3a1..c422f8b 100644 --- a/src/ShareFile.Api.Client/Models/UploadSpecification.cs +++ b/src/ShareFile.Api.Client/Models/UploadSpecification.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,56 +17,50 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Upload Specifications contain the necessary information for uploading new files to + /// a ShareFile provider. + /// public class UploadSpecification : ODataObject { - /// /// The Upload method that must be used for this upload /// public SafeEnum Method { get; set; } - /// /// If provided, clients must issue a request to this Uri before uploading any data. /// public Uri PrepareUri { get; set; } - /// /// Specifies the URI the client must send the file data to /// public Uri ChunkUri { get; set; } - /// /// If provided, specifies the final call the client must perform to finish the upload process /// public Uri FinishUri { get; set; } - /// /// Allows the client to check progress of standard uploads /// public string ProgressData { get; set; } - /// /// Specifies a Resumable upload is supproted. /// public bool IsResume { get; set; } - /// /// Specifies the initial index for resuming, if IsResume is true. /// public long ResumeIndex { get; set; } - /// /// Specifies the initial file offset by bytes, if IsResume is true /// public long ResumeOffset { get; set; } - /// /// Specifies the MD5 hash of the first ResumeOffset bytes of the partial file found at the server /// public string ResumeFileHash { get; set; } - /// /// Specifies the max number of chunks that can be sent simultaneously for threaded uploads /// diff --git a/src/ShareFile.Api.Client/Models/User.cs b/src/ShareFile.Api.Client/Models/User.cs index 8df6ef5..3590e2d 100644 --- a/src/ShareFile.Api.Client/Models/User.cs +++ b/src/ShareFile.Api.Client/Models/User.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,60 +17,54 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { +#if !ShareFile + /// + /// User + /// public class User : Principal { - public Account Account { get; set; } - public string Company { get; set; } - public int? TotalSharedFiles { get; set; } - public int? Contacted { get; set; } - + /// + /// The first and last name of the user + /// public string FullName { get; set; } - public string ReferredBy { get; set; } - - public IEnumerable Notifications { get; set; } - public Zone DefaultZone { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } - public DateTime? DateCreated { get; set; } - public string FullNameShort { get; set; } - public IEnumerable Emails { get; set; } - + public IEnumerable EmailAddresses { get; set; } public bool? IsConfirmed { get; set; } - + public bool? IsDeleted { get; set; } public string Password { get; set; } - public UserPreferences Preferences { get; set; } - public UserSecurity Security { get; set; } - + /// + /// This property would be deprecated in favor of the new property 'Favorites' + /// public IEnumerable FavoriteFolders { get; set; } - public Folder HomeFolder { get; set; } - public IEnumerable Devices { get; set; } - public IEnumerable> Integrations { get; set; } - public Folder VirtualRoot { get; set; } - public IEnumerable> Roles { get; set; } - public UserInfo Info { get; set; } - public string AffiliatedPartnerUserId { get; set; } + /// + /// List of Favorite items associated with the user + /// + public IEnumerable Favorites { get; set; } + /// + /// List of Groups the user belongs. Only available when authenticated user and user match. + /// + public IEnumerable Groups { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -86,14 +80,15 @@ public override void Copy(ODataObject source, JsonSerializer serializer) Contacted = typedSource.Contacted; FullName = typedSource.FullName; ReferredBy = typedSource.ReferredBy; - Notifications = typedSource.Notifications; DefaultZone = typedSource.DefaultZone; FirstName = typedSource.FirstName; LastName = typedSource.LastName; DateCreated = typedSource.DateCreated; FullNameShort = typedSource.FullNameShort; Emails = typedSource.Emails; + EmailAddresses = typedSource.EmailAddresses; IsConfirmed = typedSource.IsConfirmed; + IsDeleted = typedSource.IsDeleted; Password = typedSource.Password; Preferences = typedSource.Preferences; Security = typedSource.Security; @@ -105,6 +100,8 @@ public override void Copy(ODataObject source, JsonSerializer serializer) Roles = typedSource.Roles; Info = typedSource.Info; AffiliatedPartnerUserId = typedSource.AffiliatedPartnerUserId; + Favorites = typedSource.Favorites; + Groups = typedSource.Groups; } else { @@ -133,10 +130,6 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { ReferredBy = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); } - if(source.TryGetProperty("Notifications", out token) && token.Type != JTokenType.Null) - { - Notifications = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); - } if(source.TryGetProperty("DefaultZone", out token) && token.Type != JTokenType.Null) { DefaultZone = (Zone)serializer.Deserialize(token.CreateReader(), typeof(Zone)); @@ -161,10 +154,18 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { Emails = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); } + if(source.TryGetProperty("EmailAddresses", out token) && token.Type != JTokenType.Null) + { + EmailAddresses = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } if(source.TryGetProperty("IsConfirmed", out token) && token.Type != JTokenType.Null) { IsConfirmed = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); } + if(source.TryGetProperty("IsDeleted", out token) && token.Type != JTokenType.Null) + { + IsDeleted = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } if(source.TryGetProperty("Password", out token) && token.Type != JTokenType.Null) { Password = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); @@ -209,7 +210,16 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { AffiliatedPartnerUserId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); } + if(source.TryGetProperty("Favorites", out token) && token.Type != JTokenType.Null) + { + Favorites = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("Groups", out token) && token.Type != JTokenType.Null) + { + Groups = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } } } } +#endif } \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/UserAccessPolicy.cs b/src/ShareFile.Api.Client/Models/UserAccessPolicy.cs index e28804d..b2877be 100644 --- a/src/ShareFile.Api.Client/Models/UserAccessPolicy.cs +++ b/src/ShareFile.Api.Client/Models/UserAccessPolicy.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,16 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a User Access Category Policy definition for use within ShareFile's Policy Based Administration + /// public class UserAccessPolicy : Policy { - + /// + /// The settings managed for this Policy + /// public UserAccessSettings Settings { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/UserAccessSettings.cs b/src/ShareFile.Api.Client/Models/UserAccessSettings.cs index 2c41617..a384239 100644 --- a/src/ShareFile.Api.Client/Models/UserAccessSettings.cs +++ b/src/ShareFile.Api.Client/Models/UserAccessSettings.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,76 +17,161 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents the settings applicable to a User Access Category Policy definition for use within ShareFile's Policy Based Administration + /// public class UserAccessSettings : ODataObject { - + /// + /// Create root-level folders + /// public bool CanCreateFolders { get; set; } - + /// + /// Use Personal File Box + /// public bool CanUseFileBox { get; set; } - + /// + /// Manage Client Users + /// public bool CanManageUsers { get; set; } - + /// + /// Edit the shared address book + /// public bool CanAdminSharedAddressBook { get; set; } - + /// + /// Change his/her password + /// public bool CanChangePassword { get; set; } - + /// + /// See the ‘My settings’ link on the top navigation bar + /// public bool CanManageMySettings { get; set; } - + /// + /// Whether or not a user created with this policy assigned should be added to shared company address book + /// public bool AddToSharedAddressBook { get; set; } - + /// + /// Select storage zone for root-level folders + /// public bool CanSelectFolderZone { get; set; } - + /// + /// Create Network Share Connectors + /// public bool CreateNetworkShareConnectors { get; set; } - + /// + /// Create SharePoint Connectors + /// public bool CreateSharePointConnectors { get; set; } - + /// + /// Modify account-wide Settings + /// public bool CanAdminAccountSettings { get; set; } - + /// + /// Edit Account Appearance + /// public bool CanAdminBranding { get; set; } - + /// + /// Access other users' File Boxes and Sent Items + /// public bool CanAdminFileBoxAccess { get; set; } - + /// + /// View all emails + /// public bool CanAdminEmailMessages { get; set; } - + /// + /// Manage employee users + /// public bool CanAdminManageEmployees { get; set; } - + /// + /// Manage remote upload forms + /// public bool CanAdminRemoteUploadForms { get; set; } - + /// + /// Access account-wide reporting + /// public bool CanAdminReporting { get; set; } - + /// + /// Create shared distribution groups + /// public bool CanAdminCreateSharedGroups { get; set; } - + /// + /// Edit shared distribution groups + /// public bool CanAdminSharedDistGroups { get; set; } - + /// + /// View receipts/invoices + /// public bool CanAdminViewReceipts { get; set; } - + /// + /// Edit billing information + /// public bool CanAdminBilling { get; set; } - + /// + /// Request plan changes + /// public bool CanAdminChangePlan { get; set; } - + /// + /// Configure single sign-on settings + /// public bool CanAdminSSO { get; set; } - + /// + /// Manage Super User Group membership + /// public bool CanAdminSuperGroup { get; set; } - + /// + /// Delegate admin privileges to other employee users + /// public bool CanAdminDelegate { get; set; } - + /// + /// Create and manage Zones + /// public bool CanAdminZones { get; set; } - + /// + /// Create and manage Connectors + /// public bool CanAdminConnectors { get; set; } - + /// + /// Manage Tenants + /// public bool CanAdminCanAdministerCustomerAccount { get; set; } - + /// + /// Create and manage account policies + /// public bool CanManageAccountPolicies { get; set; } - + /// + /// Can be added to file drops (drop box) + /// public bool CanUseFileDrops { get; set; } - + /// + /// Create and manage file drops (drop box) + /// public bool CanManageFileDrops { get; set; } - + /// + /// Create and manage folder templates + /// public bool CanManageFolderTemplates { get; set; } - + /// + /// Perform archived search + /// public bool CanPerformArchivedSearch { get; set; } + /// + /// Create and manage custom workflows + /// + public bool CanAdminCustomWorkflows { get; set; } + /// + /// Can send documents for signature in RightSignature + /// + public bool CanSendDocumentsForSignature { get; set; } + /// + /// Can view all RightSignature documents + /// + public bool CanViewSignatureDocuments { get; set; } + /// + /// Can manage RightSignature templates + /// + public bool CanManageSignatureTemplates { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) { @@ -129,6 +214,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) CanManageFileDrops = typedSource.CanManageFileDrops; CanManageFolderTemplates = typedSource.CanManageFolderTemplates; CanPerformArchivedSearch = typedSource.CanPerformArchivedSearch; + CanAdminCustomWorkflows = typedSource.CanAdminCustomWorkflows; + CanSendDocumentsForSignature = typedSource.CanSendDocumentsForSignature; + CanViewSignatureDocuments = typedSource.CanViewSignatureDocuments; + CanManageSignatureTemplates = typedSource.CanManageSignatureTemplates; } else { @@ -265,6 +354,22 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { CanPerformArchivedSearch = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); } + if(source.TryGetProperty("CanAdminCustomWorkflows", out token) && token.Type != JTokenType.Null) + { + CanAdminCustomWorkflows = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + if(source.TryGetProperty("CanSendDocumentsForSignature", out token) && token.Type != JTokenType.Null) + { + CanSendDocumentsForSignature = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + if(source.TryGetProperty("CanViewSignatureDocuments", out token) && token.Type != JTokenType.Null) + { + CanViewSignatureDocuments = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + if(source.TryGetProperty("CanManageSignatureTemplates", out token) && token.Type != JTokenType.Null) + { + CanManageSignatureTemplates = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } } } } diff --git a/src/ShareFile.Api.Client/Models/UserAuthenticationType.cs b/src/ShareFile.Api.Client/Models/UserAuthenticationType.cs index 09730a5..a4e3b25 100644 --- a/src/ShareFile.Api.Client/Models/UserAuthenticationType.cs +++ b/src/ShareFile.Api.Client/Models/UserAuthenticationType.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum UserAuthenticationType + public enum UserAuthenticationType { Basic = 0, TwoFactor = 1, SAML = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/UserBulkDowngradeRequest.cs b/src/ShareFile.Api.Client/Models/UserBulkDowngradeRequest.cs new file mode 100644 index 0000000..f803817 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/UserBulkDowngradeRequest.cs @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// User Bulk Downgrade Request + /// + public class UserBulkDowngradeRequest : UserBulkOperationRequest + { + /// + /// If provided, all users in this bulk operation have their items reassigned to this user id + /// + public string ReassignItemsToId { get; set; } + /// + /// If provided, all users in this bulk operation have their groups reassigned to this user id + /// + public string ReassignGroupsToId { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as UserBulkDowngradeRequest; + if(typedSource != null) + { + ReassignItemsToId = typedSource.ReassignItemsToId; + ReassignGroupsToId = typedSource.ReassignGroupsToId; + } + else + { + JToken token; + if(source.TryGetProperty("ReassignItemsToId", out token) && token.Type != JTokenType.Null) + { + ReassignItemsToId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("ReassignGroupsToId", out token) && token.Type != JTokenType.Null) + { + ReassignGroupsToId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/UserBulkOperationRequest.cs b/src/ShareFile.Api.Client/Models/UserBulkOperationRequest.cs new file mode 100644 index 0000000..ee84be2 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/UserBulkOperationRequest.cs @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// User Bulk Operation Request + /// + public class UserBulkOperationRequest : ODataObject + { + /// + /// List of user ids to perform this operation on + /// + public IEnumerable UserIds { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as UserBulkOperationRequest; + if(typedSource != null) + { + UserIds = typedSource.UserIds; + } + else + { + JToken token; + if(source.TryGetProperty("UserIds", out token) && token.Type != JTokenType.Null) + { + UserIds = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/UserConfirmRequirement.cs b/src/ShareFile.Api.Client/Models/UserConfirmRequirement.cs index f8ddadc..5b8b827 100644 --- a/src/ShareFile.Api.Client/Models/UserConfirmRequirement.cs +++ b/src/ShareFile.Api.Client/Models/UserConfirmRequirement.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,20 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// The parameters we need for user confirm flow + /// public class UserConfirmRequirement : ODataObject { - public string AuthenticationId { get; set; } - public bool IsProbableSAMLOnlyUser { get; set; } - public bool IsADLinked { get; set; } - public string ADUserName { get; set; } - public string TempPassword { get; set; } - + public bool IsUnlicensedUser { get; set; } + public ClientUpgradeWeb ClientUpgradeWeb { get; set; } public User User { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) @@ -47,6 +46,8 @@ public override void Copy(ODataObject source, JsonSerializer serializer) IsADLinked = typedSource.IsADLinked; ADUserName = typedSource.ADUserName; TempPassword = typedSource.TempPassword; + IsUnlicensedUser = typedSource.IsUnlicensedUser; + ClientUpgradeWeb = typedSource.ClientUpgradeWeb; User = typedSource.User; } else @@ -72,6 +73,14 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { TempPassword = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); } + if(source.TryGetProperty("IsUnlicensedUser", out token) && token.Type != JTokenType.Null) + { + IsUnlicensedUser = (bool)serializer.Deserialize(token.CreateReader(), typeof(bool)); + } + if(source.TryGetProperty("ClientUpgradeWeb", out token) && token.Type != JTokenType.Null) + { + ClientUpgradeWeb = (ClientUpgradeWeb)serializer.Deserialize(token.CreateReader(), typeof(ClientUpgradeWeb)); + } if(source.TryGetProperty("User", out token) && token.Type != JTokenType.Null) { User = (User)serializer.Deserialize(token.CreateReader(), typeof(User)); diff --git a/src/ShareFile.Api.Client/Models/UserConfirmationSettings.cs b/src/ShareFile.Api.Client/Models/UserConfirmationSettings.cs index 7abd0f2..525297e 100644 --- a/src/ShareFile.Api.Client/Models/UserConfirmationSettings.cs +++ b/src/ShareFile.Api.Client/Models/UserConfirmationSettings.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,71 +17,65 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// User Confirmation Settings + /// public class UserConfirmationSettings : ODataObject { - /// /// First Name /// public string FirstName { get; set; } - /// /// Last Name /// public string LastName { get; set; } - /// /// Company /// public string Company { get; set; } - /// /// Password /// public string Password { get; set; } - /// /// Security Question /// public string SecurityQuestion { get; set; } - /// /// Answer for Security Question /// public string SecurityQuestionAnswer { get; set; } - /// /// DayLightName /// public string DayLightName { get; set; } - /// /// UTC Offset /// public string UTCOffset { get; set; } - /// /// Preferred Date Format /// public string DateFormat { get; set; } - /// /// Preferred Time Format /// public string TimeFormat { get; set; } - /// /// Email notification interval for activities /// public int? EmailInterval { get; set; } - /// /// Email notification locale. Values: Invariant, English, German, Spanish, French, Dutch, Chinese, Russian, Japanese, Korean, or Portuguese /// public SafeEnum UserNotificationLocale { get; set; } - + /// + /// Webpop ClientId + /// + public string OAuthClientId { get; set; } /// /// Email address of the user /// @@ -107,6 +101,7 @@ public override void Copy(ODataObject source, JsonSerializer serializer) TimeFormat = typedSource.TimeFormat; EmailInterval = typedSource.EmailInterval; UserNotificationLocale = typedSource.UserNotificationLocale; + OAuthClientId = typedSource.OAuthClientId; Email = typedSource.Email; } else @@ -160,6 +155,10 @@ public override void Copy(ODataObject source, JsonSerializer serializer) { UserNotificationLocale = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); } + if(source.TryGetProperty("OAuthClientId", out token) && token.Type != JTokenType.Null) + { + OAuthClientId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } if(source.TryGetProperty("Email", out token) && token.Type != JTokenType.Null) { Email = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); diff --git a/src/ShareFile.Api.Client/Models/UserInfo.cs b/src/ShareFile.Api.Client/Models/UserInfo.cs index 9196585..fc1ebd8 100644 --- a/src/ShareFile.Api.Client/Models/UserInfo.cs +++ b/src/ShareFile.Api.Client/Models/UserInfo.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,31 +17,29 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// UserInfo + /// public class UserInfo : ODataObject { - /// /// Company Name /// public string CompanyName { get; set; } - /// /// Plan Name /// public string PlanName { get; set; } - /// /// Plan Features /// public PlanFeatures PlanFeatures { get; set; } - /// /// Application URL /// public string ApplicationUrl { get; set; } - /// /// Default Storage Center Url /// diff --git a/src/ShareFile.Api.Client/Models/UserPolicy.cs b/src/ShareFile.Api.Client/Models/UserPolicy.cs index 8430aa6..24450df 100644 --- a/src/ShareFile.Api.Client/Models/UserPolicy.cs +++ b/src/ShareFile.Api.Client/Models/UserPolicy.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,15 +17,24 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Represents a Policy assignment to a User + /// public class UserPolicy : ODataObject { - + /// + /// User Identifier + /// public string UserId { get; set; } - + /// + /// Flag to indicate if this Policy is turned on for this User + /// public bool? Active { get; set; } - + /// + /// The Policy assigned + /// public Policy Policy { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/UserPreferences.cs b/src/ShareFile.Api.Client/Models/UserPreferences.cs index 5c7ce93..e5245b7 100644 --- a/src/ShareFile.Api.Client/Models/UserPreferences.cs +++ b/src/ShareFile.Api.Client/Models/UserPreferences.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,63 +17,39 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class UserPreferences : ODataObject { - public bool? EnableFlashUpload { get; set; } - public bool? EnableJavaUpload { get; set; } - public bool? EnableJavaDownload { get; set; } - public bool? RememberCustomMessages { get; set; } - public bool? RequireLoginByDefault { get; set; } - public bool? NotifyOnUploadByDefault { get; set; } - public bool? NotifyOnDownloadByDefault { get; set; } - public bool? CanResetPassword { get; set; } - public bool? CanViewMySettings { get; set; } - public bool? IsSharedUserAccount { get; set; } - public string TimeZone { get; set; } - public string DaylightSavingMode { get; set; } - public int? TimeZoneOffset { get; set; } - public int? TimeZoneOffsetMins { get; set; } - public bool? DisplayUserMessage { get; set; } - public string UserMessageCode { get; set; } - public int? NotificationInterval { get; set; } - public SafeEnum ShowTutorial { get; set; } - public int? EnableToolOverride { get; set; } - public bool? IsResetSecurityQuestionRequired { get; set; } - public string TimeFormat { get; set; } - public string LongTimeFormat { get; set; } - public string DateFormat { get; set; } - public bool? EnableShareConnect { get; set; } - public bool? ReceiveBouncedEmailNotifications { get; set; } - public bool? EnablePromotions { get; set; } - + /// + /// Email notification locale. Values: Invariant, English, German, Spanish, French, Dutch, Chinese, Russian, Japanese, Korean, or Portuguese + /// public SafeEnum UserNotificationLocale { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/UserRole.cs b/src/ShareFile.Api.Client/Models/UserRole.cs index 6157cfc..a112016 100644 --- a/src/ShareFile.Api.Client/Models/UserRole.cs +++ b/src/ShareFile.Api.Client/Models/UserRole.cs @@ -5,13 +5,17 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum UserRole + + /// + /// User Roles + /// + public enum UserRole { Client = 1, Employee = 2, @@ -33,6 +37,9 @@ public enum UserRole CreateDropboxConnectors = 41, CreateGoogleDriveConnectors = 42, CreateOneDriveBusinessConnectors = 43, + CanSendDocumentsForSignature = 44, + CanViewSignatureDocuments = 45, + CanManageSignatureTemplates = 46, AdminAccountPolicies = 50, AdminBilling = 51, AdminBranding = 52, @@ -58,6 +65,7 @@ public enum UserRole AdminConnectors = 72, AdminEmailArchiver = 73, AdminCanAdministerCustomerAccount = 74, - AdminPolicyDefinitions = 75 + AdminPolicyDefinitions = 75, + AdminCustomWorkflow = 76 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/UserSecurity.cs b/src/ShareFile.Api.Client/Models/UserSecurity.cs index e064db5..b401632 100644 --- a/src/ShareFile.Api.Client/Models/UserSecurity.cs +++ b/src/ShareFile.Api.Client/Models/UserSecurity.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,43 +17,29 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class UserSecurity : ODataObject { - public bool? IsDisabled { get; set; } - public bool? IsLocked { get; set; } - public DateTime? LockExpires { get; set; } - public DateTime? LastWebAppLogin { get; set; } - public DateTime? LastAnyLogin { get; set; } - public DateTime? FirstAnyLogin { get; set; } - public string UserIPRestrictions { get; set; } - public DateTime? DisableLoginBefore { get; set; } - public DateTime? DisableLoginAfter { get; set; } - public bool? ForcePasswordChange { get; set; } - public bool? PasswordNeverExpires { get; set; } - public DateTime? LastPasswordChange { get; set; } - public string UsernameShort { get; set; } - public DateTime? LastFailedLogin { get; set; } - public string LastFailedLoginIP { get; set; } - public int? FailedLoginCount { get; set; } - + /// + /// Calculated value for how the user should authenticate + /// public SafeEnum UserAuthenticationType { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/UserSummaryReportFilter.cs b/src/ShareFile.Api.Client/Models/UserSummaryReportFilter.cs new file mode 100644 index 0000000..079e3b9 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/UserSummaryReportFilter.cs @@ -0,0 +1,112 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class UserSummaryReportFilter : ReportFilter + { + /// + /// Include Employee Users in the output + /// + public bool? IncludeEmployees { get; set; } + /// + /// Include Client Users in the output + /// + public bool? IncludeClients { get; set; } + /// + /// Include Users that have logged in at least once + /// + public bool? IncludeUsersThatHaveLoggedIn { get; set; } + /// + /// Include Users that have not logged in + /// + public bool? IncludeUsersThatHaveNotLoggedIn { get; set; } + /// + /// Include Users that are disabled (Enabled Users are always included) + /// + public bool? IncludeDisabledUsers { get; set; } + /// + /// Include Users that are in the Shared Address Book + /// + public bool? IncludeSharedAddressBookUsers { get; set; } + /// + /// Include Users that have a Quota assigned to them (Users with no Quota are always included) + /// + public bool? IncludeUsersWithAssignedQuota { get; set; } + /// + /// Include Users that have at least one Policy assigned to them (Users with no Policies are always included) + /// + public bool? IncludeUsersWithAssignedPolicies { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as UserSummaryReportFilter; + if(typedSource != null) + { + IncludeEmployees = typedSource.IncludeEmployees; + IncludeClients = typedSource.IncludeClients; + IncludeUsersThatHaveLoggedIn = typedSource.IncludeUsersThatHaveLoggedIn; + IncludeUsersThatHaveNotLoggedIn = typedSource.IncludeUsersThatHaveNotLoggedIn; + IncludeDisabledUsers = typedSource.IncludeDisabledUsers; + IncludeSharedAddressBookUsers = typedSource.IncludeSharedAddressBookUsers; + IncludeUsersWithAssignedQuota = typedSource.IncludeUsersWithAssignedQuota; + IncludeUsersWithAssignedPolicies = typedSource.IncludeUsersWithAssignedPolicies; + } + else + { + JToken token; + if(source.TryGetProperty("IncludeEmployees", out token) && token.Type != JTokenType.Null) + { + IncludeEmployees = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IncludeClients", out token) && token.Type != JTokenType.Null) + { + IncludeClients = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IncludeUsersThatHaveLoggedIn", out token) && token.Type != JTokenType.Null) + { + IncludeUsersThatHaveLoggedIn = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IncludeUsersThatHaveNotLoggedIn", out token) && token.Type != JTokenType.Null) + { + IncludeUsersThatHaveNotLoggedIn = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IncludeDisabledUsers", out token) && token.Type != JTokenType.Null) + { + IncludeDisabledUsers = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IncludeSharedAddressBookUsers", out token) && token.Type != JTokenType.Null) + { + IncludeSharedAddressBookUsers = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IncludeUsersWithAssignedQuota", out token) && token.Type != JTokenType.Null) + { + IncludeUsersWithAssignedQuota = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + if(source.TryGetProperty("IncludeUsersWithAssignedPolicies", out token) && token.Type != JTokenType.Null) + { + IncludeUsersWithAssignedPolicies = (bool?)serializer.Deserialize(token.CreateReader(), typeof(bool?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/UserUsage.cs b/src/ShareFile.Api.Client/Models/UserUsage.cs index d207e84..67704a6 100644 --- a/src/ShareFile.Api.Client/Models/UserUsage.cs +++ b/src/ShareFile.Api.Client/Models/UserUsage.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,21 +17,21 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// The current usage statistics for the number of Employee and Client Users on the Account + /// public class UserUsage : ODataObject { - /// /// Max number of employee users. /// public int? EmployeeMax { get; set; } - /// /// Current number of employee users. /// public int? EmployeeCount { get; set; } - /// /// Current number of client users. /// diff --git a/src/ShareFile.Api.Client/Models/VRootType.cs b/src/ShareFile.Api.Client/Models/VRootType.cs index c00abaf..474b618 100644 --- a/src/ShareFile.Api.Client/Models/VRootType.cs +++ b/src/ShareFile.Api.Client/Models/VRootType.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum VRootType + public enum VRootType { Account = 0, Virtual = 1, @@ -22,4 +22,4 @@ public enum VRootType ForcedDefault = 254, Default = 255 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/Versioning.cs b/src/ShareFile.Api.Client/Models/Versioning.cs index d0a52ef..149a27a 100644 --- a/src/ShareFile.Api.Client/Models/Versioning.cs +++ b/src/ShareFile.Api.Client/Models/Versioning.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum Versioning + public enum Versioning { Default = 0, Enabled = 1, Disabled = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/WatermarkedDownloads.cs b/src/ShareFile.Api.Client/Models/WatermarkedDownloads.cs index 7acb6d4..14bd199 100644 --- a/src/ShareFile.Api.Client/Models/WatermarkedDownloads.cs +++ b/src/ShareFile.Api.Client/Models/WatermarkedDownloads.cs @@ -5,16 +5,16 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum WatermarkedDownloads + public enum WatermarkedDownloads { Default = 0, Enabled = 1, Disabled = 2 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/WebhookCapabilities.cs b/src/ShareFile.Api.Client/Models/WebhookCapabilities.cs new file mode 100644 index 0000000..3eae495 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WebhookCapabilities.cs @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class WebhookCapabilities : ODataObject + { + public IEnumerable SupportedContexts { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as WebhookCapabilities; + if(typedSource != null) + { + SupportedContexts = typedSource.SupportedContexts; + } + else + { + JToken token; + if(source.TryGetProperty("SupportedContexts", out token) && token.Type != JTokenType.Null) + { + SupportedContexts = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/WebhookClient.cs b/src/ShareFile.Api.Client/Models/WebhookClient.cs new file mode 100644 index 0000000..70ac72c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WebhookClient.cs @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Information related to a specific ShareFile Client's webhook configuration + /// + public class WebhookClient : ODataObject + { + /// + /// ShareFile Client Identifier + /// + public string OAuthClientId { get; set; } + /// + /// The keys used to sign webhook payloads to verify ShareFile is the sender + /// + public WebhookSignatureKeys SignatureKeys { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as WebhookClient; + if(typedSource != null) + { + OAuthClientId = typedSource.OAuthClientId; + SignatureKeys = typedSource.SignatureKeys; + } + else + { + JToken token; + if(source.TryGetProperty("OAuthClientId", out token) && token.Type != JTokenType.Null) + { + OAuthClientId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("SignatureKeys", out token) && token.Type != JTokenType.Null) + { + SignatureKeys = (WebhookSignatureKeys)serializer.Deserialize(token.CreateReader(), typeof(WebhookSignatureKeys)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/WebhookSignatureKeys.cs b/src/ShareFile.Api.Client/Models/WebhookSignatureKeys.cs new file mode 100644 index 0000000..608335f --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WebhookSignatureKeys.cs @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Set of keys used to sign webhook payloads + /// + public class WebhookSignatureKeys : ODataObject + { + /// + /// The key used to sign the payload and placed in the SF-WEBHOOK-PRIMARY-SIGNATURE header + /// + public string PrimaryKey { get; set; } + /// + /// The key used to sign the payload and placed in the SF-WEBHOOK-SECONDARY-SIGNATURE header + /// + public string SecondaryKey { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as WebhookSignatureKeys; + if(typedSource != null) + { + PrimaryKey = typedSource.PrimaryKey; + SecondaryKey = typedSource.SecondaryKey; + } + else + { + JToken token; + if(source.TryGetProperty("PrimaryKey", out token) && token.Type != JTokenType.Null) + { + PrimaryKey = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("SecondaryKey", out token) && token.Type != JTokenType.Null) + { + SecondaryKey = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/WebhookSubscription.cs b/src/ShareFile.Api.Client/Models/WebhookSubscription.cs new file mode 100644 index 0000000..a43c780 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WebhookSubscription.cs @@ -0,0 +1,72 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ +#if !ShareFile + /// + /// Webhook Subscription + /// + public class WebhookSubscription : ODataObject + { + /// + /// Url where the Event payload will be posted to. + /// + public string WebhookUrl { get; set; } + /// + /// The Context of the Events to trigger upon + /// + public SubscriptionContext SubscriptionContext { get; set; } + /// + /// List of events to trigger upon + /// + public IEnumerable Events { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as WebhookSubscription; + if(typedSource != null) + { + WebhookUrl = typedSource.WebhookUrl; + SubscriptionContext = typedSource.SubscriptionContext; + Events = typedSource.Events; + } + else + { + JToken token; + if(source.TryGetProperty("WebhookUrl", out token) && token.Type != JTokenType.Null) + { + WebhookUrl = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("SubscriptionContext", out token) && token.Type != JTokenType.Null) + { + SubscriptionContext = (SubscriptionContext)serializer.Deserialize(token.CreateReader(), typeof(SubscriptionContext)); + } + if(source.TryGetProperty("Events", out token) && token.Type != JTokenType.Null) + { + Events = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +#endif +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/WebhookSupportedContext.cs b/src/ShareFile.Api.Client/Models/WebhookSupportedContext.cs new file mode 100644 index 0000000..a3cad1a --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WebhookSupportedContext.cs @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class WebhookSupportedContext : ODataObject + { + public string ResourceType { get; set; } + public IEnumerable Events { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as WebhookSupportedContext; + if(typedSource != null) + { + ResourceType = typedSource.ResourceType; + Events = typedSource.Events; + } + else + { + JToken token; + if(source.TryGetProperty("ResourceType", out token) && token.Type != JTokenType.Null) + { + ResourceType = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Events", out token) && token.Type != JTokenType.Null) + { + Events = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/WebhookSupportedEvents.cs b/src/ShareFile.Api.Client/Models/WebhookSupportedEvents.cs new file mode 100644 index 0000000..801710c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WebhookSupportedEvents.cs @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + public class WebhookSupportedEvents : ODataObject + { + public string ResourceType { get; set; } + public string OperationName { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as WebhookSupportedEvents; + if(typedSource != null) + { + ResourceType = typedSource.ResourceType; + OperationName = typedSource.OperationName; + } + else + { + JToken token; + if(source.TryGetProperty("ResourceType", out token) && token.Type != JTokenType.Null) + { + ResourceType = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("OperationName", out token) && token.Type != JTokenType.Null) + { + OperationName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/Workflow.cs b/src/ShareFile.Api.Client/Models/Workflow.cs new file mode 100644 index 0000000..72dd43a --- /dev/null +++ b/src/ShareFile.Api.Client/Models/Workflow.cs @@ -0,0 +1,121 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Represents a ShareFile Workflow + /// + public class Workflow : ODataObject + { + public DateTime? Created { get; set; } + public DateTime? Due { get; set; } + public DateTime? LastComment { get; set; } + public string StreamId { get; set; } + public string FileName { get; set; } + public string DisplayName { get; set; } + public Item Item { get; set; } + public SafeEnum Status { get; set; } + public DateTime? LastStatusUpdate { get; set; } + public IEnumerable Participants { get; set; } + public SafeEnum WorkflowType { get; set; } + public Uri ShareableLinkUrl { get; set; } + public int Version { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as Workflow; + if(typedSource != null) + { + Created = typedSource.Created; + Due = typedSource.Due; + LastComment = typedSource.LastComment; + StreamId = typedSource.StreamId; + FileName = typedSource.FileName; + DisplayName = typedSource.DisplayName; + Item = typedSource.Item; + Status = typedSource.Status; + LastStatusUpdate = typedSource.LastStatusUpdate; + Participants = typedSource.Participants; + WorkflowType = typedSource.WorkflowType; + ShareableLinkUrl = typedSource.ShareableLinkUrl; + Version = typedSource.Version; + } + else + { + JToken token; + if(source.TryGetProperty("Created", out token) && token.Type != JTokenType.Null) + { + Created = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + if(source.TryGetProperty("Due", out token) && token.Type != JTokenType.Null) + { + Due = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + if(source.TryGetProperty("LastComment", out token) && token.Type != JTokenType.Null) + { + LastComment = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + if(source.TryGetProperty("StreamId", out token) && token.Type != JTokenType.Null) + { + StreamId = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("FileName", out token) && token.Type != JTokenType.Null) + { + FileName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("DisplayName", out token) && token.Type != JTokenType.Null) + { + DisplayName = (string)serializer.Deserialize(token.CreateReader(), typeof(string)); + } + if(source.TryGetProperty("Item", out token) && token.Type != JTokenType.Null) + { + Item = (Item)serializer.Deserialize(token.CreateReader(), typeof(Item)); + } + if(source.TryGetProperty("Status", out token) && token.Type != JTokenType.Null) + { + Status = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); + } + if(source.TryGetProperty("LastStatusUpdate", out token) && token.Type != JTokenType.Null) + { + LastStatusUpdate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + if(source.TryGetProperty("Participants", out token) && token.Type != JTokenType.Null) + { + Participants = (IEnumerable)serializer.Deserialize(token.CreateReader(), typeof(IEnumerable)); + } + if(source.TryGetProperty("WorkflowType", out token) && token.Type != JTokenType.Null) + { + WorkflowType = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); + } + if(source.TryGetProperty("ShareableLinkUrl", out token) && token.Type != JTokenType.Null) + { + ShareableLinkUrl = (Uri)serializer.Deserialize(token.CreateReader(), typeof(Uri)); + } + if(source.TryGetProperty("Version", out token) && token.Type != JTokenType.Null) + { + Version = (int)serializer.Deserialize(token.CreateReader(), typeof(int)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/WorkflowParticipant.cs b/src/ShareFile.Api.Client/Models/WorkflowParticipant.cs new file mode 100644 index 0000000..22c0d02 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WorkflowParticipant.cs @@ -0,0 +1,73 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +using System.Collections.Generic; +using System.Net; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; + +namespace ShareFile.Api.Client.Models +{ + /// + /// Represents a participant in a Workflow. + /// + public class WorkflowParticipant : ODataObject + { + public int? Ordinal { get; set; } + public SafeEnum Role { get; set; } + public Contact Contact { get; set; } + public SafeEnum Status { get; set; } + public DateTime? LastStatusUpdate { get; set; } + + public override void Copy(ODataObject source, JsonSerializer serializer) + { + if(source == null || serializer == null) return; + base.Copy(source, serializer); + + var typedSource = source as WorkflowParticipant; + if(typedSource != null) + { + Ordinal = typedSource.Ordinal; + Role = typedSource.Role; + Contact = typedSource.Contact; + Status = typedSource.Status; + LastStatusUpdate = typedSource.LastStatusUpdate; + } + else + { + JToken token; + if(source.TryGetProperty("Ordinal", out token) && token.Type != JTokenType.Null) + { + Ordinal = (int?)serializer.Deserialize(token.CreateReader(), typeof(int?)); + } + if(source.TryGetProperty("Role", out token) && token.Type != JTokenType.Null) + { + Role = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); + } + if(source.TryGetProperty("Contact", out token) && token.Type != JTokenType.Null) + { + Contact = (Contact)serializer.Deserialize(token.CreateReader(), typeof(Contact)); + } + if(source.TryGetProperty("Status", out token) && token.Type != JTokenType.Null) + { + Status = (SafeEnum)serializer.Deserialize(token.CreateReader(), typeof(SafeEnum)); + } + if(source.TryGetProperty("LastStatusUpdate", out token) && token.Type != JTokenType.Null) + { + LastStatusUpdate = (DateTime?)serializer.Deserialize(token.CreateReader(), typeof(DateTime?)); + } + } + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Models/WorkflowRole.cs b/src/ShareFile.Api.Client/Models/WorkflowRole.cs new file mode 100644 index 0000000..9cf5864 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WorkflowRole.cs @@ -0,0 +1,28 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +namespace ShareFile.Api.Client.Models +{ + + /// + /// Participants role in a workflow. + /// + public enum WorkflowRole + { + Unknown = -1, + Active = 0, + + /// + /// Analogous to carbon copy. + /// + Passive = 1 + } +} diff --git a/src/ShareFile.Api.Client/Models/WorkflowStatus.cs b/src/ShareFile.Api.Client/Models/WorkflowStatus.cs new file mode 100644 index 0000000..46d2a4c --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WorkflowStatus.cs @@ -0,0 +1,28 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +namespace ShareFile.Api.Client.Models +{ + + /// + /// Status of a workflow + /// + public enum WorkflowStatus + { + Unknown = -1, + Draft = 0, + InProgress = 1, + Completed = 2, + Rejected = 3, + Cancelled = 4, + RequestedChange = 5 + } +} diff --git a/src/ShareFile.Api.Client/Models/WorkflowType.cs b/src/ShareFile.Api.Client/Models/WorkflowType.cs new file mode 100644 index 0000000..437e311 --- /dev/null +++ b/src/ShareFile.Api.Client/Models/WorkflowType.cs @@ -0,0 +1,24 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. +// +// ------------------------------------------------------------------------------ +using System; +namespace ShareFile.Api.Client.Models +{ + + /// + /// Type of Workflow + /// + public enum WorkflowType + { + Approval = 0, + Feedback = 1, + RequestList = 2 + } +} diff --git a/src/ShareFile.Api.Client/Models/Zone.cs b/src/ShareFile.Api.Client/Models/Zone.cs index e7040c2..6df7611 100644 --- a/src/ShareFile.Api.Client/Models/Zone.cs +++ b/src/ShareFile.Api.Client/Models/Zone.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,31 +17,68 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + /// + /// Zones represent sites that can hold ShareFile data. Zones can be either + /// Private - installed at customer's premisses - or Public - managed by + /// ShareFile. ShareFile Items are always associated with a given Zone. + /// + /// Zones have multiple StorageCenters - each represents a physical server + /// in that zone. + /// public class Zone : Principal { - + /// + /// Zone secret used for securing communications. + /// public string Secret { get; set; } - + /// + /// Zone type + /// public SafeEnum ZoneType { get; set; } - + /// + /// Zone account - only set on Private zones + /// public Account Account { get; set; } - + /// + /// Specifies how much time between heartbeats before sharefile.com will remove + /// a Storage Center from load balancing + /// public int? HeartBeatTolerance { get; set; } - + /// + /// Specifies how often sharefile.com will attempt to connect back to the Zone + /// and determine if the zone is healthy. + /// public int? PingBackInterval { get; set; } - + /// + /// Zone version - this parameter cannot be set, it is determined from the version + /// of its storage centers. A zone version is the lowest version of a storage center + /// in that zone + /// public string Version { get; set; } - + /// + /// Comma-delimited list of services enabled in this zone. + /// public SafeEnum ZoneServices { get; set; } - + /// + /// Specifies if the zone is a HIPAA zone + /// public bool? IsHIPAAZone { get; set; } - + /// + /// Specifies if the zone is a multi-tenant zone + /// public bool? IsMultiTenant { get; set; } - + /// + /// List of Storage Centers created on this zone. A Storage Center is a stateless + /// server that performs the zone services. Operations to this zone will be + /// redirected to one of the storage centers - using the configured external + /// address. + /// public IEnumerable StorageCenters { get; set; } - + /// + /// List of metadata objects associated with this zone + /// public IEnumerable Metadata { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/Models/ZoneService.cs b/src/ShareFile.Api.Client/Models/ZoneService.cs index a9824cf..c004bf8 100644 --- a/src/ShareFile.Api.Client/Models/ZoneService.cs +++ b/src/ShareFile.Api.Client/Models/ZoneService.cs @@ -5,18 +5,38 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { + + /// + /// Enumeration for listing which services are enabled on the Zone + /// [Flags] - public enum ZoneService + public enum ZoneService { + + /// + /// No Services + /// None = 0, + + /// + /// Object Storage Zone (ShareFile storage) + /// StorageZone = 1, + + /// + /// Connector to Network Shares (cifs) + /// NetworkShareConnector = 2, + + /// + /// Connector to SharePoint Sites (sp) + /// SharepointConnector = 4, AzureStorageZone = 8, SharePointOnlineConnector = 16, @@ -28,12 +48,50 @@ public enum ZoneService GenericConnector = 1024, OneDriveBusinessConnector = 2048, ShareConnectConnector = 4096, + + /// + /// Supports Preview + /// Preview = 8192, + + /// + /// Highly concurrent zone + /// HighConcurrency = 16384, + + /// + /// Supports Information Rights Management + /// InformationRightsManagement = 32768, + + /// + /// Supports Documentum ECM Connector + /// DocumentumConnector = 65536, + + /// + /// Supports OpenText ECM Connector + /// AlfrescoConnector = 131072, + + /// + /// Supports FileNet ECM Connector + /// OpenTextConnector = 262144, - FileNetConnector = 524288 + + /// + /// Supports Alfresco ECM Connector + /// + FileNetConnector = 524288, + + /// + /// Supports Editing + /// + Editing = 1048576, + + /// + /// Supports DirectToFile (ShareFile - Office mobile apps integration) + /// + DirectToFile = 2097152 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ZoneType.cs b/src/ShareFile.Api.Client/Models/ZoneType.cs index ff5b4be..a31678d 100644 --- a/src/ShareFile.Api.Client/Models/ZoneType.cs +++ b/src/ShareFile.Api.Client/Models/ZoneType.cs @@ -5,13 +5,13 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { - public enum ZoneType + public enum ZoneType { Private = 0, Public = 1, @@ -19,4 +19,4 @@ public enum ZoneType CitrixManaged = 3, PrivateCitrixManaged = 4 } -} \ No newline at end of file +} diff --git a/src/ShareFile.Api.Client/Models/ZoneUsageBreakdown.cs b/src/ShareFile.Api.Client/Models/ZoneUsageBreakdown.cs index 7933841..fc7ecde 100644 --- a/src/ShareFile.Api.Client/Models/ZoneUsageBreakdown.cs +++ b/src/ShareFile.Api.Client/Models/ZoneUsageBreakdown.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using System; @@ -17,11 +17,10 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Exceptions; -namespace ShareFile.Api.Models +namespace ShareFile.Api.Client.Models { public class ZoneUsageBreakdown : ODataObject { - public IDictionary ZonesToUsage { get; set; } public override void Copy(ODataObject source, JsonSerializer serializer) diff --git a/src/ShareFile.Api.Client/NotNullAttribute.cs b/src/ShareFile.Api.Client/NotNullAttribute.cs new file mode 100644 index 0000000..ddbde39 --- /dev/null +++ b/src/ShareFile.Api.Client/NotNullAttribute.cs @@ -0,0 +1,63 @@ +using System; +using System.Linq.Expressions; + +namespace ShareFile.Api.Client +{ + internal class NotNullAttribute : Attribute + { + } + + internal class Constraint + { + [NotNull] + public static T NotNull(Expression> expression) where T : class + { + var result = expression.Compile()(); + if (result == null) + { + throw new ConstraintViolationException($"NotNull constraint failed: {ExpressionToString(expression)} was null"); + } + return result; + } + + private static string ExpressionToString(Expression expression) + { + string prefix = ""; + string memberName = ""; + var fieldExpression = expression as MemberExpression; + if (fieldExpression != null) + { + prefix = ExpressionToString(fieldExpression.Expression); + memberName = fieldExpression.Member.Name; + } + var lambda = expression as LambdaExpression; + if (lambda != null) + { + var memberExpression = lambda.Body as MemberExpression; + if (memberExpression != null) + { + prefix = ExpressionToString(memberExpression.Expression); + memberName = memberExpression.Member.Name; + } + } + + if (string.IsNullOrEmpty(memberName)) + { + return ""; + } + if (string.IsNullOrEmpty(prefix)) + { + return memberName; + } + return $"{prefix}.{memberName}"; + } + + internal class ConstraintViolationException : Exception + { + public ConstraintViolationException(string message) + : base(message) + { + } + } + } +} diff --git a/src/ShareFile.Api.Client/Primitives/ShareFileId.cs b/src/ShareFile.Api.Client/Primitives/ShareFileId.cs new file mode 100644 index 0000000..a1a9631 --- /dev/null +++ b/src/ShareFile.Api.Client/Primitives/ShareFileId.cs @@ -0,0 +1,746 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Primitives +{ + /// + /// A compact representation of a ShareFile unique identifier. + /// + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 4)] + public struct ShareFileId : IEquatable + { + private readonly Guid guid; + private readonly string unparsedId; + private readonly Data data; + + public ShareFileId(string sfId) : this(sfId, mustParse: false) { } + + internal ShareFileId(string sfId, bool mustParse) + { + unparsedId = sfId; + data = default(Data); + guid = default(Guid); + if (string.IsNullOrEmpty(sfId)) + { + return; + } + + var constructor = new Constructor(sfId); + bool parseSucceeded; + if (mustParse) + { + constructor.Parse(); + parseSucceeded = true; + } + else + { + parseSucceeded = constructor.TryParse(); + } + + if (parseSucceeded) + { + data = constructor.Data; + guid = constructor.Guid; + unparsedId = null; + } + } + + private bool UseUnparsedId => data == default(Data) && guid == default(Guid); + + public override string ToString() + { + if (UseUnparsedId) + { + return unparsedId; + } + string prefix = data.Prefix; + string guidFormat = data.GuidIncludesHyphens ? "D" : "N"; + string guidString = guid.ToString(guidFormat); + int guidDigitsWanted = data.TotalLength - prefix.Length; + if (data.GuidSubstringHigh) + { + guidString = guidString.Substring(0, guidDigitsWanted); + } + else + { + guidString = guidString.Substring(guidString.Length - guidDigitsWanted); + } + return prefix + guidString; + } + + #region equality + private StringComparer SfIdStringComparer => StringComparer.OrdinalIgnoreCase; + private const StringComparison SfIdStringComparison = StringComparison.OrdinalIgnoreCase; + + public bool Equals(ShareFileId other) + { + if (UseUnparsedId && other.UseUnparsedId) + { + return string.Equals(unparsedId, other.unparsedId, SfIdStringComparison); + } + return guid == other.guid + && data == other.data; + } + + public static bool operator ==(ShareFileId left, ShareFileId right) => left.Equals(right); + public static bool operator !=(ShareFileId left, ShareFileId right) => !left.Equals(right); + + public override int GetHashCode() + { + var hashCode = -203229721; // generated by visual studio + hashCode = hashCode * -1521134295 + base.GetHashCode(); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(guid); + if (unparsedId != null) + { + hashCode = hashCode * -1521134295 + SfIdStringComparer.GetHashCode(unparsedId); + } + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(data); + return hashCode; + } + + public bool Equals(string value) + { + var other = new ShareFileId(value); + return Equals(other); + } + + public override bool Equals(object obj) + { + if (obj is null) + { + return Equals(default(ShareFileId)); + } + if (obj is ShareFileId other) + { + return Equals(other); + } + else if (obj is string s) + { + return Equals(s); + } + return false; + } + + public static bool operator ==(ShareFileId left, object right) => left.Equals(right); + public static bool operator !=(ShareFileId left, object right) => !left.Equals(right); + public static bool operator ==(object left, ShareFileId right) => right == left; + public static bool operator !=(object left, ShareFileId right) => right != left; + #endregion + + #region string compatibility + public static implicit operator ShareFileId(string sfId) => new ShareFileId(sfId); + public static implicit operator string(ShareFileId id) => id.ToString(); + + public char this[int index] + { + get + { + if (UseUnparsedId) + { + return unparsedId[index]; + } + string prefix = data.Prefix; + if (index < prefix.Length) + { + return prefix[index]; + } + return ToString()[index]; + } + } + + public int Length => UseUnparsedId ? unparsedId.Length : data.TotalLength; + + private static bool IsCaseSensitiveComparison(StringComparison comparisonType) + { + if (comparisonType == StringComparison.CurrentCulture +#if !PORTABLE && !NETSTANDARD1_3 + || comparisonType == StringComparison.InvariantCulture +#endif + || comparisonType == StringComparison.Ordinal) + { + return true; + } + return false; + } + + public bool Equals(string value, StringComparison comparisonType) + { + if (IsCaseSensitiveComparison(comparisonType)) + { + return ToString().Equals(value, comparisonType); + } + return Equals(value); + } + + public bool StartsWith(string value) + { + if (UseUnparsedId) + { + return unparsedId.StartsWith(value); + } + string prefix = data.Prefix; + if (value != null && value.Length <= prefix.Length) + { + return prefix.StartsWith(value); + } + return ToString().StartsWith(value); + } + + public bool StartsWith(string value, StringComparison comparisonType) + { + if (IsCaseSensitiveComparison(comparisonType)) + { + return ToString().StartsWith(value, comparisonType); + } + return StartsWith(value); + } + + public string Substring(int startIndex) => ToString().Substring(startIndex); + + public string Substring(int startIndex, int length) + { + if (UseUnparsedId) + { + return unparsedId.Substring(startIndex, length); + } + string prefix = data.Prefix; + if (startIndex + length <= prefix.Length) + { + return prefix.Substring(startIndex, length); + } + return ToString().Substring(startIndex, length); + } + + public object Clone() => this; + public int CompareTo(string strB) => ToString().CompareTo(strB); + public bool Contains(string value) => ToString().Contains(value); + public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count) => ToString().CopyTo(sourceIndex, destination, destinationIndex, count); + public bool EndsWith(string value) => ToString().EndsWith(value); + public bool EndsWith(string value, StringComparison comparisonType) => ToString().EndsWith(value, comparisonType); + public int IndexOf(string value, int startIndex, int count, StringComparison comparisonType) => ToString().IndexOf(value, startIndex, count, comparisonType); + public int IndexOf(string value, int startIndex, StringComparison comparisonType) => ToString().IndexOf(value, startIndex, comparisonType); + public int IndexOf(string value, int startIndex, int count) => ToString().IndexOf(value, startIndex, count); + public int IndexOf(char value, int startIndex, int count) => ToString().IndexOf(value, startIndex, count); + public int IndexOf(string value) => ToString().IndexOf(value); + public int IndexOf(char value, int startIndex) => ToString().IndexOf(value, startIndex); + public int IndexOf(char value) => ToString().IndexOf(value); + public int IndexOf(string value, int startIndex) => ToString().IndexOf(value, startIndex); + public int IndexOf(string value, StringComparison comparisonType) => ToString().IndexOf(value, comparisonType); + public int IndexOfAny(char[] anyOf, int startIndex) => ToString().IndexOfAny(anyOf, startIndex); + public int IndexOfAny(char[] anyOf) => ToString().IndexOfAny(anyOf); + public int IndexOfAny(char[] anyOf, int startIndex, int count) => ToString().IndexOfAny(anyOf, startIndex, count); + public string Insert(int startIndex, String value) => ToString().Insert(startIndex, value); + public int LastIndexOf(string value) => ToString().LastIndexOf(value); + public int LastIndexOf(string value, int startIndex) => ToString().LastIndexOf(value, startIndex); + public int LastIndexOf(string value, int startIndex, int count) => ToString().LastIndexOf(value, startIndex, count); + public int LastIndexOf(string value, StringComparison comparisonType) => ToString().LastIndexOf(value, comparisonType); + public int LastIndexOf(string value, int startIndex, StringComparison comparisonType) => ToString().LastIndexOf(value, startIndex, comparisonType); + public int LastIndexOf(string value, int startIndex, int count, StringComparison comparisonType) => ToString().LastIndexOf(value, startIndex, count, comparisonType); + public int LastIndexOf(char value) => ToString().LastIndexOf(value); + public int LastIndexOf(char value, int startIndex, int count) => ToString().LastIndexOf(value, startIndex, count); + public int LastIndexOf(char value, int startIndex) => ToString().LastIndexOf(value, startIndex); + public int LastIndexOfAny(char[] anyOf) => ToString().LastIndexOfAny(anyOf); + public int LastIndexOfAny(char[] anyOf, int startIndex, int count) => ToString().LastIndexOfAny(anyOf, startIndex, count); + public int LastIndexOfAny(char[] anyOf, int startIndex) => ToString().LastIndexOfAny(anyOf, startIndex); + public string PadLeft(int totalWidth, char paddingChar) => ToString().PadLeft(totalWidth, paddingChar); + public string PadLeft(int totalWidth) => ToString().PadLeft(totalWidth); + public string PadRight(int totalWidth, char paddingChar) => ToString().PadRight(totalWidth, paddingChar); + public string PadRight(int totalWidth) => ToString().PadRight(totalWidth); + public string Remove(int startIndex, int count) => ToString().Remove(startIndex, count); + public string Remove(int startIndex) => ToString().Remove(startIndex); + public string Replace(char oldChar, char newChar) => ToString().Replace(oldChar, newChar); + public string Replace(string oldValue, string newValue) => ToString().Replace(oldValue, newValue); + public string[] Split(char[] separator, int count, StringSplitOptions options) => ToString().Split(separator, count, options); + public string[] Split(string[] separator, StringSplitOptions options) => ToString().Split(separator, options); + public string[] Split(string[] separator, int count, StringSplitOptions options) => ToString().Split(separator, count, options); + public string[] Split(char[] separator, int count) => ToString().Split(separator, count); + public string[] Split(params char[] separator) => ToString().Split(separator); + public string[] Split(char[] separator, StringSplitOptions options) => ToString().Split(separator, options); + public char[] ToCharArray() => ToString().ToCharArray(); + public char[] ToCharArray(int startIndex, int length) => ToString().ToCharArray(startIndex, length); + public string ToLower() => ToString().ToLower(); + public string ToLowerInvariant() => ToString().ToLowerInvariant(); + public string ToUpper() => ToString().ToUpper(); + public string ToUpperInvariant() => ToString().ToUpperInvariant(); + public string Trim() => ToString().Trim(); + public string Trim(params char[] trimChars) => ToString().Trim(trimChars); + public string TrimEnd(params char[] trimChars) => ToString().TrimEnd(trimChars); + public string TrimStart(params char[] trimChars) => ToString().TrimStart(trimChars); + +#if !PORTABLE && !NETSTANDARD1_3 + public int CompareTo(object value) => ToString().CompareTo(value); + public bool EndsWith(string value, bool ignoreCase, System.Globalization.CultureInfo culture) => ToString().EndsWith(value, ignoreCase, culture); + public CharEnumerator GetEnumerator() => ToString().GetEnumerator(); + public bool IsNormalized() => ToString().IsNormalized(); + public bool IsNormalized(NormalizationForm normalizationForm) => ToString().IsNormalized(normalizationForm); + public string Normalize() => ToString().Normalize(); + public string Normalize(NormalizationForm normalizationForm) => ToString().Normalize(normalizationForm); + public bool StartsWith(string value, bool ignoreCase, System.Globalization.CultureInfo culture) => ToString().StartsWith(value, ignoreCase, culture); + public string ToLower(System.Globalization.CultureInfo culture) => ToString().ToLower(culture); + public string ToString(IFormatProvider provider) => ToString().ToString(provider); + public string ToUpper(System.Globalization.CultureInfo culture) => ToString().ToUpper(culture); +#endif + #endregion + + #region data format + /* DATA LAYOUT + * 0,5: prefix char0 + * 5,5: prefix char1 + * 10,5: prefix char2 + * 15,5: prefix char3 + * 20,5: prefix char4 + * 25,1: guidToStringHyphens flag + * 25,6: total length + * 31,1: guidSubstringHigh flag */ + private const int MAX_PREFIX_CHAR_COUNT = 5; + private const int PREFIX_CHAR_BITS = 5; + + private static bool PrefixCharOffset(int charIndex, bool mustParse, out int offset) + { + if (charIndex < 0 || charIndex >= MAX_PREFIX_CHAR_COUNT) + { + offset = 0; + if (mustParse) throw new ArgumentOutOfRangeException(nameof(charIndex), $"Prefix char index allowed range 0-{MAX_PREFIX_CHAR_COUNT - 1}"); + return false; + } + offset = charIndex * PREFIX_CHAR_BITS; + return true; + } + + /* PREFIX CHAR MAPPING + * 0: no value + * 1-26: a-z, A-Z + * 27: - + * 28: _ + * 29: unused + * 30-31: reserved for constant prefixes */ + + // CONSTANT PREFIXES + private const int NO_CONSTANT_PREFIX_ID = 0; + private const string ALLSHARED = "allshared"; + private const int ALLSHARED_ID = 1; + private const string FAVORITES = "favorites"; + private const int FAVORITES_ID = 2; + private const string CONNECTORS = "connectors"; + private const int CONNECTORS_ID = 3; + private const string CIFS = "c-cifs"; + private const int CIFS_ID = 4; + private const string DOCUMENTUM = "c-documentum"; + private const int DOCUMENTUM_ID = 5; + private const string SHARECONNECT = "c-shareconnect"; + private const int SHARECONNECT_ID = 6; + + private struct Data : IEquatable + { + public string Prefix => GetPrefixString(); + public bool GuidIncludesHyphens => GetGuidIncludesHyphens(); + public int TotalLength => GetTotalLength(); + public bool GuidSubstringHigh => GetGuidSubstringHigh(); + + private readonly int data; + + public Data(int data) + { + this.data = data; + } + + private int GetBitRange(int offset, int length) + { + int shift = 32 - (offset + length); + int shifted = data >> shift; + int mask = (1 << length) - 1; + int masked = shifted & mask; + return masked; + } + + private static char? BitsToPrefixChar(int b) + { + if (b >= 1 && b <= 26) + { + return (char)('a' + b - 1); + } + else if (b == 0) + { + return null; + } + else if (b == 27) + { + return '-'; + } + else if (b == 28) + { + return '_'; + } + throw new ArgumentOutOfRangeException(nameof(b), $"Invalid prefix character value {b}"); + } + + private char? GetPrefixChar(int charIndex) + { + int offset; + PrefixCharOffset(charIndex, true, out offset); + int value = GetBitRange(offset, PREFIX_CHAR_BITS); + return BitsToPrefixChar(value); + } + + private int TryGetConstantPrefixId() + { + int prefixId = 0; + for (int i = 0; i < MAX_PREFIX_CHAR_COUNT; i++) + { + int offset; + PrefixCharOffset(i, true, out offset); + int val = GetBitRange(offset, PREFIX_CHAR_BITS); + if (val < 30) + { + return NO_CONSTANT_PREFIX_ID; + } + val &= 1; + int shifted = val << i; + prefixId |= shifted; + } + return prefixId; + } + + private static string ConstantPrefixString(int prefixId) + { + if (prefixId > 31) + { + throw new ArgumentException($"Invalid constant prefix id {prefixId} (maximum 31)"); + } + switch (prefixId) + { + case ALLSHARED_ID: + return ALLSHARED; + case FAVORITES_ID: + return FAVORITES; + case CONNECTORS_ID: + return CONNECTORS; + case CIFS_ID: + return CIFS; + case DOCUMENTUM_ID: + return DOCUMENTUM; + case SHARECONNECT_ID: + return SHARECONNECT; + default: + throw new ArgumentException($"Unknown constant prefix id {prefixId}"); + } + } + + private string GetPrefixString() + { + int constantPrefixId = TryGetConstantPrefixId(); + if (constantPrefixId != NO_CONSTANT_PREFIX_ID) + { + return ConstantPrefixString(constantPrefixId); + } + + var sb = new StringBuilder(MAX_PREFIX_CHAR_COUNT); + for (int i = 0; i < MAX_PREFIX_CHAR_COUNT; i++) + { + char? c = GetPrefixChar(i); + if (!c.HasValue) + { + break; + } + sb.Append(c.Value); + } + return sb.ToString(); + } + + private bool GetGuidIncludesHyphens() + { + int value = GetBitRange(25, 1); + return value == 1; + } + + private int GetTotalLength() + { + if (data == 0) + { + return 0; + } + return GetBitRange(25, 6) + 1; + } + + private bool GetGuidSubstringHigh() + { + int value = GetBitRange(31, 1); + return value == 1; + } + + private int EqualityData() + { + int masked = data | 127; // compare only prefix characters for equality + return masked; + } + + public bool Equals(Data other) => EqualityData() == other.EqualityData(); + public static bool operator ==(Data left, Data right) => left.Equals(right); + public static bool operator !=(Data left, Data right) => !left.Equals(right); + public override int GetHashCode() => EqualityData().GetHashCode(); + public override bool Equals(object obj) + { + var other = obj as Data?; + return other.HasValue ? Equals(other) : false; + } + } + + private struct Constructor + { + private readonly string sfId; + + private int data; + public Data Data => new Data(data); + public Guid Guid { get; private set; } + private bool mustParse; + + private const int NOT_FOUND_INDEX = -1; + + public Constructor(string sfId) + { + this.sfId = sfId; + data = 0; + Guid = default(Guid); + mustParse = false; + } + + public bool TryParse() + { + mustParse = false; + return ParseInternal(); + } + + public void Parse() + { + mustParse = true; + ParseInternal(); + } + + private bool ParseInternal() + { + if (string.IsNullOrEmpty(sfId)) + { + if (mustParse) throw new ArgumentException($"Id must not be null or empty"); + return false; + } + + string prefix; int constantPrefixId; + if (!GetPrefix(out prefix, out constantPrefixId)) return false; + if (!PutPrefix(prefix, constantPrefixId)) return false; + + bool includesHyphens = sfId.IndexOf('-', startIndex: prefix.Length) != NOT_FOUND_INDEX; + if (!PutGuidIncludesHyphens(includesHyphens)) return false; + + if (includesHyphens && sfId.Length <= 32) + { + if (mustParse) throw new ArgumentException($"Id with hyphens '{sfId}' must be at least 33 characters"); + return false; + } + if (!includesHyphens && sfId.Length > 32) + { + if (mustParse) throw new ArgumentException($"Id without hyphens '{sfId}' must be 32 or fewer characters"); + return false; + } + if (!PutTotalLength(sfId.Length)) return false; + + bool substringHigh; + if (!ParseGuid(prefix.Length, includesHyphens, out substringHigh)) return false; + if (!PutGuidSubstringHigh(substringHigh)) return false; + + return true; + } + + private static bool IsGuidDigit(char c) + { + bool is09 = '0' <= c && c <= '9'; + bool isaf = 'a' <= c && c <= 'f'; + bool isAF = 'A' <= c && c <= 'F'; + bool isHyphen = c == '-'; + return is09 || isaf || isAF || isHyphen; + } + + private static int TryGetConstantPrefixId(string sfId) + { + if (ALLSHARED.Equals(sfId, StringComparison.OrdinalIgnoreCase)) + return ALLSHARED_ID; + if (FAVORITES.Equals(sfId, StringComparison.OrdinalIgnoreCase)) + return FAVORITES_ID; + if (CONNECTORS.Equals(sfId, StringComparison.OrdinalIgnoreCase)) + return CONNECTORS_ID; + if (CIFS.Equals(sfId, StringComparison.OrdinalIgnoreCase)) + return CIFS_ID; + if (DOCUMENTUM.Equals(sfId, StringComparison.OrdinalIgnoreCase)) + return DOCUMENTUM_ID; + if (SHARECONNECT.Equals(sfId, StringComparison.OrdinalIgnoreCase)) + return SHARECONNECT_ID; + + return NO_CONSTANT_PREFIX_ID; + } + + private bool GetPrefix(out string prefix, out int constantPrefixId) + { + int prefixEndIndex = NOT_FOUND_INDEX; + for (int i = 0; i < sfId.Length; i++) + { + if (!IsGuidDigit(sfId[i])) + { + prefixEndIndex = i; + } + } + if (prefixEndIndex + 1 < sfId.Length && sfId[prefixEndIndex + 1] == '-') + { + prefixEndIndex++; + } + if (prefixEndIndex >= MAX_PREFIX_CHAR_COUNT) + { + constantPrefixId = TryGetConstantPrefixId(sfId); + } + else + { + constantPrefixId = NO_CONSTANT_PREFIX_ID; + } + prefix = constantPrefixId == NO_CONSTANT_PREFIX_ID + ? sfId.Substring(0, prefixEndIndex + 1) + : sfId; + return true; + } + + private bool AssertValueSize(int value, int length) + { + int high = value >> length; + if (high != 0) + { + if (mustParse) throw new ArgumentException($"Value {value} too large for length {length}"); + return false; + } + return true; + } + + private bool PutBitRange(int value, int offset, int length) + { + if (!AssertValueSize(value, length)) return false; + int shift = 32 - (offset + length); + int shifted = value << shift; + data = data | shifted; + return true; + } + + private bool PrefixCharToBits(char c, out int i) + { + if (c >= 'a' && c <= 'z') + { + i = c - 'a' + 1; + return true; + } + else if (c >= 'A' && c <= 'Z') + { + i = c - 'A' + 1; + return true; + } + else if (c == '-') + { + i = 27; + return true; + } + else if (c == '_') + { + i = 28; + return true; + } + else if (c == 0) + { + i = 0; + return true; + } + i = 0; + if (mustParse) throw new ArgumentOutOfRangeException(nameof(c), $"Invalid prefix character '{c}'"); + return false; + } + + private bool PutConstantPrefix(int prefixId) + { + for (int i = 0; i < MAX_PREFIX_CHAR_COUNT; i++) + { + int shifted = prefixId >> i; + int masked = shifted & 1; + int offset; + if (!PrefixCharOffset(i, mustParse, out offset)) return false; + if (!PutBitRange(30 + masked, offset, PREFIX_CHAR_BITS)) return false; + } + return true; + } + + private bool PutPrefixChar(char c, int charIndex) + { + int offset; + if (!PrefixCharOffset(charIndex, mustParse, out offset)) return false; + int value; + if (!PrefixCharToBits(c, out value)) return false; + return PutBitRange(value, offset, PREFIX_CHAR_BITS); + } + + private bool PutPrefix(string prefix, int constantPrefixId) + { + if (constantPrefixId != NO_CONSTANT_PREFIX_ID) + { + return PutConstantPrefix(constantPrefixId); + } + if (prefix.Length > MAX_PREFIX_CHAR_COUNT) + { + if (mustParse) throw new ArgumentException($"Id prefix '{prefix}' length exceeds maximum {MAX_PREFIX_CHAR_COUNT}"); + return false; + } + for (int i = 0; i < prefix.Length; i++) + { + if (!PutPrefixChar(prefix[i], i)) + return false; + } + return true; + } + + private bool PutGuidIncludesHyphens(bool b) + { + return PutBitRange(b ? 1 : 0, 25, 1); + } + + private bool PutTotalLength(int length) + { + return PutBitRange(length - 1, 25, 6); + } + + private bool PutGuidSubstringHigh(bool b) + { + return PutBitRange(b ? 1 : 0, 31, 1); + } + + private bool ParseGuid(int prefixLength, bool includesHyphens, out bool substringHigh) + { + string idWithoutPrefix = sfId.Substring(prefixLength); + int padGuidToLength = includesHyphens ? 36 : 32; + + string guidString = idWithoutPrefix.PadLeft(padGuidToLength, '0'); + Guid g; + if (Guid.TryParse(guidString, out g)) + { + substringHigh = false; + Guid = g; + return true; + } + guidString = idWithoutPrefix.PadRight(padGuidToLength, '0'); + if (Guid.TryParse(guidString, out g)) + { + substringHigh = true; + Guid = g; + return true; + } + substringHigh = false; + if (mustParse) throw new ArgumentException($"Unable to parse guid '{idWithoutPrefix}'", nameof(sfId)); + return false; + } + } + #endregion + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Properties/AssemblyInfo.cs b/src/ShareFile.Api.Client/Properties/AssemblyInfo.cs index ef6f4ed..0ecc235 100644 --- a/src/ShareFile.Api.Client/Properties/AssemblyInfo.cs +++ b/src/ShareFile.Api.Client/Properties/AssemblyInfo.cs @@ -1,8 +1,11 @@ // using System.Reflection; +using System.Runtime.CompilerServices; [assembly: AssemblyProductAttribute("ShareFile.Api.Client")] [assembly: AssemblyTitleAttribute("ShareFile Client SDK")] -[assembly: AssemblyVersionAttribute("3.1.0")] -[assembly: AssemblyFileVersionAttribute("3.3.0.0")] +[assembly: AssemblyVersionAttribute("4.0.0")] +[assembly: AssemblyFileVersionAttribute("4.0.0.0")] [assembly: AssemblyCopyrightAttribute("Copyright © Citrix ShareFile 2016")] + +[assembly: InternalsVisibleTo("ShareFile.Api.Client.Tests")] diff --git a/src/ShareFile.Api.Client/Requests/Executors/AsyncRequestExecutor.cs b/src/ShareFile.Api.Client/Requests/Executors/AsyncRequestExecutor.cs index 3921a0b..d9235ff 100644 --- a/src/ShareFile.Api.Client/Requests/Executors/AsyncRequestExecutor.cs +++ b/src/ShareFile.Api.Client/Requests/Executors/AsyncRequestExecutor.cs @@ -4,7 +4,6 @@ namespace ShareFile.Api.Client.Requests.Executors { -#if ASYNC public class AsyncRequestExecutor : IAsyncRequestExecutor { public async Task SendAsync(HttpClient httpClient, HttpRequestMessage requestMessage, HttpCompletionOption httpCompletionOption, @@ -13,5 +12,4 @@ public async Task SendAsync(HttpClient httpClient, HttpRequ return await httpClient.SendAsync(requestMessage, httpCompletionOption, cancellationToken).ConfigureAwait(false); } } -#endif -} +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Requests/Executors/IAsyncRequestExecutor.cs b/src/ShareFile.Api.Client/Requests/Executors/IAsyncRequestExecutor.cs index 2bc5f19..065ccda 100644 --- a/src/ShareFile.Api.Client/Requests/Executors/IAsyncRequestExecutor.cs +++ b/src/ShareFile.Api.Client/Requests/Executors/IAsyncRequestExecutor.cs @@ -4,10 +4,8 @@ namespace ShareFile.Api.Client.Requests.Executors { -#if ASYNC public interface IAsyncRequestExecutor { Task SendAsync(HttpClient httpClient, HttpRequestMessage requestMessage, HttpCompletionOption httpCompletionOption, CancellationToken cancellationToken); } -#endif } diff --git a/src/ShareFile.Api.Client/Requests/Executors/RequestExecutorFactory.cs b/src/ShareFile.Api.Client/Requests/Executors/RequestExecutorFactory.cs index f53682c..b451b7f 100644 --- a/src/ShareFile.Api.Client/Requests/Executors/RequestExecutorFactory.cs +++ b/src/ShareFile.Api.Client/Requests/Executors/RequestExecutorFactory.cs @@ -13,8 +13,7 @@ public static ISyncRequestExecutor GetSyncRequestExecutor() { return _syncRequestExecutor; } - -#if ASYNC + private static IAsyncRequestExecutor _asyncRequestExecutor; public static void RegisterAsyncRequestProvider(IAsyncRequestExecutor asyncRequestExecutor) { @@ -25,6 +24,5 @@ public static IAsyncRequestExecutor GetAsyncRequestExecutor() { return _asyncRequestExecutor; } -#endif } } diff --git a/src/ShareFile.Api.Client/Requests/Filters/Filter.cs b/src/ShareFile.Api.Client/Requests/Filters/Filter.cs index d9f054b..feb20cb 100644 --- a/src/ShareFile.Api.Client/Requests/Filters/Filter.cs +++ b/src/ShareFile.Api.Client/Requests/Filters/Filter.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Linq; using System.Linq.Expressions; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Requests.Filters { diff --git a/src/ShareFile.Api.Client/Requests/Filters/TypeFilter.cs b/src/ShareFile.Api.Client/Requests/Filters/TypeFilter.cs index 868d11a..f0c7851 100644 --- a/src/ShareFile.Api.Client/Requests/Filters/TypeFilter.cs +++ b/src/ShareFile.Api.Client/Requests/Filters/TypeFilter.cs @@ -1,4 +1,5 @@ -using ShareFile.Api.Models; +using ShareFile.Api.Client.Converters; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Requests.Filters { @@ -22,7 +23,12 @@ public class TypeFilter : IFilter { public override string ToString() { - return string.Format("isof('{0}')", typeof(T).FullName); + string fullName = typeof(T).FullName; + if(fullName.Contains(ODataFactory.ClientODataObjectNamespace)) + { + fullName = fullName.Replace(ODataFactory.ClientODataObjectNamespace, ODataFactory.PlaftormODataObjectNamespace); + } + return $"isof('{fullName}')"; } } } diff --git a/src/ShareFile.Api.Client/Requests/IQuery.cs b/src/ShareFile.Api.Client/Requests/IQuery.cs index f788d67..f3ee614 100644 --- a/src/ShareFile.Api.Client/Requests/IQuery.cs +++ b/src/ShareFile.Api.Client/Requests/IQuery.cs @@ -3,28 +3,33 @@ using System.Threading; using System.Threading.Tasks; using ShareFile.Api.Client.Requests.Filters; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Requests { public interface IQuery { + QueryMetadata Metadata { get; } + void Execute(); -#if ASYNC - Task ExecuteAsync(CancellationToken? token = null); -#endif + + [NotNull] + Task ExecuteAsync(CancellationToken token = default(CancellationToken)); Query AddHeader(string key, string value); Query WithBaseUri(Uri uri); + IQuery WithMetadata(QueryMetadata metadata); } public interface IQuery where T : class { + QueryMetadata Metadata { get; } + T Execute(); -#if ASYNC - Task ExecuteAsync(CancellationToken? token = null); -#endif + + [NotNull] + Task ExecuteAsync(CancellationToken token = default(CancellationToken)); /// /// If a Filter has already been added, it will implicitly converted to a @@ -46,6 +51,7 @@ public interface IQuery Query AddHeader(string key, string value); Query WithBaseUri(Uri uri); + IQuery WithMetadata(QueryMetadata metadata); IQuery Expect() where U : class; } diff --git a/src/ShareFile.Api.Client/Requests/Providers/AsyncRequestProvider.cs b/src/ShareFile.Api.Client/Requests/Providers/AsyncRequestProvider.cs index 64b50ad..bc2ec95 100644 --- a/src/ShareFile.Api.Client/Requests/Providers/AsyncRequestProvider.cs +++ b/src/ShareFile.Api.Client/Requests/Providers/AsyncRequestProvider.cs @@ -1,18 +1,10 @@ using System; -using System.Collections; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; -using System.Net.Http.Headers; -using System.Reflection; -using System.Text; using System.Threading; using System.Threading.Tasks; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using ShareFile.Api.Client.Credentials; using ShareFile.Api.Client.Events; using ShareFile.Api.Client.Exceptions; using ShareFile.Api.Client.Extensions; @@ -20,17 +12,17 @@ using ShareFile.Api.Client.Logging; using ShareFile.Api.Client.Requests.Executors; using ShareFile.Api.Client.Security.Authentication.OAuth2; +using ShareFile.Api.Client.Models; using ShareFile.Api.Client.Security.Cryptography; -using ShareFile.Api.Models; namespace ShareFile.Api.Client.Requests.Providers { -#if ASYNC - internal class AsyncRequestProvider : BaseRequestProvider, IAsyncRequestProvider + internal class AsyncRequestProvider : BaseRequestProvider, IAsyncRequestProvider { public AsyncRequestProvider(ShareFileClient client) : base(client) { } - public async Task ExecuteAsync(IQuery query, CancellationToken? token = null) + [NotNull] + public async Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)) { EventHandlerResponse action = null; int retryCount = 0; @@ -68,13 +60,14 @@ public async Task ExecuteAsync(IQuery query, CancellationToken? token = null) } while (action != null && (action.Action == EventHandlerResponseAction.Retry || action.Action == EventHandlerResponseAction.Redirect)); } - public async Task ExecuteAsync(IQuery query, CancellationToken? token = null) + [NotNull] + public async Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)) where T : class { var streamQuery = query as IQuery; if (streamQuery != null) { - return await this.ExecuteAsync(streamQuery, token).ConfigureAwait(false) as T; + return (T)(object)(await ExecuteAsync(streamQuery, token).ConfigureAwait(false)); } EventHandlerResponse action = null; @@ -136,7 +129,7 @@ public async Task ExecuteAsync(IQuery query, CancellationToken? token = } else { - return response.Value as T; + return (T)(object)response.Value; } } else action = response.Action; @@ -158,7 +151,8 @@ public async Task ExecuteAsync(IQuery query, CancellationToken? token = } while (action != null && (action.Action == EventHandlerResponseAction.Retry || action.Action == EventHandlerResponseAction.Redirect)); - return default(T); + ShareFileClient.Logging.Error($"App should throw or return before getting to this point. Query: {query}"); + throw new InvalidOperationException("We should throw or return before getting here."); } private EventHandlerResponse GetRedirectionAction( @@ -187,15 +181,17 @@ private EventHandlerResponse GetRedirectionAction( return action; } - public async Task ExecuteAsync(IFormQuery query, CancellationToken? token = null) + [NotNull] + public async Task ExecuteAsync(IFormQuery query, CancellationToken token = default(CancellationToken)) where T : class { return await ExecuteAsync(query as IQuery, token).ConfigureAwait(false); } + [NotNull] public async Task ExecuteAsync( IQuery query, - CancellationToken? token = null) + CancellationToken token = default(CancellationToken)) { EventHandlerResponse action = null; int retryCount = 0; @@ -228,13 +224,15 @@ public async Task ExecuteAsync( { ShareFileClient.Logging.Trace(requestRoundtripWatch); } + } + while (action != null && (action.Action == EventHandlerResponseAction.Retry || action.Action == EventHandlerResponseAction.Redirect)); - } while (action != null && (action.Action == EventHandlerResponseAction.Retry || action.Action == EventHandlerResponseAction.Redirect)); - - return default(Stream); + ShareFileClient.Logging.Error($"App should throw or return before getting to this point. Query: {query}"); + throw new InvalidOperationException("We should throw or return before getting here."); } - public Task ExecuteAsync(IStreamQuery query, CancellationToken? token = null) + [NotNull] + public Task ExecuteAsync(IStreamQuery query, CancellationToken token = default(CancellationToken)) { return this.ExecuteAsync((IQuery)query, token); } @@ -485,7 +483,8 @@ async Task HandleNonSuccess(HttpResponseMessage responseMe { Code = requestException.Code, ODataExceptionMessage = requestException.Message, - ExceptionReason = requestException.ExceptionReason + ExceptionReason = requestException.ExceptionReason, + ErrorLog = requestException.ErrorLog }; } else @@ -537,7 +536,7 @@ protected async Task ExecuteRequestAsync( HttpRequestMessage requestMessage, HttpCompletionOption httpCompletionOption, int redirectionCount = 0, - CancellationToken? token = null) + CancellationToken token = default(CancellationToken)) { if (redirectionCount >= MaxAutomaticRedirections) { @@ -545,7 +544,7 @@ protected async Task ExecuteRequestAsync( } var requestExecutor = ShareFileClient.AsyncRequestExecutor ?? RequestExecutorFactory.GetAsyncRequestExecutor(); - var responseMessage = await requestExecutor.SendAsync(HttpClient, requestMessage, httpCompletionOption, token ?? CancellationToken.None).ConfigureAwait(false); + var responseMessage = await requestExecutor.SendAsync(HttpClient, requestMessage, httpCompletionOption, token).ConfigureAwait(false); var redirect = responseMessage.GetSecureRedirect(); if (redirect != null) { @@ -557,5 +556,4 @@ protected async Task ExecuteRequestAsync( return responseMessage; } } -#endif -} +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Requests/Providers/BaseRequestProvider.cs b/src/ShareFile.Api.Client/Requests/Providers/BaseRequestProvider.cs index c1cb71e..07c51e4 100644 --- a/src/ShareFile.Api.Client/Requests/Providers/BaseRequestProvider.cs +++ b/src/ShareFile.Api.Client/Requests/Providers/BaseRequestProvider.cs @@ -13,7 +13,7 @@ using ShareFile.Api.Client.Exceptions; using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Logging; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Requests.Providers { @@ -32,7 +32,7 @@ internal static class Headers /// /// Set this flag True if running as a Portable Class Library /// -#if PORTABLE +#if PORTABLE || NETSTANDARD1_3 public static bool RuntimeRequiresCustomCookieHandling = true; #else public static bool RuntimeRequiresCustomCookieHandling = false; @@ -61,13 +61,6 @@ protected HttpRequestMessage BuildRequest(ApiRequest request) var watch = new ActionStopwatch("BuildRequest", ShareFileClient.Logging, RequestId); var uri = request.GetComposedUri(); -#if ShareFile - if (ShareFileClient.CustomAuthentication != null) - { - uri = ShareFileClient.CustomAuthentication.SignUri(uri); - } -#endif - if (ShareFileClient.Configuration.UseHttpMethodOverride) { requestMessage = new HttpRequestMessage(HttpMethod.Post, uri); @@ -100,6 +93,7 @@ protected HttpRequestMessage BuildRequest(ApiRequest request) try { WriteRequestBody(requestMessage, request.Body, new MediaTypeHeaderValue("application/json")); + LogRequest(request, requestMessage.Headers.ToString()); } catch (Exception) { @@ -115,13 +109,6 @@ protected HttpRequestMessage BuildRequest(ApiRequest request) } } -#if ShareFile - if (ShareFileClient.CustomAuthentication != null) - { - requestMessage = ShareFileClient.CustomAuthentication.SignBody(request.Body, requestMessage); - } -#endif - ShareFileClient.Logging.Trace(watch); return requestMessage; @@ -202,8 +189,7 @@ protected T DeserializeResponseStream(Stream responseStream, HttpResponseMess } } } - -#if ASYNC + protected Task DeserializeResponseStreamAsync(Stream responseStream, HttpResponseMessage httpResponseMessage) { return Task.Factory.StartNew(() => DeserializeResponseStream(responseStream, httpResponseMessage)); @@ -275,7 +261,6 @@ protected async Task LogResponseAsync(T response, Uri requestUri, string head ShareFileClient.Logging.Trace("[{0}] Response Code: {1}", new object[] { RequestId, statusCode }); } } -#endif protected void LogRequest(ApiRequest request, string headers) { @@ -389,11 +374,6 @@ protected void WriteRequestBody(HttpRequestMessage httpRequestMessage, object bo { stringWriter.Write(body as string); - if (ShareFileClient.Logging.IsDebugEnabled) - { - ShareFileClient.Logging.Debug(stringWriter.ToString(), null); - } - httpRequestMessage.Content = new StringContent(stringWriter.ToString()); if (httpRequestMessage.Content.Headers.ContentLength > 0) @@ -409,8 +389,6 @@ protected void WriteRequestBody(HttpRequestMessage httpRequestMessage, object bo try { var contentAsString = formContent.ReadAsStringAsync(); - - ShareFileClient.Logging.Debug("[{0}] {1}", new [] { RequestId, contentAsString.Result }, null); } catch (Exception) { @@ -430,11 +408,6 @@ protected void WriteRequestBody(HttpRequestMessage httpRequestMessage, object bo ShareFileClient.Serializer.Serialize(textWriter, body); ShareFileClient.Logging.Trace(serializationWatch); - if (ShareFileClient.Logging.IsDebugEnabled) - { - ShareFileClient.Logging.Debug(stringWriter.ToString(), null); - } - httpRequestMessage.Content = new StringContent(stringWriter.ToString()); if (httpRequestMessage.Content.Headers.ContentLength > 0) diff --git a/src/ShareFile.Api.Client/Requests/Providers/IAsyncRequestProvider.cs b/src/ShareFile.Api.Client/Requests/Providers/IAsyncRequestProvider.cs index dadad23..882b730 100644 --- a/src/ShareFile.Api.Client/Requests/Providers/IAsyncRequestProvider.cs +++ b/src/ShareFile.Api.Client/Requests/Providers/IAsyncRequestProvider.cs @@ -6,9 +6,13 @@ namespace ShareFile.Api.Client.Requests.Providers { public interface IAsyncRequestProvider : IRequestProvider { - Task ExecuteAsync(IQuery query, CancellationToken? token = null); - Task ExecuteAsync(IQuery query, CancellationToken? token = null) where T : class; - Task ExecuteAsync(IFormQuery query, CancellationToken? token = null) where T : class; - Task ExecuteAsync(IStreamQuery query, CancellationToken? token = null); + [NotNull] + Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)); + [NotNull] + Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)) where T : class; + [NotNull] + Task ExecuteAsync(IFormQuery query, CancellationToken token = default(CancellationToken)) where T : class; + [NotNull] + Task ExecuteAsync(IStreamQuery query, CancellationToken token = default(CancellationToken)); } } diff --git a/src/ShareFile.Api.Client/Requests/Providers/Response.cs b/src/ShareFile.Api.Client/Requests/Providers/Response.cs index 30f534b..990f35d 100644 --- a/src/ShareFile.Api.Client/Requests/Providers/Response.cs +++ b/src/ShareFile.Api.Client/Requests/Providers/Response.cs @@ -18,7 +18,7 @@ using ShareFile.Api.Client.Logging; using ShareFile.Api.Client.Security.Authentication.OAuth2; using ShareFile.Api.Client.Security.Cryptography; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Requests.Providers { diff --git a/src/ShareFile.Api.Client/Requests/Providers/SyncRequestProvider.cs b/src/ShareFile.Api.Client/Requests/Providers/SyncRequestProvider.cs index 426e41e..9d1e33b 100644 --- a/src/ShareFile.Api.Client/Requests/Providers/SyncRequestProvider.cs +++ b/src/ShareFile.Api.Client/Requests/Providers/SyncRequestProvider.cs @@ -21,7 +21,7 @@ using ShareFile.Api.Client.Requests.Executors; using ShareFile.Api.Client.Security.Authentication.OAuth2; using ShareFile.Api.Client.Security.Cryptography; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Requests.Providers { @@ -226,12 +226,12 @@ private Response HandleResponse(HttpResponseMessage httpResponseMessa return HandleResponse(authenticatedResponse, parseSuccessResponse, request, retryCount, false); } - return Response.CreateAction(HandleNonSuccess(authenticatedResponse, retryCount)); + return Response.CreateAction(HandleNonSuccess(authenticatedResponse, retryCount, typeof(TResponse))); } } } - return Response.CreateAction(HandleNonSuccess(httpResponseMessage, retryCount)); + return Response.CreateAction(HandleNonSuccess(httpResponseMessage, retryCount, typeof(TResponse))); } protected HttpResponseMessage ExecuteRequest(HttpRequestMessage requestMessage, HttpCompletionOption httpCompletionOption, int redirectionCount = 0) @@ -256,6 +256,18 @@ protected HttpResponseMessage ExecuteRequest(HttpRequestMessage requestMessage, protected EventHandlerResponse HandleNonSuccess(HttpResponseMessage responseMessage, int retryCount, Type expectedType = null) { + if (typeof(Response).IsAssignableFrom(expectedType)) + { + var args = expectedType.GetGenericArguments(); + if (args != null && args.Length > 0) + { + expectedType = args[0]; + } + else + { + expectedType = null; + } + } var action = ShareFileClient.OnException(responseMessage, retryCount); if (action != null && action.Action == EventHandlerResponseAction.Throw) @@ -301,7 +313,7 @@ protected EventHandlerResponse HandleNonSuccess(HttpResponseMessage responseMess Exception exceptionToThrow = null; - if (expectedType == null || expectedType.IsAssignableFrom(typeof(ODataObject))) + if (expectedType == null || expectedType.IsAssignableFrom(typeof(ODataObject)) || expectedType.IsSubclassOf(typeof(ODataObject)) || expectedType.IsAssignableFrom(typeof(Stream))) { ODataRequestException requestException; if (TryDeserialize(rawError, out requestException)) @@ -310,7 +322,8 @@ protected EventHandlerResponse HandleNonSuccess(HttpResponseMessage responseMess { Code = requestException.Code, ODataExceptionMessage = requestException.Message, - ExceptionReason = requestException.ExceptionReason + ExceptionReason = requestException.ExceptionReason, + ErrorLog = requestException.ErrorLog }; } else diff --git a/src/ShareFile.Api.Client/Requests/Query.cs b/src/ShareFile.Api.Client/Requests/Query.cs index 08e0757..d1d809c 100644 --- a/src/ShareFile.Api.Client/Requests/Query.cs +++ b/src/ShareFile.Api.Client/Requests/Query.cs @@ -9,7 +9,7 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Requests.Filters; using ShareFile.Api.Client.Requests.Providers; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Requests { @@ -23,6 +23,7 @@ public abstract class QueryBase : IReadOnlyQuery protected readonly ODataParameterCollection _queryString; protected IDictionary _headerCollection; protected Uri _baseUri; + protected QueryMetadata _metadata; // ReSharper restore InconsistentNaming protected QueryBase(IShareFileClient client) @@ -38,6 +39,8 @@ protected QueryBase(IShareFileClient client) } public IShareFileClient Client { get; internal set; } + + public QueryMetadata Metadata => _metadata; public string HttpMethod { get; set; } public object Body { get; set; } @@ -332,12 +335,11 @@ public void Execute() Client.Execute(this); } -#if ASYNC - public Task ExecuteAsync(CancellationToken? token = null) + [NotNull] + public Task ExecuteAsync(CancellationToken token = default(CancellationToken)) { return Client.ExecuteAsync(this, token); } -#endif public Query AddHeader(string key, string value) { @@ -350,6 +352,12 @@ public Query WithBaseUri(Uri uri) SetBaseUri(uri); return this; } + + public IQuery WithMetadata(QueryMetadata metadata) + { + _metadata = metadata; + return this; + } } public class Query : QueryBase, IQuery, IReadOnlyODataQuery @@ -623,16 +631,15 @@ public virtual T Execute() return Client.Execute(this); } -#if ASYNC - public virtual Task ExecuteAsync(CancellationToken? token = null) + [NotNull] + public virtual Task ExecuteAsync(CancellationToken token = default(CancellationToken)) { if (this is IQuery) { - return Client.ExecuteAsync((IQuery)this, token) as Task; + return (Task)(object)Client.ExecuteAsync((IQuery)this, token); } return Client.ExecuteAsync(this, token); } -#endif public int GetTop() { @@ -663,6 +670,12 @@ public string GetOrderBy() { return _orderBy; } + + public IQuery WithMetadata(QueryMetadata metadata) + { + _metadata = metadata; + return this; + } } public interface IFormQuery : IQuery @@ -695,13 +708,12 @@ public override Stream Execute() { return Client.Execute(this); } - -#if ASYNC - public override Task ExecuteAsync(CancellationToken? token = null) + + [NotNull] + public override Task ExecuteAsync(CancellationToken token = default(CancellationToken)) { return Client.ExecuteAsync(this, token); } -#endif } internal class MappedQuery : Query @@ -722,15 +734,15 @@ public override TargetType Execute() SourceType result = query.Execute(); return map(result); } - -#if ASYNC - public override async Task ExecuteAsync(CancellationToken? token = null) + + [NotNull] + public override async Task ExecuteAsync(CancellationToken token = default(CancellationToken)) { Query query = Query.Copy(this, new Query(this.Client)); SourceType result = await query.ExecuteAsync(token).ConfigureAwait(false); - return map(result); + var targetResult = map(result); + return Constraint.NotNull(() => targetResult); } -#endif } public class ApiRequest @@ -794,7 +806,7 @@ public static ApiRequest FromQuery(QueryBase query, string requestId = null) queryString.Add(odataParameter); } - url = new StringBuilder(idsUri.ToString().Substring(0, ids.IndexOf('?'))); + url = new StringBuilder(ids.Substring(0, ids.IndexOf('?'))); } } else diff --git a/src/ShareFile.Api.Client/Requests/QueryMetadata.cs b/src/ShareFile.Api.Client/Requests/QueryMetadata.cs new file mode 100644 index 0000000..fd03b40 --- /dev/null +++ b/src/ShareFile.Api.Client/Requests/QueryMetadata.cs @@ -0,0 +1,16 @@ +using System; + +namespace ShareFile.Api.Client.Requests +{ + /// + /// Used to store metadata about the query. + /// This metadata is for internal use and is not actually sent as part of the API request. + /// + public class QueryMetadata + { + /// + /// Gets or sets a value indicating whether or not the request is expected to throw. + /// + public bool IsExpectedToThrow { get; set; } + } +} diff --git a/src/ShareFile.Api.Client/Security/Authentication/OAuth2/OAuthService.cs b/src/ShareFile.Api.Client/Security/Authentication/OAuth2/OAuthService.cs index eb673da..784288d 100644 --- a/src/ShareFile.Api.Client/Security/Authentication/OAuth2/OAuthService.cs +++ b/src/ShareFile.Api.Client/Security/Authentication/OAuth2/OAuthService.cs @@ -2,13 +2,12 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; - using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Requests; namespace ShareFile.Api.Client.Security.Authentication.OAuth2 { - public interface IOAuthService + public partial interface IOAuthService { string ClientId { get; set; } string ClientSecret { get; set; } @@ -20,17 +19,16 @@ FormQuery GetExchangeSamlAssertionForOAuthTokenQuery(string samlAsse FormQuery GetPasswordGrantRequestQuery(string username, string password, string subdomain, string applicationControlPlane); -#if ASYNC Task ExchangeAuthorizationCodeAsync(OAuthAuthorizationCode code); + [NotNull] Task RefreshOAuthTokenAsync(OAuthToken token); Task ExchangeSamlAssertionAsync(string samlAssertion, string subdomain, string applicationControlPlane, string samlProviderId = ""); Task PasswordGrantAsync(string username, string password, string subdomain, string applicationControlPlane); -#endif string GetAuthorizationUrl(string tld, string responseType, string clientId, string redirectUri, string state, Dictionary additionalQueryStringParams = null, string subdomain = "secure"); } - public class OAuthService : IOAuthService + public partial class OAuthService : IOAuthService { public string ClientId { get; set; } public string ClientSecret { get; set; } @@ -98,12 +96,12 @@ public FormQuery GetPasswordGrantRequestQuery(string username, strin }, subdomain); } -#if ASYNC public Task ExchangeAuthorizationCodeAsync(OAuthAuthorizationCode code) { return RequestOAuthTokenAsync(GetAuthorizationCodeForTokenQuery(code)); } + [NotNull] public Task RefreshOAuthTokenAsync(OAuthToken token) { return RequestOAuthTokenAsync(GetRefreshOAuthTokenQuery(token)); @@ -124,6 +122,7 @@ public Task PasswordGrantAsync(string username, string password, str applicationControlPlane)); } + [NotNull] private Task RequestOAuthTokenAsync(FormQuery oauthTokenQuery) { for (int i = 0; i < 2; i++) @@ -147,7 +146,6 @@ private Task RequestOAuthTokenAsync(FormQuery oauthToken throw new Exception(); } -#endif private FormQuery CreateOAuthTokenRequestQuery(string applicationControlPlane, IEnumerable> requestFormData, string subdomain = "secure") diff --git a/src/ShareFile.Api.Client/Security/Cryptography/HmacSha256Provider.cs b/src/ShareFile.Api.Client/Security/Cryptography/HmacSha256Provider.cs index cda1f89..0024f1c 100644 --- a/src/ShareFile.Api.Client/Security/Cryptography/HmacSha256Provider.cs +++ b/src/ShareFile.Api.Client/Security/Cryptography/HmacSha256Provider.cs @@ -1,4 +1,4 @@ -#if !NETFX_CORE +#if !PORTABLE using System.Security.Cryptography; namespace ShareFile.Api.Client.Security.Cryptography diff --git a/src/ShareFile.Api.Client/ShareFile.Api.Client.csproj b/src/ShareFile.Api.Client/ShareFile.Api.Client.csproj new file mode 100644 index 0000000..079913f --- /dev/null +++ b/src/ShareFile.Api.Client/ShareFile.Api.Client.csproj @@ -0,0 +1,94 @@ + + + + + + net45;net462;netstandard1.3;portable-net45+win8+wpa81 + true + ShareFile.Api.Client + ShareFile.Api.Client + ShareFile + True + 1701;1702;1705;1591;1571;1572;1573;1570 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .NETPortable + v4.5 + Profile111 + .NETPortable,Version=v0.0,Profile=Profile111 + $(DefineConstants);PORTABLE;ASYNC;NETFX_CORE + $(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets + + + + $(DefineConstants);ASYNC;NETFX_CORE + + + + $(DefineConstants);ASYNC;NETFX_CORE + + + + $(DefineConstants);ASYNC;NETFX_CORE + + + + + + + + + All + + + + + diff --git a/src/ShareFile.Api.Client/ShareFile.Api.Client.xproj b/src/ShareFile.Api.Client/ShareFile.Api.Client.xproj deleted file mode 100644 index 84b16a8..0000000 --- a/src/ShareFile.Api.Client/ShareFile.Api.Client.xproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 5b517b21-7981-4df2-8989-ebe79a850416 - ShareFile.Api.Client - .\obj - .\bin\ - - - 2.0 - - - True - - - \ No newline at end of file diff --git a/src/ShareFile.Api.Client/ShareFileClient.Entities.cs b/src/ShareFile.Api.Client/ShareFileClient.Entities.cs index 235321c..250413f 100644 --- a/src/ShareFile.Api.Client/ShareFileClient.Entities.cs +++ b/src/ShareFile.Api.Client/ShareFileClient.Entities.cs @@ -5,7 +5,7 @@ // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // -// Copyright (c) 2016 Citrix ShareFile. All rights reserved. +// Copyright (c) 2018 Citrix ShareFile. All rights reserved. // // ------------------------------------------------------------------------------ using ShareFile.Api.Client.Entities; @@ -14,10 +14,15 @@ namespace ShareFile.Api.Client { public partial interface IShareFileClient { + IAppsEntity Apps { get; } + IFavoritesEntity Favorites { get; } + IWebhookClientsEntity WebhookClients { get; } + IWebhookSubscriptionsEntity WebhookSubscriptions { get; } + IWorkflowsEntity Workflows { get; } IPoliciesEntity Policies { get; } IConnectorGroupsEntity ConnectorGroups { get; } + IEncryptedEmailsEntity EncryptedEmails { get; } IFileLockEntity FileLock { get; } - IIrmClassificationsEntity IrmClassifications { get; } IRemoteUploadsEntity RemoteUploads { get; } IReportsEntity Reports { get; } IFolderTemplatesEntity FolderTemplates { get; } @@ -25,7 +30,6 @@ public partial interface IShareFileClient IAccountsEntity Accounts { get; } IAsyncOperationsEntity AsyncOperations { get; } ICapabilitiesEntity Capabilities { get; } - IConfigsEntity Configs { get; } IDevicesEntity Devices { get; } IFavoriteFoldersEntity FavoriteFolders { get; } IGroupsEntity Groups { get; } @@ -36,16 +40,22 @@ public partial interface IShareFileClient IStorageCentersEntity StorageCenters { get; } IUsersEntity Users { get; } IZonesEntity Zones { get; } + ISamlMetadataEntity SamlMetadata { get; } } public partial class ShareFileClient { private ShareFileClient() { + Apps = new AppsEntity(this); + Favorites = new FavoritesEntity(this); + WebhookClients = new WebhookClientsEntity(this); + WebhookSubscriptions = new WebhookSubscriptionsEntity(this); + Workflows = new WorkflowsEntity(this); Policies = new PoliciesEntity(this); ConnectorGroups = new ConnectorGroupsEntity(this); + EncryptedEmails = new EncryptedEmailsEntity(this); FileLock = new FileLockEntity(this); - IrmClassifications = new IrmClassificationsEntity(this); RemoteUploads = new RemoteUploadsEntity(this); Reports = new ReportsEntity(this); FolderTemplates = new FolderTemplatesEntity(this); @@ -53,7 +63,6 @@ private ShareFileClient() Accounts = new AccountsEntity(this); AsyncOperations = new AsyncOperationsEntity(this); Capabilities = new CapabilitiesEntity(this); - Configs = new ConfigsEntity(this); Devices = new DevicesEntity(this); FavoriteFolders = new FavoriteFoldersEntity(this); Groups = new GroupsEntity(this); @@ -64,12 +73,18 @@ private ShareFileClient() StorageCenters = new StorageCentersEntity(this); Users = new UsersEntity(this); Zones = new ZonesEntity(this); + SamlMetadata = new SamlMetadataEntity(this); } + public IAppsEntity Apps { get; private set; } + public IFavoritesEntity Favorites { get; private set; } + public IWebhookClientsEntity WebhookClients { get; private set; } + public IWebhookSubscriptionsEntity WebhookSubscriptions { get; private set; } + public IWorkflowsEntity Workflows { get; private set; } public IPoliciesEntity Policies { get; private set; } public IConnectorGroupsEntity ConnectorGroups { get; private set; } + public IEncryptedEmailsEntity EncryptedEmails { get; private set; } public IFileLockEntity FileLock { get; private set; } - public IIrmClassificationsEntity IrmClassifications { get; private set; } public IRemoteUploadsEntity RemoteUploads { get; private set; } public IReportsEntity Reports { get; private set; } public IFolderTemplatesEntity FolderTemplates { get; private set; } @@ -77,7 +92,6 @@ private ShareFileClient() public IAccountsEntity Accounts { get; private set; } public IAsyncOperationsEntity AsyncOperations { get; private set; } public ICapabilitiesEntity Capabilities { get; private set; } - public IConfigsEntity Configs { get; private set; } public IDevicesEntity Devices { get; private set; } public IFavoriteFoldersEntity FavoriteFolders { get; private set; } public IGroupsEntity Groups { get; private set; } @@ -88,5 +102,6 @@ private ShareFileClient() public IStorageCentersEntity StorageCenters { get; private set; } public IUsersEntity Users { get; private set; } public IZonesEntity Zones { get; private set; } + public ISamlMetadataEntity SamlMetadata { get; private set; } } } \ No newline at end of file diff --git a/src/ShareFile.Api.Client/ShareFileClient.cs b/src/ShareFile.Api.Client/ShareFileClient.cs index f0b4334..c340263 100644 --- a/src/ShareFile.Api.Client/ShareFileClient.cs +++ b/src/ShareFile.Api.Client/ShareFileClient.cs @@ -13,7 +13,6 @@ using ShareFile.Api.Client.Entities; using ShareFile.Api.Client.Events; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.FileSystem; using ShareFile.Api.Client.Logging; using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Requests.Executors; @@ -24,7 +23,7 @@ using ShareFile.Api.Client.Transfers; using ShareFile.Api.Client.Transfers.Downloaders; using ShareFile.Api.Client.Transfers.Uploaders; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client { @@ -32,17 +31,17 @@ public partial interface IShareFileClient { Uri BaseUri { get; set; } Configuration Configuration { get; set; } -#if ShareFile - CustomAuthentication CustomAuthentication { get; set; } -#endif - -#if ASYNC - AsyncUploaderBase GetAsyncFileUploader(UploadSpecificationRequest uploadSpecificationRequest, IPlatformFile file, FileUploaderConfig config = null, int? expirationDays = null); + AsyncUploaderBase GetAsyncFileUploader( + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null, + int? expirationDays = null); + AsyncUploaderBase GetAsyncFileUploader( ActiveUploadState activeUploadState, UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null); AsyncFileDownloader GetAsyncFileDownloader(Item itemToDownload, DownloaderConfig config = null); @@ -50,8 +49,18 @@ AsyncUploaderBase GetAsyncFileUploader( AsyncFileDownloader GetAsyncFileDownloader(DownloadSpecification downloadSpecification, DownloaderConfig config = null); void RegisterAsyncRequestExecutor(IAsyncRequestExecutor asyncRequestExecutor); -#endif - SyncUploaderBase GetFileUploader(UploadSpecificationRequest uploadSpecificationRequest, IPlatformFile file, FileUploaderConfig config = null, int? expirationDays = null); + + SyncUploaderBase GetFileUploader( + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null, + int? expirationDays = null); + + SyncUploaderBase GetFileUploader( + ActiveUploadState activeUploadState, + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null); FileDownloader GetFileDownloader(Item itemToDownload, DownloaderConfig config = null); @@ -120,15 +129,18 @@ void RegisterType() where TReplace : ODataObject; T Entities() where T : EntityBase; -#if ASYNC - Task ExecuteAsync(IQuery stream, CancellationToken? token = null); - Task ExecuteAsync(IStreamQuery stream, CancellationToken? token = null); - Task ExecuteAsync(IQuery query, CancellationToken? token = null) + [NotNull] + Task ExecuteAsync(IQuery stream, CancellationToken token = default(CancellationToken)); + [NotNull] + Task ExecuteAsync(IStreamQuery stream, CancellationToken token = default(CancellationToken)); + + [NotNull] + Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)) where T : class; - Task ExecuteAsync(IQuery query, CancellationToken? token = null); -#endif + [NotNull] + Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)); Stream Execute(IQuery stream); Stream Execute(IStreamQuery stream); @@ -139,6 +151,8 @@ T Execute(IQuery query) IEnumerable GetCachedCapabilities(Uri itemUri); void SetCachedCapabilities(Uri itemUri, IEnumerable capabilities); + + void SetConfiguration(Configuration configuration); } public partial class ShareFileClient : IShareFileClient @@ -179,31 +193,6 @@ public ShareFileClient(string baseUri, Configuration configuration = null) protected internal JsonSerializer LoggingSerializer { get; set; } internal RequestProviderFactory RequestProviderFactory { get; set; } -#if ShareFile - - [Obsolete("Use CustomAuthentication instead. This will be removed from the next major release.")] - CustomAuthentication ZoneAuthentication - { - get { return CustomAuthentication; } - set { CustomAuthentication = value; } - } - - private CustomAuthentication _customAuthentication; - - public CustomAuthentication CustomAuthentication - { - get { return _customAuthentication; } - set - { - if (value.UsesHmacSha256 && !HmacSha256ProviderFactory.HasProvider()) - { - throw new Exception("An instance of IHmacSha256Provider has not been registered, this is required for CustomAuthentication to sign requests."); - } - _customAuthentication = value; - } - } -#endif - internal void RegisterRequestProviders() { RequestProviderFactory = new RequestProviderFactory(); @@ -223,6 +212,12 @@ internal void RegisterRequestProviders() } internal void InitializeHttpClient() + { + HttpClient = Configuration.HttpClientFactory != null + ? Configuration.HttpClientFactory(CredentialCache, CookieContainer) + : CreateHttpClient(); + } + private HttpClientHandler CreateHttpHandler() { var handler = new HttpClientHandler { @@ -252,7 +247,12 @@ internal void InitializeHttpClient() handler.UseProxy = true; } - HttpClient = new HttpClient(handler, false) + return handler; + } + private HttpClient CreateHttpClient() + { + var handler = CreateHttpHandler(); + return new HttpClient(handler, false) { Timeout = new TimeSpan(0, 0, 0, 0, Configuration.HttpTimeout) }; @@ -362,7 +362,6 @@ private void PreprocessUploadSpecRequest(UploadSpecificationRequest uploadSpecif } } -#if ASYNC /// /// /// @@ -373,7 +372,7 @@ private void PreprocessUploadSpecRequest(UploadSpecificationRequest uploadSpecif /// public AsyncUploaderBase GetAsyncFileUploader( UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null, int? expirationDays = null) { @@ -382,9 +381,9 @@ public AsyncUploaderBase GetAsyncFileUploader( switch (uploadSpecificationRequest.Method) { case UploadMethod.Standard: - return new AsyncStandardFileUploader(this, uploadSpecificationRequest, file, config, expirationDays); + return new AsyncStandardFileUploader(this, uploadSpecificationRequest, stream, config, expirationDays); case UploadMethod.Threaded: - return new AsyncScalingFileUploader(this, uploadSpecificationRequest, file, config, expirationDays); + return new AsyncScalingFileUploader(this, uploadSpecificationRequest, stream, config, expirationDays); } throw new NotSupportedException(uploadSpecificationRequest.Method + " is not supported."); @@ -393,7 +392,7 @@ public AsyncUploaderBase GetAsyncFileUploader( public AsyncUploaderBase GetAsyncFileUploader( ActiveUploadState activeUploadState, UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null) { this.PreprocessUploadSpecRequest(uploadSpecificationRequest); @@ -401,19 +400,19 @@ public AsyncUploaderBase GetAsyncFileUploader( switch (uploadSpecificationRequest.Method) { case UploadMethod.Standard: - return new AsyncStandardFileUploader(this, uploadSpecificationRequest, file, config); + return new AsyncStandardFileUploader(this, uploadSpecificationRequest, stream, config); case UploadMethod.Threaded: return new AsyncScalingFileUploader( this, activeUploadState, uploadSpecificationRequest, - file, + stream, config); } throw new NotSupportedException(uploadSpecificationRequest.Method + " is not supported."); } - + public AsyncFileDownloader GetAsyncFileDownloader(Item itemToDownload, DownloaderConfig config = null) { return new AsyncFileDownloader(itemToDownload, this, config); @@ -423,7 +422,6 @@ public AsyncFileDownloader GetAsyncFileDownloader(DownloadSpecification download { return new AsyncFileDownloader(downloadSpecification, this, config); } -#endif /// /// @@ -435,7 +433,7 @@ public AsyncFileDownloader GetAsyncFileDownloader(DownloadSpecification download /// public SyncUploaderBase GetFileUploader( UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null, int? expirationDays = null) { @@ -444,14 +442,34 @@ public SyncUploaderBase GetFileUploader( switch (uploadSpecificationRequest.Method) { case UploadMethod.Standard: - return new StandardFileUploader(this, uploadSpecificationRequest, file, config, expirationDays); + return new StandardFileUploader(this, uploadSpecificationRequest, stream, config, expirationDays); case UploadMethod.Threaded: - return new ScalingFileUploader(this, uploadSpecificationRequest, file, config, expirationDays); + return new ScalingFileUploader(this, uploadSpecificationRequest, stream, config, expirationDays); } throw new NotSupportedException(uploadSpecificationRequest.Method + " is not supported."); } + public SyncUploaderBase GetFileUploader( + ActiveUploadState activeUploadState, + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null) + { + UploadMethod? method = activeUploadState.UploadSpecification.Method; + if (!method.HasValue) + throw new ArgumentNullException("UploadSpecification.Method"); + switch (method.Value) + { + case UploadMethod.Standard: + return new StandardFileUploader(this, activeUploadState.UploadSpecification, uploadSpecificationRequest, stream, config); + case UploadMethod.Threaded: + return new ScalingFileUploader(this, activeUploadState, uploadSpecificationRequest, stream, config); + default: + throw new NotSupportedException($"{method} is not supported"); + } + } + public FileDownloader GetFileDownloader(Item itemToDownload, DownloaderConfig config = null) { return new FileDownloader(itemToDownload, this, config); @@ -504,51 +522,55 @@ public virtual void RegisterType() ODataFactory.GetInstance().RegisterType(); } - protected List ChangeDomainHandlers { get; set; } - protected List ExceptionHandlers { get; set; } + protected readonly List ChangeDomainHandlers = new List(capacity: 0); + + protected readonly List ExceptionHandlers = new List(capacity: 0); public void AddChangeDomainHandler(ChangeDomainCallback handler) { - if (ChangeDomainHandlers == null) + lock (ChangeDomainHandlers) { - ChangeDomainHandlers = new List(); + ChangeDomainHandlers.Add(handler); } - - ChangeDomainHandlers.Add(handler); } public void AddExceptionHandler(ExceptionCallback handler) { - if (ExceptionHandlers == null) + lock (ExceptionHandlers) { - ExceptionHandlers = new List(); + ExceptionHandlers.Add(handler); } - - ExceptionHandlers.Add(handler); } public bool RemoveChangeDomainHandler(ChangeDomainCallback handler) { - if (ChangeDomainHandlers == null) return false; - - return ChangeDomainHandlers.Remove(handler); + lock(ChangeDomainHandlers) + { + return ChangeDomainHandlers.Remove(handler); + } } public bool RemoveExceptionHandler(ExceptionCallback handler) { - if (ExceptionHandlers == null) return false; - - return ExceptionHandlers.Remove(handler); + lock (ExceptionHandlers) + { + return ExceptionHandlers.Remove(handler); + } } public EventHandlerResponse OnException(HttpResponseMessage responseMessage, int retryCount) { - if (ExceptionHandlers != null) + List handlers; + lock(ExceptionHandlers) { - foreach (var handler in ExceptionHandlers) + handlers = new List(ExceptionHandlers); + } + foreach (var handler in handlers) + { + var action = handler(responseMessage, retryCount); + if (action.Action != EventHandlerResponseAction.Ignore) { - var action = handler(responseMessage, retryCount); - if (action.Action != EventHandlerResponseAction.Ignore) return action; + return action; } } return EventHandlerResponse.Throw; @@ -556,12 +578,17 @@ public EventHandlerResponse OnException(HttpResponseMessage responseMessage, int public EventHandlerResponse OnChangeDomain(HttpRequestMessage requestMessage, Redirection redirection) { - if (ChangeDomainHandlers != null) + List handlers; + lock(ChangeDomainHandlers) { - foreach (var handler in ChangeDomainHandlers) + handlers = new List(ChangeDomainHandlers); + } + foreach (var handler in handlers) + { + var action = handler(requestMessage, redirection); + if (action.Action != EventHandlerResponseAction.Ignore) { - var action = handler(requestMessage, redirection); - if (action.Action != EventHandlerResponseAction.Ignore) return action; + return action; } } return new EventHandlerResponse() { Action = EventHandlerResponseAction.Redirect, Redirection = redirection }; @@ -586,11 +613,10 @@ public void RegisterAsyncRequestProvider(Func asyncReques { RequestProviderFactory.RegisterAsyncRequestProvider(asyncRequestProvider); } + protected internal ISyncRequestExecutor SyncRequestExecutor { get; set; } -#if ASYNC protected internal IAsyncRequestExecutor AsyncRequestExecutor { get; set; } -#endif /// /// This RequestExecutor will be used for all requests created by this ShareFileClient instance, overriding the global RequestExecutorFactory. @@ -600,7 +626,7 @@ public void RegisterSyncRequestExecutor(ISyncRequestExecutor syncRequestExecutor { SyncRequestExecutor = syncRequestExecutor; } -#if ASYNC + /// /// This RequestExecutor will be used for all requests created by this ShareFileClient instance, overriding the global RequestExecutorFactory. /// @@ -609,7 +635,6 @@ public void RegisterAsyncRequestExecutor(IAsyncRequestExecutor asyncRequestExecu { AsyncRequestExecutor = asyncRequestExecutor; } -#endif public bool HasCredentials(Uri uri, string authenticationType = "") { @@ -725,28 +750,30 @@ public T Entities() where T : EntityBase #endregion -#if ASYNC - public virtual Task ExecuteAsync(IStreamQuery stream, CancellationToken? token = null) + [NotNull] + public virtual Task ExecuteAsync(IStreamQuery stream, CancellationToken token = default(CancellationToken)) { return RequestProviderFactory.GetAsyncRequestProvider().ExecuteAsync(stream, token); } - public virtual Task ExecuteAsync(IQuery stream, CancellationToken? token = null) + [NotNull] + public virtual Task ExecuteAsync(IQuery stream, CancellationToken token = default(CancellationToken)) { return RequestProviderFactory.GetAsyncRequestProvider().ExecuteAsync(stream, token); } - public virtual Task ExecuteAsync(IQuery query, CancellationToken? token = null) + [NotNull] + public virtual Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)) where T : class { return RequestProviderFactory.GetAsyncRequestProvider().ExecuteAsync(query, token); } - public virtual Task ExecuteAsync(IQuery query, CancellationToken? token = null) + [NotNull] + public virtual Task ExecuteAsync(IQuery query, CancellationToken token = default(CancellationToken)) { return RequestProviderFactory.GetAsyncRequestProvider().ExecuteAsync(query, token); } -#endif public virtual Stream Execute(IStreamQuery stream) { @@ -776,5 +803,12 @@ public static string GetProvider(Uri uri) return path[0]; return "sf"; } + + public void SetConfiguration(Configuration configuration) + { + Configuration = configuration ?? Configuration.Default(); + Logging = new LoggingProvider(Configuration.Logger); + InitializeHttpClient(); + } } } \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncDownloaderBase.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncDownloaderBase.cs new file mode 100644 index 0000000..4a4d507 --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncDownloaderBase.cs @@ -0,0 +1,78 @@ +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Models; +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Transfers.Downloaders +{ + public abstract class AsyncDownloaderBase : DownloaderBase + { + protected AsyncDownloaderBase(Item item, IShareFileClient client, DownloaderConfig config = null) + : base(item, client, config) + { } + + protected AsyncDownloaderBase(DownloadSpecification downloadSpecification, IShareFileClient client, DownloaderConfig config = null) + : base(downloadSpecification, client, config) + { } + + /// + /// Prepares the downloader instance. + /// + public async Task PrepareDownloadAsync(CancellationToken cancellationToken = default(CancellationToken)) + { + DownloadSpecification = await CreateDownloadSpecificationAsync(cancellationToken); + } + + + /// + /// Downloads the file to the provided Stream. + /// + /// + /// + /// + /// + /// Overrides Config.RangeRequest. ShareFile may have some restrictions on the number of times a range request can be issued for a given download session. + /// There is a chance that providing this can result in failures. + /// + public virtual async Task DownloadToAsync( + Stream stream, + CancellationToken cancellationToken = default(CancellationToken), + Dictionary transferMetadata = null, + RangeRequest rangeRequest = null) + { + if (rangeRequest != null && DownloadSpecification == null) + { + throw new InvalidOperationException("Downloader instance has not been prepared. In order to supply a RangeRequest, you must first call PrepareDownloadAsync."); + } + + if (DownloadSpecification == null) + { + await PrepareDownloadAsync(cancellationToken); + } + else if (Item != null && !await SupportsDownloadSpecificationAsync(Item.GetObjectUri())) + { + throw new NotSupportedException("Provider does not support download with DownloadSpecification)"); + } + + rangeRequest = rangeRequest ?? Config.RangeRequest; + + CancellationTokenSource downloadCancellationSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + try + { + progressReporter.StartReporting(transferMetadata, downloadCancellationSource.Token); + await InternalDownloadAsync(stream, rangeRequest, cancellationToken); + progressReporter.ReportCompletion(); + } + finally + { + downloadCancellationSource.Cancel(); + downloadCancellationSource.Dispose(); + } + } + + protected abstract Task InternalDownloadAsync(Stream stream, RangeRequest rangeRequest, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncFileDownloader.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncFileDownloader.cs index e340810..60f58d2 100644 --- a/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncFileDownloader.cs +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncFileDownloader.cs @@ -4,89 +4,45 @@ using System.Net; using System.Threading; using System.Threading.Tasks; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; using System.Runtime.ExceptionServices; using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Requests; +using System.Buffers; namespace ShareFile.Api.Client.Transfers.Downloaders { -#if ASYNC - public class AsyncFileDownloader : DownloaderBase + public class AsyncFileDownloader : AsyncDownloaderBase { public AsyncFileDownloader(Item item, IShareFileClient client, DownloaderConfig config = null) : base(item, client, config) - { - } + { } public AsyncFileDownloader(DownloadSpecification downloadSpecification, IShareFileClient client, DownloaderConfig config = null) : base(downloadSpecification, client, config) - { - } - - /// - /// Prepares the downloader instance. - /// - public async Task PrepareDownloadAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - DownloadSpecification = await CreateDownloadSpecificationAsync(cancellationToken); - } - + { } - /// - /// Downloads the file to the provided Stream. - /// - /// - /// - /// - /// - /// Overrides Config.RangeRequest. ShareFile may have some restrictions on the number of times a range request can be issued for a given download session. - /// There is a chance that providing this can result in failures. - /// - public async virtual Task DownloadToAsync( - Stream stream, - CancellationToken? cancellationToken = null, - Dictionary transferMetadata = null, - RangeRequest rangeRequest = null) + protected override async Task InternalDownloadAsync(Stream outputStream, RangeRequest rangeRequest, CancellationToken cancellationToken) { - if (rangeRequest != null && DownloadSpecification == null) - { - throw new InvalidOperationException("Downloader instance has not been prepared. In order to supply a RangeRequest, you must first call PrepareDownloadAsync."); - } - - if (DownloadSpecification == null) - { - await PrepareDownloadAsync(); - } - else if (!await SupportsDownloadSpecificationAsync(Item.GetObjectUri())) + var streamQuery = CreateDownloadStreamQuery(rangeRequest); + Stream downloadStream = null; + try { - throw new NotSupportedException("Provider does not support download with DownloadSpecification)"); + downloadStream = await streamQuery.ExecuteAsync(cancellationToken).ConfigureAwait(false); + downloadStream = ExpectedLengthStream(downloadStream); + await ReadAllBytesAsync(outputStream, downloadStream, cancellationToken).ConfigureAwait(false); } - - var streamQuery = CreateDownloadStreamQuery(rangeRequest); - - var totalBytesToDownload = rangeRequest != null - ? rangeRequest.End.GetValueOrDefault() - rangeRequest.Begin.GetValueOrDefault() - : Item.FileSizeBytes.GetValueOrDefault(); - - var progress = new TransferProgress(totalBytesToDownload, transferMetadata); - - using (var downloadStream = await streamQuery.ExecuteAsync(cancellationToken)) + finally { - if (downloadStream != null) - { - await ReadAllBytesAsync(stream, downloadStream, progress, cancellationToken.GetValueOrDefault()).ConfigureAwait(false); - } + downloadStream?.Dispose(); } - - NotifyProgress(progress.MarkComplete()); } #if PORTABLE || NETSTANDARD1_3 - private async Task ReadAllBytesAsync(Stream fileStream, Stream stream, TransferProgress progress, CancellationToken cancellationToken) + private async Task ReadAllBytesAsync(Stream fileStream, Stream stream, CancellationToken cancellationToken) { - var buffer = new byte[Config.BufferSize]; + var buffer = new byte[Configuration.BufferSize]; using (var timeoutToken = new CancellationTokenSource()) { @@ -106,9 +62,7 @@ private async Task ReadAllBytesAsync(Stream fileStream, Stream stream, TransferP if (bytesRead > 0) { fileStream.Write(buffer, 0, bytesRead); - - NotifyProgress(progress.UpdateBytesTransferred(bytesRead)); - + progressReporter.ReportProgress(bytesRead); await TryPauseAsync(cancellationToken).ConfigureAwait(false); } @@ -118,85 +72,94 @@ private async Task ReadAllBytesAsync(Stream fileStream, Stream stream, TransferP } } #else - private async Task ReadAllBytesAsync(Stream fileStream, Stream stream, TransferProgress progress, CancellationToken cancellationToken) + private async Task ReadAllBytesAsync(Stream fileStream, Stream stream, CancellationToken cancellationToken) { if (stream.CanTimeout) { stream.ReadTimeout = Client.Configuration.HttpTimeout; } - - using (var linkedToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken)) + + var timeoutTimer = System.Diagnostics.Stopwatch.StartNew(); + var cancellationTaskSource = new TaskCompletionSource(); + var cancellationCallbackRegistration = cancellationToken.Register(CancellationCallback, cancellationTaskSource); + var buffer = ArrayPool.Shared.Rent(Configuration.BufferSize); + try { - try + var timeoutTask = TimeoutChecker(timeoutTimer); + var cancellationTask = cancellationTaskSource.Task; + int bytesRead; + do { - var cancellationTask = CancellationChecker(linkedToken.Token); - var buffer = new byte[Config.BufferSize]; - int bytesRead; - do - { - // We have to use stream.Read instead of stream.ReadyAsync due to a .NET bug - var readTask = Task.Factory.StartNew( - () => stream.Read(buffer, 0, buffer.Length), - cancellationToken, - TaskCreationOptions.LongRunning, - TaskScheduler.Default); - - // Wait until either the read finished, or the user cancelled the operation - var finishedTask = await Task.WhenAny(readTask, cancellationTask).ConfigureAwait(false); - if (finishedTask == readTask) - { - bytesRead = readTask.Result; - } - else - { - throw new TaskCanceledException(); - } - if (bytesRead > 0) - { - fileStream.Write(buffer, 0, bytesRead); - - NotifyProgress(progress.UpdateBytesTransferred(bytesRead)); + // NetworkStream.ReadAsync does not respect cancellationToken or readTimeout. + var readTask = stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); - await TryPauseAsync(cancellationToken).ConfigureAwait(false); - } + // Wait until either the read finishes, the timeout is reached, or the user cancels the download. + var finishedTask = await Task.WhenAny(readTask, timeoutTask, cancellationTask).ConfigureAwait(false); + if(finishedTask != readTask) + { + // Download timed out or cancelled, but the read is still running. If it throws, swallow the exception. + WaitForFinalRead(readTask, buffer); + // The read is still using the buffer. Don't release it until the read finishes. + buffer = null; + throw finishedTask == timeoutTask ? new TimeoutException() : (Exception)new TaskCanceledException(); } - while (bytesRead > 0); - } - catch (AggregateException ex) - { - // The read or cancellation task will always be wrapped, so just rethrow the inner exception. - throw ex.InnerException; + // Read finished (but may throw on await). + bytesRead = await readTask.ConfigureAwait(false); + if (bytesRead > 0) + { + await fileStream.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); + progressReporter.ReportProgress(bytesRead); + await TryPauseAsync(cancellationToken).ConfigureAwait(false); + } + timeoutTimer.Restart(); } - finally + while (bytesRead > 0); + } + finally + { + if (buffer != null) { - // Clean up the timer - linkedToken.Cancel(); + ArrayPool.Shared.Return(buffer); } + cancellationCallbackRegistration.Dispose(); + timeoutTimer.Stop(); } } - private Task CancellationChecker(CancellationToken cancellationToken) + private static void CancellationCallback(object cancellationTaskSource) { - TaskCompletionSource tcs = new TaskCompletionSource(); + ((TaskCompletionSource)cancellationTaskSource).SetResult(result: true); + } - // Timer will poll the cancellation token ever 1000ms - Timer timer = null; - timer = new Timer(_ => + private static void WaitForFinalRead(Task readTask, byte[] buffer) + { + Task.Run(async () => { - if (cancellationToken.IsCancellationRequested) + try { - tcs.SetCanceled(); - timer.Dispose(); + await readTask.ConfigureAwait(false); } - else + catch { } + finally { - timer.Change(1000, Timeout.Infinite); + ArrayPool.Shared.Return(buffer); } - }, null, 1000, Timeout.Infinite); + }).ConfigureAwait(false); + } - return tcs.Task; + private async Task TimeoutChecker(System.Diagnostics.Stopwatch timeoutTimer) + { + TimeSpan readTimeout = TimeSpan.FromMilliseconds(Client.Configuration.HttpTimeout); + while(timeoutTimer.IsRunning) + { + TimeSpan timeSinceLastRead = timeoutTimer.Elapsed; + if(timeSinceLastRead > readTimeout) + { + return; + } + await Task.Delay(readTimeout - timeSinceLastRead); + } } #endif } -#endif } diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncMemoryMappedFileDownloader.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncMemoryMappedFileDownloader.cs new file mode 100644 index 0000000..e936f0b --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/AsyncMemoryMappedFileDownloader.cs @@ -0,0 +1,210 @@ +#if !PORTABLE && !NETSTANDARD1_3 +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using ShareFile.Api.Client.Models; +using System.IO.MemoryMappedFiles; + +namespace ShareFile.Api.Client.Transfers.Downloaders +{ + public class AsyncMemoryMappedFileDownloader : AsyncDownloaderBase, IDisposable + { + private readonly long fileSize; + private readonly object locker = new object(); + private MemoryMappedFile memoryMappedFile; + private long completedBytes = 0; + private int readStreamsInUse = 0; + private readonly LinkedList readRequests = new LinkedList(); + private bool disposed = false; + + public AsyncMemoryMappedFileDownloader(Item item, IShareFileClient client, DownloaderConfig config = null) + : base(item, client, config) + { + if (Config.RangeRequest != null) + throw new ArgumentException($"{nameof(AsyncMemoryMappedFileDownloader)} does not support {nameof(RangeRequest)}", $"{nameof(DownloaderConfig)}"); + if (!item.FileSizeBytes.HasValue) + throw new ArgumentException($"{nameof(Item)} must include {nameof(Item.FileSizeBytes)}", $"{nameof(Item)}"); + + fileSize = item.FileSizeBytes.Value; + } + + private MemoryMappedFile CreateMemoryMappedFile(FileStream fileStream) + { + return MemoryMappedFile.CreateFromFile( + fileStream, + mapName: null, + capacity: fileSize, + access: MemoryMappedFileAccess.ReadWrite, + memoryMappedFileSecurity: null, + inheritability: HandleInheritability.None, + leaveOpen: false); + } + + protected override async Task InternalDownloadAsync(Stream stream, RangeRequest rangeRequest, CancellationToken cancellationToken) + { + if (!(stream is FileStream)) + throw new ArgumentException($"Stream argument to {nameof(AsyncMemoryMappedFileDownloader)} must be a {nameof(FileStream)}"); + + using (var inputStream = await DownloadStreamAsync(cancellationToken).ConfigureAwait(false)) + { + memoryMappedFile = CreateMemoryMappedFile((FileStream)stream); + using (var outputStream = memoryMappedFile.CreateViewStream(0, fileSize)) + { + var readTask = inputStream.CopyToAsync(new ProgressStream(outputStream, OnProgress)); + var cancelCheckTask = CancellationCheckerAsync(cancellationToken, TimeSpan.FromSeconds(1)); + await Task.WhenAny(readTask, cancelCheckTask).ConfigureAwait(false); + } + if (cancellationToken.IsCancellationRequested) + throw new TaskCanceledException(); + } + } + + private async Task DownloadStreamAsync(CancellationToken cancellationToken) + { + var streamQuery = CreateDownloadStreamQuery(rangeRequest: null); + var stream = await streamQuery.ExecuteAsync(cancellationToken).ConfigureAwait(false); + if (stream.CanTimeout) + stream.ReadTimeout = Client.Configuration.HttpTimeout; + + return stream; + } + + private async Task CancellationCheckerAsync(CancellationToken cancellationToken, TimeSpan cancellationCheckInterval) + { + while (!cancellationToken.IsCancellationRequested) + await Task.Delay(cancellationCheckInterval); + } + + private void OnProgress(long bytesTransferred) + { + lock (locker) + { + completedBytes += bytesTransferred; + CompleteReadRequests(); + } + progressReporter.ReportProgress(bytesTransferred); + } + + public Task ReadFileAsync(long offset, long size) + { + lock(locker) + { + if (disposed) + throw new ObjectDisposedException(nameof(AsyncMemoryMappedFileDownloader)); + + if (offset < 0 || offset + size > fileSize) + throw new ArgumentException($"Invalid {nameof(ReadFileAsync)} args: got {offset}:{offset + size}, accept {0}:{fileSize}"); + + if (offset + size <= completedBytes) + return Task.FromResult(CreateReadStream(offset, size)); + + return EnqueueReadRequest(offset, size).Waiter.Task; + } + } + + private Stream CreateReadStream(long offset, long size) + { + var stream = memoryMappedFile.CreateViewStream(offset, size, MemoryMappedFileAccess.Read); + return new ReadStream(this, stream); + } + + private struct ReadRequest + { + public long Offset; + public long Size; + public TaskCompletionSource Waiter; + } + + private ReadRequest EnqueueReadRequest(long offset, long size) + { + var readRequest = new ReadRequest + { + Offset = offset, + Size = size, + Waiter = new TaskCompletionSource(), + }; + readRequests.AddFirst(readRequest); + return readRequest; + } + + private void CompleteReadRequests() + { + LinkedListNode node = readRequests.First; + LinkedListNode next = null; + while (node != null) + { + next = node.Next; + var readRequest = node.Value; + bool canComplete = readRequest.Offset + readRequest.Size <= completedBytes; + if (canComplete) + { + readRequests.Remove(node); + var readStream = CreateReadStream(readRequest.Offset, readRequest.Size); + Task.Run(() => readRequest.Waiter.SetResult(readStream)); + } + node = next; + } + } + + public void Dispose() + { + if (disposed) + return; + + lock (locker) + { + foreach (var readRequest in readRequests) + { + Task.Run(() => readRequest.Waiter.SetException(new ObjectDisposedException(nameof(AsyncMemoryMappedFileDownloader)))); + } + + TimeSpan maxWaitForReadStreams = TimeSpan.FromSeconds(1); + TimeSpan spinInterval = TimeSpan.FromMilliseconds(20); + for(var waited = TimeSpan.Zero; readStreamsInUse > 0 && waited < maxWaitForReadStreams; waited += spinInterval) + { + Monitor.Exit(locker); + Thread.Sleep(spinInterval); + Monitor.Enter(locker); + } + if (readStreamsInUse > 0) + throw new TimeoutException($"{readStreamsInUse} read streams still in use after {maxWaitForReadStreams}"); + + memoryMappedFile?.Dispose(); + disposed = true; + } + } + + private class ReadStream : StreamWrapper + { + private AsyncMemoryMappedFileDownloader downloader; + private bool closed = false; + + public ReadStream(AsyncMemoryMappedFileDownloader downloader, Stream stream) + : base(stream) + { + this.downloader = downloader; + lock(downloader.locker) + { + downloader.readStreamsInUse += 1; + } + } + + public override void Close() + { + if (!closed) + { + lock (downloader.locker) + { + downloader.readStreamsInUse -= 1; + } + closed = true; + } + base.Close(); + } + } + } +} +#endif \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderBase.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderBase.cs index f48b178..58b7b04 100644 --- a/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderBase.cs +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderBase.cs @@ -1,9 +1,10 @@ using System; using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Requests; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; using System.Threading.Tasks; using System.Threading; +using io = System.IO; namespace ShareFile.Api.Client.Transfers.Downloaders { @@ -14,46 +15,66 @@ public abstract class DownloaderBase : TransfererBase public DownloaderConfig Config { get; set; } protected DownloadSpecification DownloadSpecification { get; set; } - public EventHandler OnTransferProgress; + protected TransferProgressReporter progressReporter; + public event EventHandler OnTransferProgress + { + add { progressReporter.OnTransferProgress += value; } + remove { progressReporter.OnTransferProgress -= value; } + } protected DownloaderBase(Item item, IShareFileClient client, DownloaderConfig config = null) { - if (item == null) - { - throw new ArgumentNullException(nameof(item)); - } - Client = client; - Item = item; + Item = item ?? throw new ArgumentNullException(nameof(item)); Config = config ?? new DownloaderConfig(); + progressReporter = new TransferProgressReporter( + fileSize: BytesToDownload() ?? 0, + transferId: "", + reportInterval: Config.ProgressReportInterval); } protected DownloaderBase(DownloadSpecification downloadSpecification, IShareFileClient client, DownloaderConfig config = null) { - if (downloadSpecification == null) - { - throw new ArgumentNullException(nameof(downloadSpecification)); - } - Client = client; Config = config ?? new DownloaderConfig(); - DownloadSpecification = downloadSpecification; + DownloadSpecification = downloadSpecification ?? throw new ArgumentNullException(nameof(downloadSpecification)); + progressReporter = new TransferProgressReporter( + fileSize: BytesToDownload() ?? 0, + transferId: "", + reportInterval: Config.ProgressReportInterval); } - protected void NotifyProgress(TransferProgress progress) + protected long? BytesToDownload() { - if (OnTransferProgress != null) + // math operators on nullables return null if an arg is null, comparison operators return false + long begin = Config.RangeRequest?.Begin ?? 0; + long? end = Config.RangeRequest?.End ?? (Item?.FileSizeBytes - 1); + long? length = end - begin + 1; // inclusive range + if(length < 0) { - OnTransferProgress.Invoke(this, new TransferEventArgs { Progress = progress }); + throw new ArgumentException($"Cannot download negative-length byte range {begin} : {end}"); } + return length; + } + + protected bool IsRangeRequest => Config.RangeRequest != null && (Config.RangeRequest.Begin.HasValue || Config.RangeRequest.End.HasValue); + + protected io.Stream ExpectedLengthStream(io.Stream downloadStream) + { + long? expectedBytes = BytesToDownload(); + if (!expectedBytes.HasValue) + { + return downloadStream; + } + bool allowRangeReqOffByOne = IsRangeRequest && Config.AllowRangeRequestOffByOne; + return new ExpectedLengthStream(downloadStream, expectedBytes.Value, allowRangeReqOffByOne, Client.Configuration.Logger); } protected StreamQuery CreateDownloadQuery(RangeRequest rangeRequest) { return CreateDownloadStreamQuery(Config.RangeRequest); } - -#if ASYNC + protected async Task CreateDownloadSpecificationAsync(CancellationToken token = default(CancellationToken)) { if (Item == null) @@ -79,7 +100,6 @@ protected StreamQuery CreateDownloadQuery(RangeRequest rangeRequest) return capabilities.SupportsDownloadWithSpecificaton(); } -#endif protected DownloadSpecification CreateDownloadSpecification() { diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderConfig.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderConfig.cs index 8246cde..c2b513f 100644 --- a/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderConfig.cs +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/DownloaderConfig.cs @@ -1,14 +1,20 @@ -namespace ShareFile.Api.Client.Transfers.Downloaders +using System; + +namespace ShareFile.Api.Client.Transfers.Downloaders { public class DownloaderConfig { public RangeRequest RangeRequest { get; set; } - public int BufferSize { get; set; } + [Obsolete] + public int BufferSize { get => Configuration.BufferSize; set { return; } } + public TimeSpan ProgressReportInterval { get; set; } + public bool AllowRangeRequestOffByOne { get; set; } public DownloaderConfig() { RangeRequest = null; - BufferSize = 4096; + ProgressReportInterval = TimeSpan.FromMilliseconds(100); + AllowRangeRequestOffByOne = true; } public static DownloaderConfig Default diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/ExpectedLengthStream.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/ExpectedLengthStream.cs new file mode 100644 index 0000000..c09a6bd --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/ExpectedLengthStream.cs @@ -0,0 +1,61 @@ +using ShareFile.Api.Client.Logging; +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Transfers.Downloaders +{ + internal class ExpectedLengthStream : StreamWrapper + { + private readonly long expectedLength; + private long totalBytesRead = 0; + + private readonly bool allowOffByOne; + private readonly ILogger logger; + + public ExpectedLengthStream(Stream stream, long expectedLength, bool allowOffByOne, ILogger logger) + : base(stream) + { + this.expectedLength = expectedLength; + this.allowOffByOne = allowOffByOne; + this.logger = logger; + } + + private void OnRead(int bytesRead) + { + bool endOfStream = bytesRead == 0; + if (endOfStream) + { + if (allowOffByOne && totalBytesRead == expectedLength - 1) + { + logger?.Error($"Download expected {expectedLength} bytes but stream only contained {totalBytesRead} bytes. Check for off-by-one on RangeRequest (range is inclusive)."); + } + else if (totalBytesRead < expectedLength) + { + throw new Exception($"Expected {expectedLength} bytes but stream only contained {totalBytesRead} bytes."); + } + return; + } + totalBytesRead += bytesRead; + if (totalBytesRead > expectedLength) + { + throw new Exception($"Expected {expectedLength} bytes but stream contains at least {totalBytesRead} bytes."); + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + int read = base.Read(buffer, offset, count); + OnRead(read); + return read; + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + int read = await base.ReadAsync(buffer, offset, count, cancellationToken); + OnRead(read); + return read; + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/FileDownloader.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/FileDownloader.cs index 033f3e3..eb5d7a1 100644 --- a/src/ShareFile.Api.Client/Transfers/Downloaders/FileDownloader.cs +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/FileDownloader.cs @@ -1,10 +1,11 @@ using System.Collections.Generic; using System.IO; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; using System.Threading; using ShareFile.Api.Client.Extensions.Tasks; using System; using ShareFile.Api.Client.Extensions; +using System.Threading.Tasks; namespace ShareFile.Api.Client.Transfers.Downloaders { @@ -20,9 +21,9 @@ public FileDownloader(DownloadSpecification downloadSpecification, IShareFileCli { } - public override void DownloadTo(Stream fileStream, + public override void DownloadTo(Stream outputStream, Dictionary transferMetadata = null, - CancellationToken? cancellationToken = null, + CancellationToken cancellationToken = default(CancellationToken), RangeRequest rangeRequest = null) { if (rangeRequest != null && DownloadSpecification == null) @@ -32,46 +33,48 @@ public override void DownloadTo(Stream fileStream, if (DownloadSpecification == null) { - PrepareDownload(); + PrepareDownload(cancellationToken); } - else if (!SupportsDownloadSpecification(Item.GetObjectUri())) + else if (Item != null && !SupportsDownloadSpecification(Item.GetObjectUri())) { throw new NotSupportedException("Provider does not support download with DownloadSpecification)"); } - var downloadQuery = CreateDownloadStreamQuery(rangeRequest); - - var totalBytesToDownload = rangeRequest != null - ? rangeRequest.End.GetValueOrDefault() - rangeRequest.Begin.GetValueOrDefault() - : Item.FileSizeBytes.GetValueOrDefault(); - - var progress = new TransferProgress(totalBytesToDownload, transferMetadata); + rangeRequest = rangeRequest ?? Config.RangeRequest; - using (var stream = downloadQuery.Execute()) + var downloadQuery = CreateDownloadStreamQuery(rangeRequest); + CancellationTokenSource downloadCancellationSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + Stream downloadStream = null; + try { - if (stream != null) + progressReporter.StartReporting(transferMetadata, downloadCancellationSource.Token); + downloadStream = downloadQuery.Execute(); + downloadStream = ExpectedLengthStream(downloadStream); + + int bytesRead; + var buffer = new byte[Configuration.BufferSize]; + do { - int bytesRead; - var buffer = new byte[Config.BufferSize]; + TryPause(); + if (downloadCancellationSource.Token.IsCancellationRequested) + throw new TaskCanceledException(); - do + bytesRead = downloadStream.Read(buffer, 0, buffer.Length); + if (bytesRead > 0) { - TryPause(); - cancellationToken.ThrowIfRequested(); + outputStream.Write(buffer, 0, bytesRead); + progressReporter.ReportProgress(bytesRead); + } - bytesRead = stream.Read(buffer, 0, buffer.Length); - if (bytesRead > 0) - { - fileStream.Write(buffer, 0, bytesRead); - - NotifyProgress(progress.UpdateBytesTransferred(bytesRead)); - } - - } while (bytesRead > 0); - } + } while (bytesRead > 0); } - - NotifyProgress(progress.MarkComplete()); + finally + { + downloadCancellationSource.Cancel(); + downloadCancellationSource.Dispose(); + downloadStream?.Dispose(); + } + progressReporter.ReportCompletion(); } } } diff --git a/src/ShareFile.Api.Client/Transfers/Downloaders/SyncDownloaderBase.cs b/src/ShareFile.Api.Client/Transfers/Downloaders/SyncDownloaderBase.cs index 456aa6f..31d48c0 100644 --- a/src/ShareFile.Api.Client/Transfers/Downloaders/SyncDownloaderBase.cs +++ b/src/ShareFile.Api.Client/Transfers/Downloaders/SyncDownloaderBase.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using System.IO; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; using System.Threading; namespace ShareFile.Api.Client.Transfers.Downloaders @@ -20,7 +20,7 @@ protected SyncDownloaderBase(DownloadSpecification downloadSpecification, IShare /// /// Prepares the downloader instance. /// - public void PrepareDownload() + public void PrepareDownload(CancellationToken cancellationToken = default(CancellationToken)) { DownloadSpecification = CreateDownloadSpecification(); } @@ -37,7 +37,7 @@ public void PrepareDownload() /// public abstract void DownloadTo(Stream stream, Dictionary transferMetadata = null, - CancellationToken? cancellationToken = null, + CancellationToken cancellationToken = default(CancellationToken), RangeRequest rangeRequest = null); } } diff --git a/src/ShareFile.Api.Client/Transfers/ProgressStream.cs b/src/ShareFile.Api.Client/Transfers/ProgressStream.cs new file mode 100644 index 0000000..1020aa2 --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/ProgressStream.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Transfers +{ + internal class ProgressStream : StreamWrapper + { + private readonly Action progressCallback; + + public ProgressStream(Stream stream, Action progressCallback) + : base(stream) + { + this.progressCallback = progressCallback; + } + + public override int Read(byte[] buffer, int offset, int count) + { + int read = base.Read(buffer, offset, count); + progressCallback(read); + return read; + } + + public override void Write(byte[] buffer, int offset, int count) + { + base.Write(buffer, offset, count); + progressCallback(count); + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + int read = await base.ReadAsync(buffer, offset, count, cancellationToken); + progressCallback(read); + return read; + } + + public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + await base.WriteAsync(buffer, offset, count, cancellationToken); + progressCallback(count); + } + } +} diff --git a/src/ShareFile.Api.Client/Transfers/StreamWrapper.cs b/src/ShareFile.Api.Client/Transfers/StreamWrapper.cs new file mode 100644 index 0000000..62cf636 --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/StreamWrapper.cs @@ -0,0 +1,54 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +#if !PORTABLE && !NETSTANDARD1_3 +using System.Runtime.Remoting; +#endif + +namespace ShareFile.Api.Client.Transfers +{ + internal abstract class StreamWrapper : Stream + { + protected readonly Stream stream; + + public StreamWrapper(Stream stream) + { + this.stream = stream; + } + + public override int Read(byte[] buffer, int offset, int count) => stream.Read(buffer, offset, count); + public override void Write(byte[] buffer, int offset, int count) => stream.Write(buffer, offset, count); + public override bool CanRead => stream.CanRead; + public override bool CanSeek => stream.CanSeek; + public override bool CanWrite => stream.CanWrite; + public override long Length => stream.Length; + public override long Position { get => stream.Position; set { stream.Position = value; } } + public override void Flush() => stream.Flush(); + public override long Seek(long offset, SeekOrigin origin) => stream.Seek(offset, origin); + public override void SetLength(long value) => stream.SetLength(value); + public override bool CanTimeout => stream.CanTimeout; + public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) + => stream.CopyToAsync(destination, bufferSize, cancellationToken); + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + => stream.ReadAsync(buffer, offset, count, cancellationToken); + public override int ReadByte() => stream.ReadByte(); + public override int ReadTimeout { get => stream.ReadTimeout; set => stream.ReadTimeout = value; } + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + => stream.WriteAsync(buffer, offset, count, cancellationToken); + public override void WriteByte(byte value) => stream.WriteByte(value); + public override int WriteTimeout { get => stream.WriteTimeout; set => stream.WriteTimeout = value; } + public override Task FlushAsync(CancellationToken cancellationToken) => stream.FlushAsync(cancellationToken); +#if !PORTABLE && !NETSTANDARD1_3 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + => stream.BeginRead(buffer, offset, count, callback, state); + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + => stream.BeginWrite(buffer, offset, count, callback, state); + public override void Close() => stream.Close(); + public override ObjRef CreateObjRef(Type requestedType) => stream.CreateObjRef(requestedType); + public override int EndRead(IAsyncResult asyncResult) => stream.EndRead(asyncResult); + public override void EndWrite(IAsyncResult asyncResult) => stream.EndWrite(asyncResult); + public override object InitializeLifetimeService() => stream.InitializeLifetimeService(); +#endif + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/TransferEventArgs.cs b/src/ShareFile.Api.Client/Transfers/TransferEventArgs.cs index 79d43e8..610209e 100644 --- a/src/ShareFile.Api.Client/Transfers/TransferEventArgs.cs +++ b/src/ShareFile.Api.Client/Transfers/TransferEventArgs.cs @@ -2,8 +2,13 @@ namespace ShareFile.Api.Client.Transfers { +#if Net40 public class TransferEventArgs : EventArgs + +#else + public struct TransferEventArgs +#endif { - public TransferProgress Progress { get; set; } + public TransferProgress Progress; } } \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/TransferProgress.cs b/src/ShareFile.Api.Client/Transfers/TransferProgress.cs index 638fd73..2f12acb 100644 --- a/src/ShareFile.Api.Client/Transfers/TransferProgress.cs +++ b/src/ShareFile.Api.Client/Transfers/TransferProgress.cs @@ -2,59 +2,13 @@ namespace ShareFile.Api.Client.Transfers { - public class TransferProgress + public struct TransferProgress { - public long BytesTransferred { get; set; } - - public long BytesRemaining { get; set; } - - public bool Complete { get; set; } - - public long TotalBytes { get; set; } - public string TransferId { get; set; } - public IDictionary TransferMetadata { get; internal set; } - - public TransferProgress(long totalBytes, IDictionary transferMetadata = null, string transferId = null) - { - TotalBytes = totalBytes; - TransferId = transferId; - BytesRemaining = totalBytes; - TransferMetadata = transferMetadata; - } - - public TransferProgress() - { - - } - - internal TransferProgress ResetBytesTransferred() - { - BytesTransferred = 0; - BytesRemaining = TotalBytes; - return this; - } - - internal TransferProgress UpdateBytesTransferred(long transferred) - { - if (BytesTransferred + transferred < 0) - { - BytesTransferred = 0; - BytesRemaining = TotalBytes; - } - else - { - BytesTransferred += transferred; - BytesRemaining -= transferred; - } - - return this; - } - - internal TransferProgress MarkComplete() - { - Complete = true; - - return this; - } + public long BytesTransferred; + public long BytesRemaining; + public bool Complete; + public long TotalBytes; + public string TransferId; + public IDictionary TransferMetadata; } } diff --git a/src/ShareFile.Api.Client/Transfers/TransferProgressReporter.cs b/src/ShareFile.Api.Client/Transfers/TransferProgressReporter.cs new file mode 100644 index 0000000..9c43ae8 --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/TransferProgressReporter.cs @@ -0,0 +1,106 @@ +using ShareFile.Api.Client.Extensions.Tasks; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Transfers +{ + public class TransferProgressReporter + { + public event EventHandler OnTransferProgress; + + private readonly TimeSpan reportInterval; + private readonly long fileSize; + private readonly string transferId; + + private long progress = 0; + private IDictionary transferMetadata; + + public TransferProgressReporter(long fileSize, string transferId, TimeSpan reportInterval) + { + this.fileSize = fileSize; + this.reportInterval = reportInterval; + this.transferId = transferId; + } + + public void StartReporting(IDictionary transferMetadata, CancellationToken cancellationToken) + { + this.transferMetadata = transferMetadata ?? new Dictionary(0); + ReportLoopAsync(cancellationToken).Forget(); + } + + private async Task ReportLoopAsync(CancellationToken cancellationToken) + { + long lastProgress = 0; + while (!cancellationToken.IsCancellationRequested) + { + long currentProgress = Interlocked.Read(ref progress); + long difference = currentProgress - lastProgress; + if (difference != 0) + { + OnTransferProgress?.Invoke(this, Args(currentProgress)); + lastProgress = currentProgress; + } + await Task.Delay(reportInterval); + } + } + + private TransferEventArgs Args(long currentProgress) + { + var progress = new TransferProgress + { + TotalBytes = fileSize, + BytesTransferred = currentProgress, + BytesRemaining = fileSize - currentProgress, + Complete = false, + TransferId = transferId, + TransferMetadata = transferMetadata, + }; + return new TransferEventArgs { Progress = progress }; + } + + public void ReportProgress(long bytesTransferred) => Interlocked.Add(ref progress, bytesTransferred); + + public void ResetProgress() => Interlocked.Exchange(ref progress, 0); + + public void ReportCompletion() + { + var args = Args(fileSize); + args.Progress.Complete = true; + OnTransferProgress?.Invoke(this, args); + } + + public ChunkProgressReporter ChunkProgressReporter() => new ChunkProgressReporter(this); + + internal void ImmediatelyReportProgress(long bytesTransferred) + { + ReportProgress(bytesTransferred); + OnTransferProgress?.Invoke(this, Args(fileSize)); + } + } + + public class ChunkProgressReporter + { + private TransferProgressReporter fileProgressReporter; + + private long progress = 0; + + public ChunkProgressReporter(TransferProgressReporter fileProgressReporter) + { + this.fileProgressReporter = fileProgressReporter; + } + + public void ReportProgress(long bytesTransferred) + { + Interlocked.Add(ref progress, bytesTransferred); + fileProgressReporter.ReportProgress(bytesTransferred); + } + + public void ResetProgress() + { + long progressToRollback = Interlocked.Exchange(ref progress, 0); + fileProgressReporter.ReportProgress(-1 * progressToRollback); + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/TransfererBase.cs b/src/ShareFile.Api.Client/Transfers/TransfererBase.cs index a481700..4de0df0 100644 --- a/src/ShareFile.Api.Client/Transfers/TransfererBase.cs +++ b/src/ShareFile.Api.Client/Transfers/TransfererBase.cs @@ -32,45 +32,31 @@ protected void SetState(TransfererState state) _state = state; } } - -#if ASYNC - protected bool ShouldPause(CancellationToken? cancellationToken) + + protected bool ShouldPause(CancellationToken cancellationToken) { - if (cancellationToken == null) - return GetState() == TransfererState.Paused; - return GetState() == TransfererState.Paused && !cancellationToken.Value.IsCancellationRequested; + return GetState() == TransfererState.Paused && !cancellationToken.IsCancellationRequested; } -#endif - protected bool ShouldPause() + + protected bool ShouldPause() { return GetState() == TransfererState.Paused; } + + protected async Task TryPauseAsync(CancellationToken cancellationToken) + { + while (ShouldPause(cancellationToken)) + { + await Task.Delay(1000).ConfigureAwait(false); + } + } -#if ASYNC - protected async Task TryPauseAsync(CancellationToken? cancellationToken) - { - while (ShouldPause(cancellationToken)) - { -#if Net40 - Thread.Sleep(1000); -#else - await Task.Delay(1000).ConfigureAwait(false); -#endif - } - } -#endif - + // Seems like something we should eliminate entirely with no non-async consumers. protected void TryPause() { while (ShouldPause()) { -#if ASYNC - TryPauseAsync(null).Wait(); -#elif Net40 - Thread.Sleep(1000); -#else - Task.Delay(1000).Wait(); -#endif + TryPauseAsync(default(CancellationToken)).Wait(); } } } diff --git a/src/ShareFile.Api.Client/Transfers/UploadSpecificationRequest.cs b/src/ShareFile.Api.Client/Transfers/UploadSpecificationRequest.cs index db91a77..dbdcd9e 100644 --- a/src/ShareFile.Api.Client/Transfers/UploadSpecificationRequest.cs +++ b/src/ShareFile.Api.Client/Transfers/UploadSpecificationRequest.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Globalization; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Transfers { @@ -15,8 +15,10 @@ public class UploadSpecificationRequest /// Set is no longer supported; value will be overwritten during uploader constructor /// public bool Raw { get; set; } - + public string FileName { get; set; } + + public string BaseFileId { get; set; } public long FileSize { get; set; } public string BatchId { get; set; } public bool BatchLast { get; set; } @@ -35,14 +37,13 @@ public class UploadSpecificationRequest public DateTime? ClientCreatedDateUtc { get; set; } public DateTime? ClientModifiedDateUtc { get; set; } public IEnumerable ProviderCapabilities { get; set; } - - /// - /// Will make a best effort to ensure a file is uploaded by modifying - /// FileName if it encounters a collision. This is NOT supported on all - /// providers. - /// - public bool ForceUnique { get; set; } + /// + /// Will make a best effort to ensure a file is uploaded by modifying + /// FileName if it encounters a collision. This is NOT supported on all + /// providers. + /// + public bool ForceUnique { get; set; } public UploadSpecificationRequest() { @@ -89,8 +90,9 @@ public virtual IDictionary ToDictionary() {"responseFormat", ResponseFormat}, {"notify", Notify.ToLowerString()}, {"clientCreatedDateUTC", ClientCreatedDateUtc.HasValue ? ClientCreatedDateUtc.Value.ToString("u"): ""}, - {"clientModifiedDateUTC", ClientModifiedDateUtc.HasValue ? ClientModifiedDateUtc.Value.ToString("u"): ""} - }; + {"clientModifiedDateUTC", ClientModifiedDateUtc.HasValue ? ClientModifiedDateUtc.Value.ToString("u"): ""}, + {"baseFileId", BaseFileId} + }; } /// @@ -100,27 +102,28 @@ public virtual IDictionary ToDictionary() public UploadRequestParams ToRequestParams() { return new UploadRequestParams - { - Method = this.Method.GetValueOrDefault(), - Raw = this.Raw, - FileName = this.FileName, - FileSize = this.FileSize, - BatchId = this.BatchId, - BatchLast = this.BatchLast, - CanResume = this.CanResume, - StartOver = this.StartOver, - Unzip = this.Unzip, - Title = this.Title, - Details = this.Details, - SendGuid = this.SendGuid, - ThreadCount = this.ThreadCount, - IsSend = this.IsSend, - Notify = this.Notify, - ClientCreatedDate = this.ClientCreatedDateUtc, - ClientModifiedDate = this.ClientModifiedDateUtc, - Tool = this.Tool, - Overwrite = Overwrite - }; + { + Method = this.Method.GetValueOrDefault(), + Raw = this.Raw, + FileName = this.FileName, + FileSize = this.FileSize, + BatchId = this.BatchId, + BatchLast = this.BatchLast, + CanResume = this.CanResume, + StartOver = this.StartOver, + Unzip = this.Unzip, + Title = this.Title, + Details = this.Details, + SendGuid = this.SendGuid, + ThreadCount = this.ThreadCount, + IsSend = this.IsSend, + Notify = this.Notify, + ClientCreatedDate = this.ClientCreatedDateUtc, + ClientModifiedDate = this.ClientModifiedDateUtc, + Tool = this.Tool, + Overwrite = Overwrite, + BaseFileId = BaseFileId + }; } } } diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/ActiveUploadState.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/ActiveUploadState.cs index 65f9d4f..732cb7e 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/ActiveUploadState.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/ActiveUploadState.cs @@ -1,6 +1,6 @@ using System; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Transfers { diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncMemoryMappedFileUploader.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncMemoryMappedFileUploader.cs new file mode 100644 index 0000000..2521a26 --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncMemoryMappedFileUploader.cs @@ -0,0 +1,335 @@ +#if !PORTABLE && !NETSTANDARD1_3 +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO.MemoryMappedFiles; +using System.IO; +using System.Net.Http; +using ShareFile.Api.Client.Extensions; +using ShareFile.Api.Client.Exceptions; +using ShareFile.Api.Client.Security.Cryptography; +using System.Threading; + +namespace ShareFile.Api.Client.Transfers.Uploaders +{ + public class AsyncMemoryMappedFileUploader : AsyncUploaderBase + { + private FileChunkHasher hasher; + private CompletedBytes completedBytes = new CompletedBytes(); + private long initialPosition = 0; + + public AsyncMemoryMappedFileUploader( + ShareFileClient client, + UploadSpecificationRequest uploadSpecificationRequest, + FileStream stream, + FileUploaderConfig config = null, + ActiveUploadState activeUploadState = null, + int? expirationDays = default(int?)) + : base(client, uploadSpecificationRequest, stream, config, expirationDays) + { + hasher = new FileChunkHasher(HashProvider); + if (activeUploadState != null) + { + initialPosition = activeUploadState.BytesUploaded; + UploadSpecification = activeUploadState.UploadSpecification; // what happens if the new UploadSpecRequest disagrees with this? + } + } + + public override long LastConsecutiveByteUploaded => completedBytes.CompletedThroughPosition; + + public override async Task PrepareAsync(CancellationToken cancellationToken = default(CancellationToken)) + { + if (Prepared) + return; + + UploadSpecification = await CreateUpload(cancellationToken).ConfigureAwait(false); + await CheckResumeAsync().ConfigureAwait(false); + Prepared = true; + } + + private async Task FinishUpload(CancellationToken cancellationToken) + { + HashProvider.Finalize(new byte[0], 0, 0); + var finishUri = GetFinishUriForThreadedUploads(); + var requestMessage = new HttpRequestMessage(HttpMethod.Get, finishUri); + + var responseMessage = await SendHttpRequest(requestMessage, cancellationToken).ConfigureAwait(false); + string localHash = HashProvider.GetComputedHashAsString(); + var uploadResponse = await GetUploadResponseAsync(responseMessage, localHash).ConfigureAwait(false); + if (uploadResponse.Count == 1) + { + string serverHash = uploadResponse.Single().Hash; + if (!string.IsNullOrEmpty(serverHash) && !localHash.Equals(serverHash, StringComparison.OrdinalIgnoreCase)) + throw new UploadException($"File hash mismatch! Client: {localHash} Server: {serverHash}", Enums.UploadStatusCode.Unknown); + } + + return uploadResponse; + } + + private MemoryMappedFile CreateMemoryMappedFile() + { + return MemoryMappedFile.CreateFromFile( + (FileStream)FileStream, // guaranteed from constructor + mapName: Guid.NewGuid().ToString(), // no collisions with other files + capacity: 0, // disk file size + access: MemoryMappedFileAccess.Read, + memoryMappedFileSecurity: null, // docs say ok + inheritability: HandleInheritability.None, // single process + leaveOpen: true); // caller disposes filestream + } + + protected override async Task InternalUploadAsync(CancellationToken cancellationToken) + { + MemoryMappedFile memoryMappedFile = null; + try + { + if (FileStream.Length > 0) + { + memoryMappedFile = CreateMemoryMappedFile(); + AdjustNumberOfThreadsByFileSize(); + var partSizeCalc = new PartSizeCalculator(Config.NumberOfThreads, Config.PartConfig); + + await UploadChunks( + memoryMappedFile, + partSizeCalc, + Config.NumberOfThreads, + cancellationToken).ConfigureAwait(false); + + if (cancellationToken.IsCancellationRequested) + throw CancellationException(); + } + return await FinishUpload(cancellationToken).ConfigureAwait(false); + } + finally + { + memoryMappedFile?.Dispose(); + } + } + + private void AdjustNumberOfThreadsByFileSize() + { + // copied from scaling - does this still make sense? + Config.NumberOfThreads = (int)Math.Min(Config.NumberOfThreads, (FileStream.Length / Config.PartConfig.MinFileSizeForMultithreaded) + 1); + } + + private async Task UploadChunks(MemoryMappedFile memoryMappedFile, PartSizeCalculator partSizeCalc, int workerCount, CancellationToken cancellationToken) + { + var hashWorkers = new List>(workerCount); + var chunkQueue = new Queue(workerCount); + var uploadWorkers = new List>(workerCount); + + int chunkIndex = 0; + long nextChunkSize = Config.PartConfig.InitialPartSize; + long positionInFile = initialPosition; + long bytesRemaining = UploadSpecificationRequest.FileSize - initialPosition; + try + { + while ((bytesRemaining > 0 || hashWorkers.Count > 0 || chunkQueue.Count > 0 || uploadWorkers.Count > 0) + && !cancellationToken.IsCancellationRequested) + { + await TryPauseAsync(cancellationToken).ConfigureAwait(false); + if (bytesRemaining > 0 && hashWorkers.Count < workerCount) + { + long chunkSize = Math.Min(nextChunkSize, bytesRemaining); + hashWorkers.Add(HashWorker(memoryMappedFile, chunkIndex, positionInFile, chunkSize, cancellationToken)); + + positionInFile += chunkSize; + bytesRemaining -= chunkSize; + chunkIndex += 1; + } + else if (chunkQueue.Count > 0 && uploadWorkers.Count < workerCount) + { + uploadWorkers.Add(UploadWorker(chunkQueue.Dequeue(), progressReporter.ChunkProgressReporter(), cancellationToken)); + } + else if (uploadWorkers.Count > 0 || hashWorkers.Count > 0) + { + IEnumerable workersToAwait = uploadWorkers; + if (chunkQueue.Count < workerCount) + workersToAwait = workersToAwait.Concat(hashWorkers); + + Task finished = await Task.WhenAny(workersToAwait).ConfigureAwait(false); + if (finished is Task) + { + var finishedHashWorker = (Task)finished; + hashWorkers.Remove(finishedHashWorker); + chunkQueue.Enqueue(await finishedHashWorker.ConfigureAwait(false)); + } + else + { + var finishedUploadWorker = (Task)finished; + uploadWorkers.Remove(finishedUploadWorker); + var chunkTime = await finishedUploadWorker.ConfigureAwait(false); + nextChunkSize = partSizeCalc.NextPartSize(nextChunkSize, chunkTime.Size, chunkTime.Elapsed); + } + } + else + { + throw new Exception("Impossible"); + } + } + } + catch (TaskCanceledException) when (cancellationToken.IsCancellationRequested) { throw CancellationException(); } + catch (Exception ex) { throw FailureException(ex); } + } + + private struct Chunk + { + public Stream Stream; + public int Index; + public long Offset; + public string Hash; + } + + private async Task HashWorker(MemoryMappedFile memoryMappedFile, int chunkIndex, long positionInFile, long chunkLength, CancellationToken cancellationToken) + { + var stream = memoryMappedFile.CreateViewStream(positionInFile, chunkLength, MemoryMappedFileAccess.Read); + string hash = await hasher.Append(stream, cancellationToken); + stream.Seek(0, SeekOrigin.Begin); + return new Chunk + { + Stream = stream, + Index = chunkIndex, + Offset = positionInFile, + Hash = hash, + }; + } + + private struct ChunkUploadTime + { + public long Size; + public TimeSpan Elapsed; + } + + private async Task UploadWorker(Chunk chunk, ChunkProgressReporter progressReporter, CancellationToken cancellationToken) + { + try + { + string url = $"{UploadSpecification.ChunkUri}&index={chunk.Index}&byteOffset={chunk.Offset}&hash={chunk.Hash}"; + for (int retries = 0; ; retries++) + { + var timer = Logging.StopwatchFactory.GetStopwatch(); + timer.Start(); + try + { + var requestMessage = ComposeChunkMessage(url, new ProgressStream(chunk.Stream, progressReporter.ReportProgress)); + var responseMessage = await SendHttpRequest(requestMessage, cancellationToken).ConfigureAwait(false); + string responseContent = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); + ValidateChunkResponse(responseMessage, responseContent); + + timer.Stop(); + lock (completedBytes) { completedBytes.Add(chunk.Offset, chunk.Stream.Length); } + var uploadTime = new ChunkUploadTime { Size = chunk.Stream.Length, Elapsed = timer.Elapsed }; + return uploadTime; + } + catch (Exception ex) + { + timer.Stop(); + progressReporter.ResetProgress(); + if (retries < Config.PartConfig.PartRetryCount) + { + chunk.Stream.Seek(0, SeekOrigin.Begin); + continue; + } + if (ex is TaskCanceledException && !cancellationToken.IsCancellationRequested) + throw new TimeoutException($"Chunk {chunk.Index} ({chunk.Stream.Length.ToFileSizeString()}) timed out after {timer.Elapsed}"); + + throw; + } + } + } + finally + { + chunk.Stream.Dispose(); + } + } + + private HttpRequestMessage ComposeChunkMessage(string url, Stream stream) + { + var requestMessage = new HttpRequestMessage(HttpMethod.Post, url); + var content = new StreamContent(new NoDisposeStream(stream)); + if (UploadSpecificationRequest.Raw) + { + requestMessage.Content = content; + } + else + { + var multiPartContent = new MultipartFormDataContent(); + content.Headers.Add("Content-Type", "application/octet-stream"); + multiPartContent.Add(content, "Filedata", UploadSpecificationRequest.FileName); + requestMessage.Content = multiPartContent; + } + return requestMessage; + } + + private async Task SendHttpRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken) + { + var client = GetHttpClient(); + requestMessage.Headers.Add("Accept", "application/json"); + requestMessage.AddDefaultHeaders(Client); + + return await RequestExecutor.SendAsync( + client, + requestMessage, + HttpCompletionOption.ResponseContentRead, + cancellationToken).ConfigureAwait(false); + } + + private Exception CancellationException() + { + return new UploadException( + "Upload was cancelled", + Enums.UploadStatusCode.Cancelled, + new ActiveUploadState(UploadSpecification, completedBytes.CompletedThroughPosition)); + } + + private Exception FailureException(Exception innerException) + { + return new UploadException( + innerException.Message, + innerException is UploadException ? (innerException as UploadException).StatusCode : Enums.UploadStatusCode.Unknown, + new ActiveUploadState(UploadSpecification, completedBytes.CompletedThroughPosition), + innerException); + } + } + + internal class FileChunkHasher + { + const long bufferSize = 1024; + private byte[] zeroBuffer = new byte[0]; + + private IMD5HashProvider fileHash; + private SemaphoreSlim fileHashLock = new SemaphoreSlim(1, 1); + + public FileChunkHasher(IMD5HashProvider fileHash) + { + this.fileHash = fileHash; + } + + public async Task Append(Stream chunk, CancellationToken cancellationToken) + { + IMD5HashProvider chunkHash = NewHash(); + byte[] buffer = new byte[bufferSize]; + int bytesRead = 0; + + await fileHashLock.WaitAsync(cancellationToken); + try + { + for (long position = 0; position < chunk.Length; position += bytesRead) + { + bytesRead = await chunk.ReadAsync(buffer, 0, buffer.Length, cancellationToken); + fileHash.Append(buffer, 0, bytesRead); + chunkHash.Append(buffer, 0, bytesRead); + } + } + finally { fileHashLock.Release(); } + + chunkHash.Finalize(zeroBuffer, 0, 0); + return chunkHash.GetComputedHashAsString(); + } + + private static IMD5HashProvider NewHash() => MD5HashProviderFactory.GetHashProvider().CreateHash(); + } +} +#endif diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncScalingFileUploader.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncScalingFileUploader.cs index 88e19a4..9f5a63d 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncScalingFileUploader.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncScalingFileUploader.cs @@ -1,16 +1,14 @@ using System; +using System.IO; using System.Net.Http; using System.Threading; using System.Threading.Tasks; - using ShareFile.Api.Client.Enums; using ShareFile.Api.Client.Exceptions; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.FileSystem; namespace ShareFile.Api.Client.Transfers.Uploaders { -#if ASYNC public class AsyncScalingFileUploader : AsyncUploaderBase { private readonly ScalingPartUploader partUploader; @@ -20,18 +18,17 @@ public class AsyncScalingFileUploader : AsyncUploaderBase public AsyncScalingFileUploader( ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null, int? expirationDays = null) - : base(client, uploadSpecificationRequest, file, config, expirationDays) + : base(client, uploadSpecificationRequest, stream, config, expirationDays) { - var chunkConfig = config != null ? config.PartConfig : new FilePartConfig(); partUploader = new ScalingPartUploader( chunkConfig, Config.NumberOfThreads, ExecuteChunkUploadMessage, - OnProgress, + progressReporter.ReportProgress, client.Logging); } @@ -39,14 +36,14 @@ public AsyncScalingFileUploader( ShareFileClient client, ActiveUploadState activeUploadState, UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null) - : this(client, uploadSpecificationRequest, file, config) + : this(client, uploadSpecificationRequest, stream, config) { this.activeUploadState = activeUploadState; UploadSpecification = activeUploadState.UploadSpecification; } - + internal ScalingPartUploader PartUploader { get @@ -65,19 +62,20 @@ public override long LastConsecutiveByteUploaded private bool canRestart = true; - protected override async Task InternalUploadAsync() + protected override async Task InternalUploadAsync(CancellationToken cancellationToken) { try { var offset = activeUploadState == null ? 0 : activeUploadState.BytesUploaded; await partUploader.Upload( - File, + FileStream, + UploadSpecificationRequest.FileName, HashProvider, UploadSpecification.ChunkUri.AbsoluteUri, UploadSpecificationRequest.Raw, offset, - CancellationToken).ConfigureAwait(false); + cancellationToken).ConfigureAwait(false); return await FinishUploadAsync().ConfigureAwait(false); } catch (Exception ex) @@ -91,21 +89,21 @@ protected override async Task InternalUploadAsync() } } - Progress.ResetBytesTransferred(); + progressReporter.ResetProgress(); activeUploadState = null; UploadSpecification = null; Prepared = false; canRestart = false; - return await UploadAsync(TransferMetadata, CancellationToken).ConfigureAwait(false); + return await UploadAsync(null, cancellationToken).ConfigureAwait(false); } - public override async Task PrepareAsync() + public override async Task PrepareAsync(CancellationToken cancellationToken = default(CancellationToken)) { if (!Prepared) { if (UploadSpecification == null) { - UploadSpecification = await CreateUpload().ConfigureAwait(false); + UploadSpecification = await CreateUpload(cancellationToken).ConfigureAwait(false); if (UploadSpecification == null) { throw new UploadException("UploadSpecification cannot be null", UploadStatusCode.Unknown); @@ -116,7 +114,7 @@ public override async Task PrepareAsync() // Run any query - this is to set auth headers that ShareFileClient handles by default, but the uploader doesn't. // Let any exception fail the whole upload since if we can't reach parent, then we likely won't be able to upload. var query = Client.Items.Get(UploadSpecificationRequest.Parent).Select("Id"); - await query.ExecuteAsync(CancellationToken).ConfigureAwait(false); + await query.ExecuteAsync(cancellationToken).ConfigureAwait(false); } partUploader.NumberOfThreads = Math.Min( partUploader.NumberOfThreads, @@ -131,8 +129,6 @@ public override async Task PrepareAsync() private async Task FinishUploadAsync() { - this.MarkProgressComplete(); - var client = GetHttpClient(); var finishUri = this.GetFinishUriForThreadedUploads(); var requestMessage = new HttpRequestMessage(HttpMethod.Get, finishUri); @@ -149,9 +145,9 @@ private async Task FinishUploadAsync() return await GetUploadResponseAsync(response, HashProvider.GetComputedHashAsString()).ConfigureAwait(false); } - private async Task ExecuteChunkUploadMessage(HttpRequestMessage requestMessage) + private async Task ExecuteChunkUploadMessage(HttpRequestMessage requestMessage, CancellationToken cancellationToken) { - await TryPauseAsync(CancellationToken).ConfigureAwait(false); + await TryPauseAsync(cancellationToken).ConfigureAwait(false); requestMessage.AddDefaultHeaders(Client); @@ -163,16 +159,15 @@ private async Task ExecuteChunkUploadMessage(HttpRequestMessage requestMessage) client, requestMessage, HttpCompletionOption.ResponseContentRead, - CancellationToken.GetValueOrDefault(System.Threading.CancellationToken.None)).ConfigureAwait(false)) + cancellationToken).ConfigureAwait(false)) { if (Configuration.IsNetCore) { - OnProgress(requestMessage.Content.Headers.ContentLength.GetValueOrDefault()); + progressReporter.ReportProgress(requestMessage.Content.Headers.ContentLength.GetValueOrDefault()); } string responseContent = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); ValidateChunkResponse(responseMessage, responseContent); } } } -#endif } \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncStandardFileUploader.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncStandardFileUploader.cs index fe059b8..1dbf7fe 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncStandardFileUploader.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncStandardFileUploader.cs @@ -4,19 +4,21 @@ using System.Net.Http.Headers; using System.Threading.Tasks; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.FileSystem; +using System.Threading; namespace ShareFile.Api.Client.Transfers.Uploaders { -#if ASYNC public class AsyncStandardFileUploader : AsyncUploaderBase { - public AsyncStandardFileUploader(ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, IPlatformFile file, FileUploaderConfig config = null, int? expirationDays = null) - : base(client, uploadSpecificationRequest, file, config, expirationDays) - { - - } - + public AsyncStandardFileUploader( + ShareFileClient client, + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null, + int? expirationDays = null) + : base(client, uploadSpecificationRequest, stream, config, expirationDays) + { } + public override long LastConsecutiveByteUploaded { get @@ -25,13 +27,13 @@ public override long LastConsecutiveByteUploaded } } - public override async Task PrepareAsync() + public override async Task PrepareAsync(CancellationToken cancellationToken = default(CancellationToken)) { if (!Prepared) { if (UploadSpecification == null) { - UploadSpecification = await CreateUpload().ConfigureAwait(false); + UploadSpecification = await CreateUpload(cancellationToken).ConfigureAwait(false); } await CheckResumeAsync().ConfigureAwait(false); @@ -40,26 +42,24 @@ public override async Task PrepareAsync() } } - protected override async Task InternalUploadAsync() + protected override async Task InternalUploadAsync(CancellationToken cancellationToken) { int tryCount = 0; - Stream stream = File.OpenRead(); while (true) { try { - await TryPauseAsync(CancellationToken).ConfigureAwait(false); - if (CancellationToken.GetValueOrDefault().IsCancellationRequested) + await TryPauseAsync(cancellationToken).ConfigureAwait(false); + if (cancellationToken.IsCancellationRequested) { throw new TaskCanceledException(); } var httpClient = GetHttpClient(); - using (var requestMessage = new HttpRequestMessage( HttpMethod.Post, GetChunkUriForStandardUploads())) { - using (var streamContent = new StreamContentWithProgress(new NoDisposeStream(stream), OnProgress, CancellationToken.GetValueOrDefault())) + using (var streamContent = new StreamContentWithProgress(new NoDisposeStream(FileStream), progressReporter.ReportProgress, cancellationToken)) { streamContent.TryPauseAction = TryPauseAsync; requestMessage.AddDefaultHeaders(Client); @@ -69,36 +69,28 @@ protected override async Task InternalUploadAsync() if (!UploadSpecificationRequest.Raw) { var multiPartContent = new MultipartFormDataContent(); - multiPartContent.Add(streamContent, "Filedata", File.Name); + multiPartContent.Add(streamContent, "Filedata", UploadSpecificationRequest.FileName); requestMessage.Content = multiPartContent; - } - - var responseMessage = - await - httpClient.SendAsync( - requestMessage, - CancellationToken.GetValueOrDefault(System.Threading.CancellationToken.None)).ConfigureAwait(false); - - MarkProgressComplete(); + } + var responseMessage = await httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); return await GetUploadResponseAsync(responseMessage).ConfigureAwait(false); } } } catch (Exception ex) { - if (tryCount >= 3 || !stream.CanSeek || ex is TaskCanceledException) + if (tryCount >= 3 || !FileStream.CanSeek || ex is TaskCanceledException) { throw; } else { tryCount += 1; - stream.Seek(0, SeekOrigin.Begin); + FileStream.Seek(0, SeekOrigin.Begin); } } } } } -#endif - } +} diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncUploaderBase.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncUploaderBase.cs index f828c97..48f3c80 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncUploaderBase.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/AsyncUploaderBase.cs @@ -8,28 +8,25 @@ using ShareFile.Api.Client.Enums; using ShareFile.Api.Client.Exceptions; -using ShareFile.Api.Client.FileSystem; using ShareFile.Api.Client.Requests.Executors; using ShareFile.Api.Client.Security.Cryptography; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Transfers.Uploaders { -#if ASYNC public abstract class AsyncUploaderBase : UploaderBase { - protected AsyncUploaderBase(ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, IPlatformFile file, FileUploaderConfig config = null, int? expirationDays = null) - : base(client, uploadSpecificationRequest, file, expirationDays) + protected AsyncUploaderBase( + ShareFileClient client, + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null, + int? expirationDays = null) + : base(client, uploadSpecificationRequest, stream, config, expirationDays) { - Config = config ?? new FileUploaderConfig(); - HashProvider = MD5HashProviderFactory.GetHashProvider().CreateHash(); } - public FileUploaderConfig Config { get; protected set; } - - protected CancellationToken? CancellationToken { get; set; } - protected internal IAsyncRequestExecutor RequestExecutor { get @@ -38,7 +35,7 @@ protected internal IAsyncRequestExecutor RequestExecutor } } - protected async Task CreateUpload() + protected async Task CreateUpload(CancellationToken cancellationToken) { if (UploadSpecificationRequest.ProviderCapabilities == null) { @@ -51,7 +48,7 @@ protected async Task CreateUpload() var query = CreateUploadSpecificationQuery(UploadSpecificationRequest); - return await query.ExecuteAsync(CancellationToken).ConfigureAwait(false); + return await query.ExecuteAsync(cancellationToken).ConfigureAwait(false); } protected async Task CheckResumeAsync() @@ -74,40 +71,44 @@ protected async Task CheckResumeAsync() protected async Task CalculateHashAsync(long count) { var localHash = MD5HashProviderFactory.GetHashProvider().CreateHash(); - var fileStream = await File.OpenReadAsync().ConfigureAwait(false); + var buffer = new byte[Configuration.BufferSize]; + do { - var buffer = new byte[DefaultBufferLength]; - do + var bytesToRead = count < Configuration.BufferSize ? (int)count : Configuration.BufferSize; + var bytesRead = await FileStream.ReadAsync(buffer, 0, bytesToRead); + if (bytesRead > 0) { - var bytesToRead = count < DefaultBufferLength ? (int)count : DefaultBufferLength; - var bytesRead = fileStream.Read(buffer, 0, bytesToRead); - if (bytesRead > 0) - { - localHash.Append(buffer, 0, bytesToRead); - HashProvider.Append(buffer, 0, bytesToRead); - } - count -= bytesRead; - } while (count > 0); - } + localHash.Append(buffer, 0, bytesToRead); + HashProvider.Append(buffer, 0, bytesToRead); + } + count -= bytesRead; + } while (count > 0); localHash.Finalize(new byte[1], 0, 0); - fileStream.Seek(0, SeekOrigin.Begin); + FileStream.Seek(0, SeekOrigin.Begin); return localHash.GetComputedHashAsString(); } - public async Task UploadAsync(Dictionary transferMetadata = null, CancellationToken? cancellationToken = null) + public async Task UploadAsync(Dictionary transferMetadata = null, CancellationToken cancellationToken = default(CancellationToken)) { - await PrepareAsync().ConfigureAwait(false); - - TransferMetadata = transferMetadata ?? new Dictionary(); - Progress.TransferMetadata = TransferMetadata; - CancellationToken = cancellationToken; + await PrepareAsync(cancellationToken).ConfigureAwait(false); - var response = await InternalUploadAsync().ConfigureAwait(false); + CancellationTokenSource uploadCancellationSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + UploadResponse response = null; + try + { + progressReporter.StartReporting(transferMetadata, uploadCancellationSource.Token); + response = await InternalUploadAsync(uploadCancellationSource.Token).ConfigureAwait(false); + } + finally + { + uploadCancellationSource.Cancel(); + uploadCancellationSource.Dispose(); + } + progressReporter.ReportCompletion(); try { - var stream = await File.OpenReadAsync().ConfigureAwait(false); - stream.Dispose(); + FileStream.Dispose(); } catch (Exception) { @@ -117,36 +118,14 @@ public async Task UploadAsync(Dictionary transfe return response; } - protected abstract Task InternalUploadAsync(); - - public abstract Task PrepareAsync(); - - protected bool IsCancellationRequested() - { - if (CancellationToken == null) return false; - - return CancellationToken.Value.IsCancellationRequested; - } - - private HttpClient httpClient; - - protected internal override HttpClient GetHttpClient() - { - if (httpClient == null) - { - httpClient = new HttpClient(GetHttpClientHandler()) - { - Timeout = new TimeSpan(0, 0, 0, 0, Config.HttpTimeout) - }; - } - return httpClient; - } + protected abstract Task InternalUploadAsync(CancellationToken cancellationToken); + public abstract Task PrepareAsync(CancellationToken cancellationToken = default(CancellationToken)); + protected async Task GetUploadResponseAsync(HttpResponseMessage responseMessage, string localHash = null) { var responseContent = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false); return ValidateUploadResponse(responseMessage, responseContent, localHash); } } -#endif } \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/NoncontiguousMemoryStream.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/NoncontiguousMemoryStream.cs new file mode 100644 index 0000000..f7af34e --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/NoncontiguousMemoryStream.cs @@ -0,0 +1,162 @@ +using System; +using System.Buffers; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Transfers.Uploaders.Buffers +{ + internal class NoncontiguousMemoryStream : Stream + { + private readonly IReadOnlyList> blocks; + + private int blockIndex = 0; + private int blockOffset = 0; + + public NoncontiguousMemoryStream(IReadOnlyList> blocks) + { + this.blocks = blocks; + Length = blocks.Sum(b => b.Count); + } + + private ArraySegment GetCurrentBlockRemainder() + { + while (blockIndex < blocks.Count) + { + ArraySegment block = blocks[blockIndex]; + if (block.Count > blockOffset) + { + return new ArraySegment(block.Array, block.Offset + blockOffset, block.Count - blockOffset); + } + blockIndex++; + blockOffset -= block.Count; + } + return new ArraySegment(ArrayPool.Shared.Rent(0)); + } + + private int Copy(ArraySegment source, ArraySegment dest) + { + int count = Math.Min(source.Count, dest.Count); + Buffer.BlockCopy(source.Array, source.Offset, dest.Array, dest.Offset, count); + blockOffset += count; + return count; + } + + public override bool CanRead => true; + public override bool CanSeek => true; + public override bool CanWrite => true; + + public override long Length { get; } + + public override long Position + { + get + { + long pos = 0; + for (int i = 0; i < blockIndex; i++) + pos += blocks[i].Count; + pos += blockOffset; + return pos; + } + set + { + if (value < 0) + throw new ArgumentOutOfRangeException($"{nameof(Position)} must be non-negative"); + if (value > Length) + throw new ArgumentOutOfRangeException($"{nameof(Position)} must be less than or equal to stream length"); + blockIndex = 0; + blockOffset = (int)value; + } + } + + public override void Flush() { return; } + + public override int Read(byte[] buffer, int offset, int count) + { + int read = 0; + while(count > 0) + { + ArraySegment currentBlockRemainder = GetCurrentBlockRemainder(); + if (currentBlockRemainder.Count == 0) + break; + int copied = Copy( + source: currentBlockRemainder, + dest: new ArraySegment(buffer, offset, count)); + read += copied; + offset += copied; + count -= copied; + } + return read; + } + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + if (cancellationToken.IsCancellationRequested) + throw new OperationCanceledException(cancellationToken); + int read = Read(buffer, offset, count); + return Task.FromResult(read); + } + + public override long Seek(long offset, SeekOrigin origin) + { + if (offset > int.MaxValue || offset < int.MinValue) + throw new ArgumentOutOfRangeException($"{nameof(offset)}"); + switch (origin) + { + case SeekOrigin.Begin: + blockIndex = 0; + blockOffset = (int)offset; + break; + case SeekOrigin.Current: + blockOffset += (int)offset; + break; + case SeekOrigin.End: + blockIndex = blocks.Count; + blockOffset = (int)offset; + break; + default: + throw new ArgumentException($"Unexpected {nameof(SeekOrigin)} value {origin}"); + } + while(blockOffset < 0) + { + blockIndex--; + if (blockIndex < 0) + throw new ArgumentException($"Invalid offset"); + blockOffset += blocks[blockIndex].Count; + } + return Position; + } + + public override void SetLength(long value) => throw new NotSupportedException($"{nameof(NoncontiguousMemoryStream)} does not support reallocation"); + + public override void Write(byte[] buffer, int offset, int count) + { + while (count > 0) + { + ArraySegment currentBlockRemainder = GetCurrentBlockRemainder(); + if (currentBlockRemainder.Count == 0) + throw new Exception("Buffer is full"); + int copied = Copy( + source: new ArraySegment(buffer, offset, count), + dest: currentBlockRemainder); + offset += copied; + count -= copied; + } + } + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + if (cancellationToken.IsCancellationRequested) + throw new OperationCanceledException(cancellationToken); + Write(buffer, offset, count); +#if NETSTANDARD_13 + return Task.CompletedTask; +#else + return Task.FromResult(true); +#endif + } + } +} diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBuffer.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBuffer.cs new file mode 100644 index 0000000..f271e22 --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBuffer.cs @@ -0,0 +1,51 @@ +using System; +using System.Buffers; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Transfers.Uploaders.Buffers +{ + public interface IBuffer : IDisposable + { + int Length { get; } + Stream GetStream(); + } + + internal class PooledBuffer : IBuffer + { + public int Length { get; } + private readonly List> blocks; + private readonly ArrayPool pool; + private bool disposed = false; + + public PooledBuffer(ArrayPool pool, List> blocks) + { + this.blocks = blocks; + this.pool = pool; + Length = blocks.Sum(b => b.Count); + } + + public Stream GetStream() + { + if (disposed) + throw new ObjectDisposedException(nameof(PooledBuffer)); + return new NoncontiguousMemoryStream(blocks); + } + + public void Dispose() + { + if (disposed) + return; + + foreach (var arraySegment in blocks) + { + pool.Return(arraySegment.Array); + } + blocks.Clear(); + disposed = true; + } + } +} diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBufferAllocator.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBufferAllocator.cs new file mode 100644 index 0000000..80dcce4 --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/Buffers/PooledBufferAllocator.cs @@ -0,0 +1,55 @@ +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace ShareFile.Api.Client.Transfers.Uploaders.Buffers +{ + public interface IBufferAllocator + { + IBuffer Allocate(int length); + } + + internal class PooledBufferAllocator : IBufferAllocator + { + private const int defaultMaxBlockSize = 1024 * 1024; // do not increase - max pooled size for default array pool + private const int defaultMinBlockSize = 4 * 1024; // don't go too small - array pool only holds 50 arrays per size + + private readonly ArrayPool pool; + private readonly int maxBlockSize; + private readonly int minBlockSize; + + public PooledBufferAllocator() : this(ArrayPool.Shared, defaultMaxBlockSize, defaultMinBlockSize) { } + + public PooledBufferAllocator(ArrayPool pool, int maxBlockSize, int minBlockSize) + { + this.pool = pool; + this.maxBlockSize = maxBlockSize; + this.minBlockSize = minBlockSize; + } + + public IBuffer Allocate(int length) => new PooledBuffer(pool, AllocateBlocks(length)); + + internal List> AllocateBlocks(int length) + { + var blocks = new List>(); + for (int toAllocate = length; toAllocate > 0;) + { + int blockSizeToRequest = maxBlockSize; + while (toAllocate < blockSizeToRequest && blockSizeToRequest > minBlockSize) + blockSizeToRequest >>= 2; + + byte[] array = pool.Rent(blockSizeToRequest); + if (array.Length < blockSizeToRequest) + throw new Exception($"Requested {blockSizeToRequest} bytes from ArrayPool, got {array.Length} bytes"); + + ArraySegment block = array.Length > toAllocate + ? new ArraySegment(array, offset: 0, count: toAllocate) + : new ArraySegment(array); + blocks.Add(block); + toAllocate -= block.Count; + } + return blocks; + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/ByteArrayContentWithProgress.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/ByteArrayContentWithProgress.cs index c741aca..e621e54 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/ByteArrayContentWithProgress.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/ByteArrayContentWithProgress.cs @@ -9,7 +9,6 @@ namespace ShareFile.Api.Client.Transfers.Uploaders internal class ByteArrayContentWithProgress : ByteArrayContent { private readonly byte[] content; - private readonly int bufferSize; private readonly Action progressCallback; @@ -17,44 +16,18 @@ public ByteArrayContentWithProgress(byte[] content, Action progressCallback : base(content) { this.content = content; - this.bufferSize = UploaderBase.DefaultBufferLength; this.progressCallback = progressCallback; } - - public ByteArrayContentWithProgress(byte[] content, Action progressCallback, int offset, int count, int bufferSize) - : base(content, offset, count) - { - this.content = content; - this.bufferSize = bufferSize; - this.progressCallback = progressCallback; - } - - protected override -#if ASYNC - async -#endif - Task SerializeToStreamAsync(Stream stream, TransportContext context) - { - - for (var totalBytesRead = 0; totalBytesRead < this.content.Length; totalBytesRead += this.bufferSize) + + protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context) + { + for (var totalBytesRead = 0; totalBytesRead < this.content.Length; totalBytesRead += Configuration.BufferSize) { - var bytesToWrite = Math.Min(this.bufferSize, this.content.Length - totalBytesRead); -#if ASYNC + var bytesToWrite = Math.Min(Configuration.BufferSize, this.content.Length - totalBytesRead); await stream.WriteAsync(this.content, totalBytesRead, bytesToWrite).ConfigureAwait(false); -#else - stream.Write(this.content, totalBytesRead, bytesToWrite); -#endif - if (this.progressCallback != null) - { - this.progressCallback(bytesToWrite); - } - } -#if !ASYNC - var tcs = new TaskCompletionSource(); - tcs.SetResult(0); - return tcs.Task; -#endif + progressCallback?.Invoke(bytesToWrite); + } } protected override bool TryComputeLength(out long length) diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/FilePart.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/FilePart.cs index e04b902..9662eac 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/FilePart.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/FilePart.cs @@ -1,17 +1,18 @@ -namespace ShareFile.Api.Client.Transfers.Uploaders +using ShareFile.Api.Client.Transfers.Uploaders.Buffers; + +namespace ShareFile.Api.Client.Transfers.Uploaders { - public class FilePart + internal class FilePart { - public byte[] Bytes { get; private set; } - public int Index { get; private set; } - public long Offset { get; private set; } - public int Length { get; private set; } - public string UploadUrl { get; private set; } - public string Hash { get; private set; } - public bool IsLastPart { get; private set; } + public readonly IBuffer Bytes; + public readonly int Index; + public readonly long Offset; + public readonly int Length; + public readonly string Hash; + public readonly bool IsLastPart; public FilePart( - byte[] bytes, + IBuffer bytes, int index, long offset, int length, @@ -25,15 +26,10 @@ public FilePart( this.Hash = hash; this.IsLastPart = isLastPart; } - - public string GetComposedUploadUrl() - { - return GetComposedUploadUrl(this.UploadUrl); - } - + public string GetComposedUploadUrl(string uploadUrl) { - return string.Format("{0}&index={1}&byteOffset={2}&hash={3}", uploadUrl, Index, Offset, Hash); + return $"{uploadUrl}&index={Index}&byteOffset={Offset}&hash={Hash}"; } } } diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/FileUploaderConfig.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/FileUploaderConfig.cs index f614c67..12c32cb 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/FileUploaderConfig.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/FileUploaderConfig.cs @@ -1,4 +1,8 @@ using System; +using System.Net; +using System.Net.Http; +using ShareFile.Api.Client.Credentials; +using ShareFile.Api.Client.Transfers.Uploaders.Buffers; namespace ShareFile.Api.Client.Transfers.Uploaders { @@ -8,15 +12,18 @@ public class FileUploaderConfig public const int DefaultNumberOfThreads = 1; public const int DefaultHttpTimeout = 60000; public const int DefaultThreadStartPauseInMS = 100; + private const int DefaultProgressReportIntervalMilliseconds = 100; public int NumberOfThreads { get; set; } public int PartSize { get; set; } public int HttpTimeout { get; set; } + public Func HttpClientFactory { get; set; } public int ThreadStartPauseInMS { get; set; } public bool UseRequestStreamBuffering { get; set; } public bool RequireChunksCompleteInOrder { get; set; } public int? WriteTimeout { get; set; } public int? ReadTimeout { get; set; } + public TimeSpan ProgressReportInterval { get; set; } public FilePartConfig PartConfig { get; set; } @@ -29,6 +36,7 @@ public FileUploaderConfig() UseRequestStreamBuffering = true; RequireChunksCompleteInOrder = false; PartConfig = new FilePartConfig(); + ProgressReportInterval = TimeSpan.FromMilliseconds(DefaultProgressReportIntervalMilliseconds); } } @@ -48,6 +56,7 @@ public class FilePartConfig /// /// public int MinFileSizeForMultithreaded { get; set; } + public IBufferAllocator BufferAllocator { get; set; } public FilePartConfig() { @@ -59,6 +68,7 @@ public FilePartConfig() MaxPartSizeIncreaseFactor = 8; MaxPartSizeDecreaseFactor = 2; PartRetryCount = 1; + BufferAllocator = new PooledBufferAllocator(); } } } diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/PartSizeCalculator.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/PartSizeCalculator.cs new file mode 100644 index 0000000..604fbde --- /dev/null +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/PartSizeCalculator.cs @@ -0,0 +1,40 @@ +using ShareFile.Api.Client.Extensions; +using System; + +namespace ShareFile.Api.Client.Transfers.Uploaders +{ + internal class PartSizeCalculator + { + private FilePartConfig partConfig; + private int concurrentWorkers; + + public PartSizeCalculator(int concurrentWorkers, FilePartConfig partConfig) + { + this.concurrentWorkers = concurrentWorkers; + this.partConfig = partConfig; + } + + public long NextPartSize(long lastPartSize, long completedPartSize, TimeSpan elapsedTime) + { + //connection speed values are bytes/second + double estimatedConnectionSpeed = completedPartSize / elapsedTime.TotalSeconds; + double targetPartSize = estimatedConnectionSpeed * partConfig.TargetPartUploadTime.TotalSeconds; + double partSizeDelta = targetPartSize - completedPartSize; + + //initial batch of workers will all calculate ~same delta; penalize for >1 + double penalty = concurrentWorkers > 1 ? concurrentWorkers / 2.0 : 1.0; + partSizeDelta = partSizeDelta / penalty; + + //bound the delta to a multiple of partsize in case of extreme result + double maxDelta = completedPartSize * (partConfig.MaxPartSizeIncreaseFactor - 1.0); + double minDelta = completedPartSize * (-1.0 * (partConfig.MaxPartSizeDecreaseFactor - 1.0) / partConfig.MaxPartSizeDecreaseFactor); + partSizeDelta = partSizeDelta.Bound(maxDelta, minDelta); + + // bound partsize too because we probably got something wrong + long nextPartSize = lastPartSize; + nextPartSize += Convert.ToInt64(partSizeDelta); + nextPartSize = nextPartSize.Bound(partConfig.MaxPartSize, partConfig.MinPartSize); + return nextPartSize; + } + } +} \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingFileUploader.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingFileUploader.cs index 82d2d88..49b27a0 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingFileUploader.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingFileUploader.cs @@ -1,7 +1,7 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Extensions.Tasks; -using ShareFile.Api.Client.FileSystem; using System; +using System.IO; using System.Collections.Generic; using System.Net.Http; using System.Threading; @@ -21,33 +21,32 @@ public class ScalingFileUploader : SyncUploaderBase public ScalingFileUploader( ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null, int? expirationDays = null) - : base(client, uploadSpecificationRequest, file, config, expirationDays) + : base(client, uploadSpecificationRequest, stream, config, expirationDays) { - var partConfig = config != null ? config.PartConfig : new FilePartConfig(); partUploader = new ScalingPartUploader( partConfig, Config.NumberOfThreads, - requestMessage => Task.Factory.StartNew(() => ExecuteChunkUploadMessage(requestMessage)), - OnProgress, + (requestMessage, cancelToken) => Task.Factory.StartNew(() => ExecuteChunkUploadMessage(requestMessage, cancelToken)), + progressReporter.ReportProgress, client.Logging); } - + public ScalingFileUploader( ShareFileClient client, ActiveUploadState activeUploadState, UploadSpecificationRequest uploadSpecificationRequest, - IPlatformFile file, + Stream stream, FileUploaderConfig config = null) - : this(client, uploadSpecificationRequest, file, config) + : this(client, uploadSpecificationRequest, stream, config) { this.activeUploadState = activeUploadState; UploadSpecification = activeUploadState.UploadSpecification; } - + internal ScalingPartUploader PartUploader { get @@ -66,7 +65,7 @@ public override long LastConsecutiveByteUploaded private bool canRestart = true; - public override UploadResponse Upload(Dictionary transferMetadata = null, CancellationToken? cancellationToken = null) + protected override UploadResponse InternalUpload(CancellationToken cancellationToken) { try { @@ -77,7 +76,8 @@ public override UploadResponse Upload(Dictionary transferMetadat UploadSpecification.MaxNumberOfThreads.GetValueOrDefault(1)); partUploader.UploadSpecification = UploadSpecification; var uploads = partUploader.Upload( - File, + FileStream, + UploadSpecificationRequest.FileName, HashProvider, UploadSpecification.ChunkUri.AbsoluteUri, UploadSpecificationRequest.Raw, @@ -100,13 +100,13 @@ public override UploadResponse Upload(Dictionary transferMetadat UploadSpecification = null; Prepared = false; canRestart = false; - return Upload(transferMetadata); + return Upload(); } throw; } } - private void ExecuteChunkUploadMessage(HttpRequestMessage requestMessage) + private void ExecuteChunkUploadMessage(HttpRequestMessage requestMessage, CancellationToken cancellationToken) { TryPause(); @@ -117,7 +117,7 @@ private void ExecuteChunkUploadMessage(HttpRequestMessage requestMessage) { if (Configuration.IsNetCore) { - OnProgress(requestMessage.Content.Headers.ContentLength.GetValueOrDefault()); + progressReporter.ReportProgress(requestMessage.Content.Headers.ContentLength.GetValueOrDefault()); } string responseContent = responseMessage.Content.ReadAsStringAsync().WaitForTask(); ValidateChunkResponse(responseMessage, responseContent); @@ -126,8 +126,6 @@ private void ExecuteChunkUploadMessage(HttpRequestMessage requestMessage) private UploadResponse FinishUpload() { - MarkProgressComplete(); - var finishUri = GetFinishUriForThreadedUploads(); var client = GetHttpClient(); diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingPartUploader.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingPartUploader.cs index f00e92a..86840b9 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingPartUploader.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/ScalingPartUploader.cs @@ -1,9 +1,8 @@ using ShareFile.Api.Client.Exceptions; using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Extensions.Tasks; -using ShareFile.Api.Client.FileSystem; using ShareFile.Api.Client.Security.Cryptography; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; using System; using System.Collections.Generic; using System.IO; @@ -11,9 +10,10 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; - using ShareFile.Api.Client.Enums; using ShareFile.Api.Client.Logging; +using System.Buffers; +using ShareFile.Api.Client.Transfers.Uploaders.Buffers; namespace ShareFile.Api.Client.Transfers.Uploaders { @@ -21,7 +21,7 @@ internal class ScalingPartUploader { private readonly FilePartConfig partConfig; private int concurrentWorkers; - private readonly Func executePartUploadRequest; + private readonly Func executePartUploadRequest; private readonly Action updateProgress; private readonly LoggingProvider logger; private readonly CompletedBytes completedBytes = new CompletedBytes(); @@ -31,7 +31,7 @@ internal class ScalingPartUploader public ScalingPartUploader( FilePartConfig partConfig, int concurrentWorkers, - Func executePartUploadRequest, + Func executePartUploadRequest, Action updateProgress, LoggingProvider logger) { @@ -73,124 +73,131 @@ public long LastConsecutiveByteUploaded public UploadSpecification UploadSpecification { get; set; } - public Task Upload( - IPlatformFile file, + public async Task Upload( + Stream fileStream, + string fileName, IMD5HashProvider hashProvider, string chunkUploadUrl, bool raw, long offset = 0, - CancellationToken? cancellationToken = null) + CancellationToken cancellationToken = default(CancellationToken)) { this.raw = raw; // We block this after setting 'started', so make sure this statement is first - NumberOfThreads = (int)Math.Min(NumberOfThreads, (file.Length / partConfig.MinFileSizeForMultithreaded) + 1); + NumberOfThreads = (int)Math.Min(NumberOfThreads, (fileStream.Length / partConfig.MinFileSizeForMultithreaded) + 1); started = true; - return Task.Factory.StartNew(() => + if (offset != 0) { - if (offset != 0) - { - updateProgress(offset); - completedBytes.Add(0, offset); - } - var workers = Dispatch(new FilePartSource(file, hashProvider, offset), chunkUploadUrl, file.Name, cancellationToken).ToArray(); - Task.WaitAll(workers); - - var results = workers.Select(task => task.Result); - if (!results.All(partUploadResult => partUploadResult.IsSuccess)) - { - logger.Info("[Scaling Uploader] Upload failed. Bytes uploaded: " + LastConsecutiveByteUploaded); - var innerException = results.Select(result => result.PartUploadException).FirstOrDefault(ex => ex != null); - var uploadException = innerException as UploadException; - UploadStatusCode statusCode = uploadException == null ? UploadStatusCode.Unknown : uploadException.StatusCode; - throw new UploadException( - "FilePart upload failed", - statusCode, - new ActiveUploadState(UploadSpecification, LastConsecutiveByteUploaded), - innerException); - } + updateProgress(offset); + completedBytes.Add(0, offset); + } + try + { + var filePartSource = new FilePartSource(fileStream, hashProvider, partConfig.BufferAllocator, offset); + var workers = await Dispatch(filePartSource, chunkUploadUrl, fileName, cancellationToken).ConfigureAwait(false); + await Task.WhenAll(workers).ConfigureAwait(false); logger.Info("[Scaling Uploader] All upload parts succeeded"); - }); + } + catch(Exception innerException) + { + logger.Info("[Scaling Uploader] Upload failed. Bytes uploaded: " + LastConsecutiveByteUploaded); + var uploadException = innerException as UploadException; + UploadStatusCode statusCode = uploadException == null ? UploadStatusCode.Unknown : uploadException.StatusCode; + throw new UploadException( + "FilePart upload failed", + statusCode, + new ActiveUploadState(UploadSpecification, LastConsecutiveByteUploaded), + innerException); + } } - private IEnumerable> Dispatch(FilePartSource partSource, string chunkUploadUrl, string fileName, CancellationToken? cancellationToken = null) + private async Task> Dispatch(FilePartSource partSource, string chunkUploadUrl, string fileName, CancellationToken cancellationToken = default(CancellationToken)) { var incrementLock = new object(); - int currentPartSize = partConfig.InitialPartSize; //do not make this a long, needs to be atomic or have a lock + long currentPartSize = partConfig.InitialPartSize; + var partSizeCalc = new PartSizeCalculator(concurrentWorkers, partConfig); - Func attemptPartUpload = part => + Func attemptPartUpload = async part => { - var timer = ShareFile.Api.Client.Logging.Stopwatch.StartNew(); - return UploadPart(chunkUploadUrl, part, fileName, cancellationToken).ContinueWith(workerTask => + IStopwatch timer = Stopwatch.StartNew(); + try + { + await UploadPart(chunkUploadUrl, part, fileName, cancellationToken).ConfigureAwait(false); + } + finally { timer.Stop(); - workerTask.Rethrow(); - int partSizeIncrement = CalculatePartSizeIncrement(part.Bytes.Length, TimeSpan.FromMilliseconds(timer.ElapsedMilliseconds)); - - lock (incrementLock) - { - currentPartSize = (currentPartSize + partSizeIncrement).Bound(partConfig.MaxPartSize, partConfig.MinPartSize); - } - }); + } + lock (incrementLock) + { + currentPartSize = partSizeCalc.NextPartSize(currentPartSize, part.Bytes.Length, timer.Elapsed); + } }; - var workers = new AsyncSemaphore(concurrentWorkers); - bool giveUp = false; - while (!giveUp && partSource.HasMore) + var workerTasks = new List(); + try { - if (cancellationToken.GetValueOrDefault().IsCancellationRequested) + var activeWorkers = new AsyncSemaphore(concurrentWorkers); + bool giveUp = false; + while (!giveUp && partSource.HasMore) { - throw new UploadException( - "Upload was cancelled", - UploadStatusCode.Cancelled, - new ActiveUploadState(UploadSpecification, LastConsecutiveByteUploaded)); - } - workers.WaitAsync().Wait(); - var part = partSource.GetNextPart(currentPartSize); - if (part == null || giveUp) - { - yield return TaskFromResult(PartUploadResult.Error); - break; //stream is busted - } + if (cancellationToken.IsCancellationRequested) + { + throw new UploadException( + "Upload was cancelled", + UploadStatusCode.Cancelled, + new ActiveUploadState(UploadSpecification, LastConsecutiveByteUploaded)); + } + await activeWorkers.WaitAsync().ConfigureAwait(false); + if (giveUp) + return workerTasks; - var task = AttemptPartUploadWithRetry(attemptPartUpload, part, partConfig.PartRetryCount) - .ContinueWith(partUploadTask => + var part = await partSource.GetNextPart(Interlocked.Read(ref currentPartSize)).ConfigureAwait(false); + var task = Task.Run(async () => { - var partResult = partUploadTask.Result; - if (!partResult.IsSuccess) + try + { + await AttemptPartUploadWithRetry(attemptPartUpload, part, partConfig.PartRetryCount).ConfigureAwait(false); + } + catch { giveUp = true; + throw; + } + finally + { + activeWorkers.Release(); + part.Bytes.Dispose(); } - workers.Release(); - return partResult; }); - yield return task; + workerTasks.Add(task); + } + return workerTasks; + } + catch + { + ObserveExceptions(workerTasks); + throw; } - yield break; } - private int CalculatePartSizeIncrement(long partSize, TimeSpan elapsedTime) + private static void ObserveExceptions(IList tasks) { - //connection speed values are bytes/second - double estimatedConnectionSpeed = partSize / elapsedTime.TotalSeconds; - double targetPartSize = estimatedConnectionSpeed * partConfig.TargetPartUploadTime.TotalSeconds; - double partSizeDelta = targetPartSize - partSize; - - //initial batch of workers will all calculate ~same delta; penalize for >1 - partSizeDelta = partSizeDelta / this.concurrentWorkers; - - //bound the delta to a multiple of partsize in case of extreme result - partSizeDelta = partSizeDelta.Bound( - partSize * (partConfig.MaxPartSizeIncreaseFactor - 1.0), - partSize * (-1.0 * (partConfig.MaxPartSizeDecreaseFactor - 1.0) / partConfig.MaxPartSizeDecreaseFactor)); - - return Convert.ToInt32(partSizeDelta); + Task.Run(async () => + { + try + { + await Task.WhenAll(tasks).ConfigureAwait(false); + } + catch { } + }).ConfigureAwait(false); } - private HttpRequestMessage ComposePartUpload(string chunkUploadUrl, FilePart part,string filename) + private HttpRequestMessage ComposePartUpload(string chunkUploadUrl, FilePart part, string filename) { string uploadUri = part.GetComposedUploadUrl(chunkUploadUrl); var requestMessage = new HttpRequestMessage(HttpMethod.Post, uploadUri); - var content = new ByteArrayContentWithProgress(part.Bytes, bytesWritten => updateProgress(bytesWritten)); + var content = new StreamContentWithProgress(part.Bytes.GetStream(), updateProgress); requestMessage.Content = content; if (!raw) @@ -203,120 +210,138 @@ private HttpRequestMessage ComposePartUpload(string chunkUploadUrl, FilePart par return requestMessage; } - - private Task UploadPart(string chunkUploadUrl, FilePart part, string filename, CancellationToken? cancellationToken) + + private async Task UploadPart(string chunkUploadUrl, FilePart part, string filename, CancellationToken cancellationToken) { - return executePartUploadRequest(ComposePartUpload(chunkUploadUrl, part,filename)) - .ContinueWith( - task => - { - task.Rethrow(); - // If the task was cancelled but a cancel wasn't requested, then consider it a timeout - if (task.IsCanceled && !cancellationToken.GetValueOrDefault().IsCancellationRequested) - { - throw new TimeoutException(); - } - }); + try + { + HttpRequestMessage partRequest = ComposePartUpload(chunkUploadUrl, part, filename); + await executePartUploadRequest(partRequest, cancellationToken).ConfigureAwait(false); + } + catch(OperationCanceledException) when (!cancellationToken.IsCancellationRequested) + { + // If the task was cancelled but a cancel wasn't requested, then consider it a timeout + throw new TimeoutException(); + } } - //exception boundary: chunk upload exceptions should be propagated to here but no farther - private Task AttemptPartUploadWithRetry(Func attemptUpload, FilePart part, int retryCount) + private async Task AttemptPartUploadWithRetry(Func attemptUpload, FilePart part, int retryCount) { - if (retryCount < 0) - return TaskFromResult(PartUploadResult.Error); - - return attemptUpload(part).ContinueWith(uploadTask => + for(int attempts = 0; attempts <= retryCount; attempts++) { - if (uploadTask.Exception != null) - { - var uploadException = uploadTask.Exception.Unwrap() as UploadException; - //if (retryCount > 0 && !(uploadException?.IsInvalidUploadId).GetValueOrDefault()) - if (retryCount > 0 && !(uploadException != null && uploadException.IsInvalidUploadId)) - return AttemptPartUploadWithRetry(attemptUpload, part, retryCount - 1).Result; - else - return PartUploadResult.Exception(uploadTask.Exception.Unwrap()); - } - else + try { + await attemptUpload(part).ConfigureAwait(false); lock (completedBytes) { completedBytes.Add(part.Offset, part.Length); } - return PartUploadResult.Success; + return; } - }); - } - - //in .NET 4.5, Task.FromResult - private Task TaskFromResult(T value) - { - var tcs = new TaskCompletionSource(); - tcs.SetResult(value); - return tcs.Task; - } - - internal class PartUploadResult - { - public bool IsSuccess { get; set; } - public Exception PartUploadException { get; set; } - - public static PartUploadResult Success = new PartUploadResult { IsSuccess = true }; - public static PartUploadResult Error = new PartUploadResult { IsSuccess = false }; - public static PartUploadResult Exception(Exception ex) { return new PartUploadResult { IsSuccess = false, PartUploadException = ex }; } + catch (UploadException uploadException) when (uploadException.IsInvalidUploadId) + { + throw; + } + catch (Exception) + { + if (attempts >= retryCount) + throw; + } + } + throw new UploadException("Shouldn't get here", UploadStatusCode.Unknown); } internal class FilePartSource { public bool HasMore { get; private set; } - private IMD5HashProvider fileHash; - private Stream stream; //the calling application instantiates IPlatformFile which controls the life of this stream - private long fileLength; + private readonly IMD5HashProvider fileHash; + private readonly Stream fileStream; + private readonly IBufferAllocator bufferAllocator; + private readonly long fileLength; + private long streamPosition; private int partCount; - public FilePartSource(IPlatformFile file, IMD5HashProvider hashProvider, long offset = 0) + public FilePartSource(Stream fileStream, IMD5HashProvider hashProvider, IBufferAllocator bufferAllocator, long offset) { fileHash = hashProvider; - stream = file.OpenRead(); - fileLength = file.Length; + this.fileStream = fileStream; + this.bufferAllocator = bufferAllocator; + fileLength = fileStream.Length; streamPosition = offset; - stream.Seek(streamPosition, SeekOrigin.Begin); + this.fileStream.Seek(streamPosition, SeekOrigin.Begin); partCount = 0; HasMore = true; } - public FilePart GetNextPart(long requestedPartSize) + public async Task GetNextPart(long requestedPartSize) { try { int partSize = Convert.ToInt32(Math.Min(requestedPartSize, fileLength - streamPosition)); - byte[] content = new byte[partSize]; - stream.Read(content, 0, partSize); - + ReadFileResult partContent = await ReadFile(partSize).ConfigureAwait(false); bool isLast = streamPosition + partSize >= fileLength; - string hash = MD5HashProviderFactory.GetHashProvider().CreateHash().ComputeHash(content); - var part = new FilePart(content, partCount, streamPosition, partSize, hash, isLast); - - streamPosition += partSize; - partCount += 1; + var part = new FilePart(partContent.Content, partCount, streamPosition, partSize, partContent.Hash, isLast); if (isLast) { HasMore = false; - fileHash.Finalize(content, 0, content.Length); + fileHash.Finalize(ArrayPool.Shared.Rent(0), 0, 0); } else { - fileHash.Append(content, 0, content.Length); + streamPosition += partSize; + partCount += 1; } - return part; } catch { - //improvement: return object to propagate this exception HasMore = false; - return null; + throw; + } + } + + private struct ReadFileResult + { + public IBuffer Content; + public string Hash; + } + + private async Task ReadFile(int length) + { + IBuffer content = bufferAllocator.Allocate(length); + Stream dest = content.GetStream(); + IMD5HashProvider chunkHash = MD5HashProviderFactory.GetHashProvider().CreateHash(); + byte[] b = ArrayPool.Shared.Rent(Configuration.BufferSize); + try + { + int read = 0; + int toRead = length; + do + { + read = await fileStream.ReadAsync(b, offset: 0, count: Math.Min(b.Length, toRead)).ConfigureAwait(false); + toRead -= read; + + await dest.WriteAsync(b, offset: 0, count: read).ConfigureAwait(false); + chunkHash.Append(b, offset: 0, size: read); + fileHash.Append(b, offset: 0, size: read); + } while (read > 0 && toRead > 0); + if (toRead > 0) + throw new Exception($"Expected to read {length} bytes, actual read {length - toRead} bytes"); + + chunkHash.Finalize(ArrayPool.Shared.Rent(0), 0, 0); + return new ReadFileResult { Content = content, Hash = chunkHash.GetComputedHashAsString() }; + } + catch + { + content.Dispose(); + throw; + } + finally + { + ArrayPool.Shared.Return(b); + dest.Dispose(); } } } diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/StandardFileUploader.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/StandardFileUploader.cs index 9602039..3c52b35 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/StandardFileUploader.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/StandardFileUploader.cs @@ -5,11 +5,11 @@ using ShareFile.Api.Client.Extensions; using ShareFile.Api.Client.Extensions.Tasks; -using ShareFile.Api.Client.FileSystem; using System; using System.Collections.Generic; using System.Threading.Tasks; +using ShareFile.Api.Client.Models; #if NETFX_CORE using ApplicationException = ShareFile.Api.Client.Exceptions.ApplicationException; @@ -19,11 +19,26 @@ namespace ShareFile.Api.Client.Transfers.Uploaders { public class StandardFileUploader : SyncUploaderBase { - public StandardFileUploader(ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, IPlatformFile file, FileUploaderConfig config = null, int? expirationDays = null) - : base(client, uploadSpecificationRequest, file, config, expirationDays) + public StandardFileUploader( + ShareFileClient client, + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null, + int? expirationDays = null) + : base(client, uploadSpecificationRequest, stream, config, expirationDays) + { } + + public StandardFileUploader( + ShareFileClient client, + UploadSpecification uploadSpecification, + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null) + : this(client, uploadSpecificationRequest, stream, config, expirationDays: null) { + UploadSpecification = uploadSpecification; } - + public override long LastConsecutiveByteUploaded { get @@ -32,31 +47,28 @@ public override long LastConsecutiveByteUploaded } } - public override UploadResponse Upload(Dictionary transferMetadata = null, CancellationToken? cancellationToken = null) + protected override UploadResponse InternalUpload(CancellationToken cancellationToken) { SetUploadSpecification(); int tryCount = 0; - Stream stream = File.OpenRead(); while (true) { try { TryPause(); - cancellationToken.ThrowIfRequested(); + if (cancellationToken.IsCancellationRequested) + throw new TaskCanceledException(); + var httpClient = GetHttpClient(); using (var requestMessage = new HttpRequestMessage( HttpMethod.Post, GetChunkUriForStandardUploads())) { - using (var streamContent = new StreamContentWithProgress(new NoDisposeStream(stream), OnProgress, cancellationToken.GetValueOrDefault())) + using (var streamContent = new StreamContentWithProgress(new NoDisposeStream(FileStream), progressReporter.ReportProgress, cancellationToken)) { -#if ASYNC streamContent.TryPauseAction = TryPauseAsync; -#else - streamContent.TryPauseAction = TryPause; -#endif requestMessage.AddDefaultHeaders(Client); streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); requestMessage.Content = streamContent; @@ -64,29 +76,27 @@ public override UploadResponse Upload(Dictionary transferMetadat if (!UploadSpecificationRequest.Raw) { var multiPartContent = new MultipartFormDataContent(); - multiPartContent.Add(streamContent, "Filedata", File.Name); + multiPartContent.Add(streamContent, "Filedata", UploadSpecificationRequest.FileName); requestMessage.Content = multiPartContent; } var responseMessage = httpClient.SendAsync(requestMessage, CancellationToken.None).WaitForTask(); - - MarkProgressComplete(); - + return GetUploadResponse(responseMessage); } } } catch (Exception ex) { - if (tryCount >= 3 || !stream.CanSeek || ex is TaskCanceledException) + if (tryCount >= 3 || !FileStream.CanSeek || ex is TaskCanceledException) { throw; } else { tryCount += 1; - stream.Seek(0, SeekOrigin.Begin); + FileStream.Seek(0, SeekOrigin.Begin); } } } diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/StreamContentWithProgress.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/StreamContentWithProgress.cs index 9683fee..21e3a32 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/StreamContentWithProgress.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/StreamContentWithProgress.cs @@ -1,4 +1,5 @@ using System; +using System.Buffers; using System.IO; using System.Net; using System.Net.Http; @@ -10,7 +11,6 @@ namespace ShareFile.Api.Client.Transfers.Uploaders internal class StreamContentWithProgress : StreamContent { private readonly Stream content; - private readonly int bufferSize; private readonly Action progressCallback; private readonly CancellationToken cancellationToken; @@ -18,75 +18,47 @@ internal class StreamContentWithProgress : StreamContent : base(content) { this.content = content; - this.bufferSize = UploaderBase.DefaultBufferLength; this.progressCallback = progressCallback; this.cancellationToken = cancellationToken; } + + public Func TryPauseAction { get; set; } - public StreamContentWithProgress(Stream content, Action progressCallback, int bufferSize, CancellationToken cancellationToken = default(CancellationToken)) - : base(content, bufferSize) + protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context) { - this.content = content; - this.bufferSize = bufferSize; - this.progressCallback = progressCallback; - this.cancellationToken = cancellationToken; - } - -#if ASYNC - public Func TryPauseAction { get; set; } -#else - public Action TryPauseAction { get; set; } -#endif - - protected override -#if ASYNC - async -#endif - Task SerializeToStreamAsync(Stream stream, TransportContext context) - { - var buffer = new byte[this.bufferSize]; - for (var i = 0; i < this.content.Length; i += this.bufferSize) + var buffer = ArrayPool.Shared.Rent(Configuration.BufferSize); + try { - var totalBytesRead = 0; - var bytesRead = content.Read(buffer, 0, buffer.Length); - while (bytesRead > 0) + for (var i = 0; i < content.Length; i += buffer.Length) { -#if ASYNC - await stream.WriteAsync(buffer, 0, bytesRead).ConfigureAwait(false); - if (TryPauseAction != null) - { - await TryPauseAction(cancellationToken).ConfigureAwait(false); - } -#else - stream.Write(buffer, 0, bytesRead); - if (TryPauseAction != null) + var totalBytesRead = 0; + var bytesRead = await content.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false); + while (bytesRead > 0) { - TryPauseAction(); - } -#endif + await stream.WriteAsync(buffer, 0, bytesRead).ConfigureAwait(false); + if (TryPauseAction != null) + { + await TryPauseAction(cancellationToken).ConfigureAwait(false); + } - if (this.progressCallback != null) - { - this.progressCallback(bytesRead); - } + progressCallback?.Invoke(bytesRead); - totalBytesRead += bytesRead; - if (bytesRead == buffer.Length) - { - bytesRead = content.Read(buffer, 0, buffer.Length); - } - else - { - break; + totalBytesRead += bytesRead; + if (bytesRead == buffer.Length) + { + bytesRead = await content.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false); + } + else + { + break; + } } } } - -#if !ASYNC - var tcs = new TaskCompletionSource(); - tcs.SetResult(0); - return tcs.Task; -#endif + finally + { + ArrayPool.Shared.Return(buffer); + } } protected override bool TryComputeLength(out long length) diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/SyncUploaderBase.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/SyncUploaderBase.cs index 4a25e24..6591d31 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/SyncUploaderBase.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/SyncUploaderBase.cs @@ -1,14 +1,8 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Net.Http; -using Newtonsoft.Json; - -using ShareFile.Api.Client.Enums; -using ShareFile.Api.Models; -using ShareFile.Api.Client.Exceptions; +using ShareFile.Api.Client.Models; using ShareFile.Api.Client.Extensions.Tasks; -using ShareFile.Api.Client.FileSystem; using ShareFile.Api.Client.Security.Cryptography; using System.Threading; @@ -18,18 +12,19 @@ namespace ShareFile.Api.Client.Transfers.Uploaders { public abstract class SyncUploaderBase : UploaderBase { - public abstract UploadResponse Upload(Dictionary transferMetadata = null, CancellationToken? cancellationToken = null); public abstract void Prepare(); - protected SyncUploaderBase(ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, IPlatformFile file, FileUploaderConfig config = null, int? expirationDays = null) - : base(client, uploadSpecificationRequest, file, expirationDays) + protected SyncUploaderBase( + ShareFileClient client, + UploadSpecificationRequest uploadSpecificationRequest, + Stream stream, + FileUploaderConfig config = null, + int? expirationDays = null) + : base(client, uploadSpecificationRequest, stream, config, expirationDays) { - Config = config ?? new FileUploaderConfig(); HashProvider = MD5HashProviderFactory.GetHashProvider().CreateHash(); } - public FileUploaderConfig Config { get; private set; } - protected internal ISyncRequestExecutor RequestExecutor { get @@ -38,6 +33,26 @@ protected internal ISyncRequestExecutor RequestExecutor } } + protected abstract UploadResponse InternalUpload(CancellationToken cancellationToken); + + public UploadResponse Upload(Dictionary transferMetadata = null, CancellationToken cancellationToken = default(CancellationToken)) + { + CancellationTokenSource uploadCancellationSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + UploadResponse response; + try + { + progressReporter.StartReporting(transferMetadata, uploadCancellationSource.Token); + response = InternalUpload(uploadCancellationSource.Token); + } + finally + { + uploadCancellationSource.Cancel(); + uploadCancellationSource.Dispose(); + } + progressReporter.ReportCompletion(); + return response; + } + protected void CheckResume() { if (UploadSpecification.IsResume) @@ -58,29 +73,27 @@ protected void CheckResume() protected string CalculateHash(long count) { - using (var fileStream = File.OpenRead()) + do { - do - { - var buffer = new byte[65536]; + var buffer = new byte[Configuration.BufferSize]; - if (count < buffer.Length) - { - buffer = new byte[count]; - } + if (count < buffer.Length) + { + buffer = new byte[count]; + } - var bytesRead = fileStream.Read(buffer, 0, buffer.Length); + var bytesRead = FileStream.Read(buffer, 0, buffer.Length); - if (bytesRead > 0) - { - HashProvider.Append(buffer, 0, buffer.Length); - } + if (bytesRead > 0) + { + HashProvider.Append(buffer, 0, buffer.Length); + } - count -= bytesRead; + count -= bytesRead; - } while (count > 0); - } + } while (count > 0); + FileStream.Seek(0, SeekOrigin.Begin); return HashProvider.GetComputedHashAsString(); } @@ -107,19 +120,5 @@ protected UploadResponse GetUploadResponse(HttpResponseMessage responseMessage, string responseContent = responseMessage.Content.ReadAsStringAsync().WaitForTask(); return ValidateUploadResponse(responseMessage, responseContent, localHash); } - - private HttpClient httpClient; - - protected internal override HttpClient GetHttpClient() - { - if (httpClient == null) - { - httpClient = new HttpClient(GetHttpClientHandler()) - { - Timeout = new TimeSpan(0, 0, 0, 0, Config.HttpTimeout) - }; - } - return httpClient; - } } } \ No newline at end of file diff --git a/src/ShareFile.Api.Client/Transfers/Uploaders/UploaderBase.cs b/src/ShareFile.Api.Client/Transfers/Uploaders/UploaderBase.cs index cebe942..92459ac 100644 --- a/src/ShareFile.Api.Client/Transfers/Uploaders/UploaderBase.cs +++ b/src/ShareFile.Api.Client/Transfers/Uploaders/UploaderBase.cs @@ -3,73 +3,54 @@ using System.IO; using System.Net.Http; using System.Text; -using System.Threading; - using Newtonsoft.Json; - using ShareFile.Api.Client.Enums; using ShareFile.Api.Client.Exceptions; using ShareFile.Api.Client.Extensions; -using ShareFile.Api.Client.Extensions.Tasks; -using ShareFile.Api.Client.FileSystem; using ShareFile.Api.Client.Requests; using ShareFile.Api.Client.Security.Cryptography; -using ShareFile.Api.Models; +using ShareFile.Api.Client.Models; namespace ShareFile.Api.Client.Transfers.Uploaders { public abstract class UploaderBase : TransfererBase { - protected UploaderBase(ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, IPlatformFile file, int? expirationDays) + protected UploaderBase(ShareFileClient client, UploadSpecificationRequest uploadSpecificationRequest, Stream stream, FileUploaderConfig config, int? expirationDays) { Client = client; UploadSpecificationRequest = uploadSpecificationRequest; - File = file; + FileStream = stream; + Config = config ?? new FileUploaderConfig(); + if (uploadSpecificationRequest.FileSize != stream.Length) + { + throw new UploadException("Specified file size does not equal file stream length", UploadStatusCode.Unknown); + } ExpirationDays = expirationDays; - Progress = new TransferProgress(uploadSpecificationRequest.FileSize, null, Guid.NewGuid().ToString()); + progressReporter = new TransferProgressReporter(uploadSpecificationRequest.FileSize, Guid.NewGuid().ToString(), Config.ProgressReportInterval); } + public FileUploaderConfig Config { get; private set; } public abstract long LastConsecutiveByteUploaded { get; } - - public Dictionary TransferMetadata { get; set; } public UploadSpecification UploadSpecification { get; protected set; } - public EventHandler OnTransferProgress; + protected readonly TransferProgressReporter progressReporter; + public event EventHandler OnTransferProgress + { + add { progressReporter.OnTransferProgress += value; } + remove { progressReporter.OnTransferProgress -= value; } + } + protected int? ExpirationDays { get; set; } protected bool Prepared; - protected readonly UploadSpecificationRequest UploadSpecificationRequest; - protected readonly IPlatformFile File; + protected readonly Stream FileStream; - public ShareFileClient Client { get; protected set; } + public ShareFileClient Client { get; private set; } public IMD5HashProvider HashProvider { get; protected set; } - protected TransferProgress Progress { get; set; } - public const int DefaultBufferLength = 16384; - protected internal void OnProgress(long bytesTransferred) - { - // If there are no changes, don't invoke event handler - if (bytesTransferred == 0) - { - return; - } - - NotifyProgress(Progress.UpdateBytesTransferred(bytesTransferred)); - } - - protected void MarkProgressComplete() - { - NotifyProgress(Progress.MarkComplete()); - } - - protected virtual void NotifyProgress(TransferProgress progress) - { - if (OnTransferProgress != null) - { - OnTransferProgress.Invoke(this, new TransferEventArgs { Progress = progress }); - } - } + [Obsolete] + public static int DefaultBufferLength => Configuration.BufferSize; protected IQuery CreateUploadSpecificationQuery(UploadSpecificationRequest uploadSpecificationRequest) { @@ -77,17 +58,30 @@ protected IQuery CreateUploadSpecificationQuery(UploadSpeci { return CreateUploadRequestParamsQuery(uploadSpecificationRequest); } - - var query = Client.Items.Upload(uploadSpecificationRequest.Parent, uploadSpecificationRequest.Method.GetValueOrDefault(UploadMethod.Threaded), - uploadSpecificationRequest.Raw, uploadSpecificationRequest.FileName, uploadSpecificationRequest.FileSize, - uploadSpecificationRequest.BatchId, - uploadSpecificationRequest.BatchLast, uploadSpecificationRequest.CanResume, - uploadSpecificationRequest.StartOver, uploadSpecificationRequest.Unzip, uploadSpecificationRequest.Tool, - uploadSpecificationRequest.Overwrite, uploadSpecificationRequest.Title, - uploadSpecificationRequest.Details, uploadSpecificationRequest.IsSend, - uploadSpecificationRequest.SendGuid, null, uploadSpecificationRequest.ThreadCount, - uploadSpecificationRequest.ResponseFormat, uploadSpecificationRequest.Notify, - uploadSpecificationRequest.ClientCreatedDateUtc, uploadSpecificationRequest.ClientModifiedDateUtc, ExpirationDays); + var query = Client.Items.Upload(uploadSpecificationRequest.Parent, + uploadSpecificationRequest.Method.GetValueOrDefault(UploadMethod.Threaded), + uploadSpecificationRequest.Raw, + uploadSpecificationRequest.FileName, + uploadSpecificationRequest.FileSize, + uploadSpecificationRequest.BatchId, + uploadSpecificationRequest.BatchLast, + uploadSpecificationRequest.CanResume, + uploadSpecificationRequest.StartOver, + uploadSpecificationRequest.Unzip, + uploadSpecificationRequest.Tool, + uploadSpecificationRequest.Overwrite, + uploadSpecificationRequest.Title, + uploadSpecificationRequest.Details, + uploadSpecificationRequest.IsSend, + uploadSpecificationRequest.SendGuid, + null, + uploadSpecificationRequest.ThreadCount, + uploadSpecificationRequest.ResponseFormat, + uploadSpecificationRequest.Notify, + uploadSpecificationRequest.ClientCreatedDateUtc, + uploadSpecificationRequest.ClientModifiedDateUtc, + ExpirationDays, + uploadSpecificationRequest.BaseFileId); return query; } @@ -125,9 +119,33 @@ protected HttpClientHandler GetHttpClientHandler() return httpClientHandler; } - protected internal virtual HttpClient GetHttpClient() + /// + /// Used by some external tests + /// + /// + protected virtual void NotifyProgress(TransferProgress progress) + { + progressReporter.ImmediatelyReportProgress(progress.BytesTransferred); + } + + private HttpClient HttpClient { get; set; } + protected virtual HttpClient GetHttpClient() { - return new HttpClient(GetHttpClientHandler()); + if (HttpClient == null) + { + if (Config.HttpClientFactory != null) + { + HttpClient = Config.HttpClientFactory(Client.CredentialCache, Client.CookieContainer); + } + else + { + HttpClient = new HttpClient(GetHttpClientHandler()) + { + Timeout = new TimeSpan(0, 0, 0, 0, Config.HttpTimeout) + }; + } + } + return HttpClient; } /// @@ -156,7 +174,7 @@ protected Uri GetFinishUriForThreadedUploads() { var finishUri = new StringBuilder(string.Format("{0}&respformat=json", UploadSpecification.FinishUri.AbsoluteUri)); - if (File.Length > 0) + if (UploadSpecificationRequest.FileSize > 0) { finishUri.AppendFormat("&filehash={0}", HashProvider.GetComputedHashAsString()); } @@ -203,6 +221,7 @@ protected UploadResponse ValidateUploadResponse(HttpResponseMessage responseMess { upload.LocalHash = localHash; } + return response; } @@ -235,9 +254,9 @@ private T ValidateStorageCenterResponse(HttpResponseMessage responseMessage, throw new UploadException("StorageCenter error: " + responseContent, UploadStatusCode.Unknown, jEx); } } - catch(UploadException uploadEx) + catch (UploadException uploadEx) { - if(!responseMessage.IsSuccessStatusCode) + if (!responseMessage.IsSuccessStatusCode) { uploadEx.HttpStatusCode = responseMessage.StatusCode; } diff --git a/src/ShareFile.Api.Client/project.json b/src/ShareFile.Api.Client/project.json deleted file mode 100644 index 20814d2..0000000 --- a/src/ShareFile.Api.Client/project.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "version": "3.3.0-*", - "description": "A ShareFile API client library for .NET", - "authors": [ - "Citrix ShareFile" - ], - "title": "ShareFile .NET Client", - "packOptions": { - "owners": [ - "Citrix ShareFile" - ], - "projectUrl": "https://github.com/citrix/ShareFile-NET/blob/master/README.md", - "licenseUrl": "https://github.com/citrix/ShareFile-NET/blob/master/LICENSE.txt", - "tags": [ - "ShareFile" - ] - }, - "buildOptions": { - "compile": { - "include": [ - "**/*.cs" - ] - }, - "xmlDoc": true - }, - "frameworks": { - ".NETPortable,Version=v4.5,Profile=Profile111": { - "buildOptions": { - "define": [ - "PORTABLE", - "ASYNC", - "NETFX_CORE" - ] - }, - "dependencies": { - "Newtonsoft.Json": "9.0.1" - }, - "frameworkAssemblies": { - "mscorlib": "", - "System.Collections": "", - "System.ComponentModel": "", - "System.Diagnostics.Debug": "", - "System.Dynamic.Runtime": "", - "System.Globalization": "", - "System.IO": "", - "System.Linq": "", - "System.Linq.Expressions": "", - "System.Linq.Queryable": "", - "System.Net": "", - "System.Net.Http": "", - "System.Net.Primitives": "", - "System.Net.Requests": "", - "System.ObjectModel": "", - "System.Reflection": "", - "System.Reflection.Extensions": "", - "System.Runtime": "", - "System.Runtime.Extensions": "", - "System.Text.Encoding": "", - "System.Text.RegularExpressions": "", - "System.Threading": "", - "System.Threading.Tasks": "" - } - }, - "net40-client": { - "dependencies": { - "Newtonsoft.Json": "9.0.1", - "Microsoft.Net.Http": "2.2.29" - }, - "buildOptions": { - "define": [ - "Net40" - ] - } - }, - "net45": { - "dependencies": { - "Newtonsoft.Json": "9.0.1" - }, - "frameworkAssemblies": { - "System.Net.Http": "4.0.0.0", - "System.Security": "4.0.0.0" - }, - "buildOptions": { - "define": [ - "ASYNC" - ] - } - }, - "netstandard1.3": { - "dependencies": { - "NETStandard.Library": "1.6.0", - "Newtonsoft.Json": "9.0.1" - }, - "buildOptions": { - "define": [ - "ASYNC" - ] - } - } - } -} diff --git a/src/ShareFile.Api.Client/project.lock.json b/src/ShareFile.Api.Client/project.lock.json deleted file mode 100644 index b940d25..0000000 --- a/src/ShareFile.Api.Client/project.lock.json +++ /dev/null @@ -1,4251 +0,0 @@ -{ - "locked": false, - "version": 2, - "targets": { - ".NETFramework,Version=v4.0,Profile=Client": { - "Microsoft.Bcl/1.1.10": { - "type": "package", - "dependencies": { - "Microsoft.Bcl.Build": "1.0.14" - }, - "compile": { - "lib/net40/System.IO.dll": {}, - "lib/net40/System.Runtime.dll": {}, - "lib/net40/System.Threading.Tasks.dll": {} - }, - "runtime": { - "lib/net40/System.IO.dll": {}, - "lib/net40/System.Runtime.dll": {}, - "lib/net40/System.Threading.Tasks.dll": {} - } - }, - "Microsoft.Bcl.Build/1.0.14": { - "type": "package" - }, - "Microsoft.Net.Http/2.2.29": { - "type": "package", - "dependencies": { - "Microsoft.Bcl": "1.1.10", - "Microsoft.Bcl.Build": "1.0.14" - }, - "compile": { - "lib/net40/System.Net.Http.Extensions.dll": {}, - "lib/net40/System.Net.Http.Primitives.dll": {}, - "lib/net40/System.Net.Http.WebRequest.dll": {}, - "lib/net40/System.Net.Http.dll": {} - }, - "runtime": { - "lib/net40/System.Net.Http.Extensions.dll": {}, - "lib/net40/System.Net.Http.Primitives.dll": {}, - "lib/net40/System.Net.Http.WebRequest.dll": {}, - "lib/net40/System.Net.Http.dll": {} - } - }, - "Newtonsoft.Json/9.0.1": { - "type": "package", - "compile": { - "lib/net40/Newtonsoft.Json.dll": {} - }, - "runtime": { - "lib/net40/Newtonsoft.Json.dll": {} - } - } - }, - ".NETFramework,Version=v4.5": { - "Newtonsoft.Json/9.0.1": { - "type": "package", - "compile": { - "lib/net45/Newtonsoft.Json.dll": {} - }, - "runtime": { - "lib/net45/Newtonsoft.Json.dll": {} - } - } - }, - ".NETFramework,Version=v4.5.1": { - "Newtonsoft.Json/9.0.1": { - "type": "package", - "compile": { - "lib/net45/Newtonsoft.Json.dll": {} - }, - "runtime": { - "lib/net45/Newtonsoft.Json.dll": {} - } - } - }, - ".NETPortable,Version=v4.5,Profile=Profile111": { - "Newtonsoft.Json/9.0.1": { - "type": "package", - "compile": { - "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll": {} - }, - "runtime": { - "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll": {} - } - } - }, - ".NETStandard,Version=v1.3": { - "Microsoft.CSharp/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Dynamic.Runtime": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.0/Microsoft.CSharp.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.CSharp.dll": {} - } - }, - "Microsoft.NETCore.Platforms/1.0.1": { - "type": "package", - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "Microsoft.NETCore.Targets/1.0.1": { - "type": "package", - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "Microsoft.Win32.Primitives/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/Microsoft.Win32.Primitives.dll": {} - } - }, - "NETStandard.Library/1.6.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "System.AppContext": "4.1.0", - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Console": "4.0.0", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tools": "4.0.1", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Globalization.Calendars": "4.0.1", - "System.IO": "4.1.0", - "System.IO.Compression": "4.1.0", - "System.IO.Compression.ZipFile": "4.0.1", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Net.Http": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Net.Sockets": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", - "System.Runtime.Numerics": "4.0.1", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Timer": "4.0.1", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XDocument": "4.0.11" - } - }, - "Newtonsoft.Json/9.0.1": { - "type": "package", - "dependencies": { - "Microsoft.CSharp": "4.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Dynamic.Runtime": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Serialization.Primitives": "4.1.1", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XDocument": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/Newtonsoft.Json.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Newtonsoft.Json.dll": {} - } - }, - "runtime.native.System/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "runtime.native.System.IO.Compression/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "runtime.native.System.Security.Cryptography/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "System.AppContext/4.1.0": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.AppContext.dll": {} - } - }, - "System.Buffers/4.0.0": { - "type": "package", - "dependencies": { - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.1/_._": {} - }, - "runtime": { - "lib/netstandard1.1/System.Buffers.dll": {} - } - }, - "System.Collections/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Collections.dll": {} - } - }, - "System.Collections.Concurrent/4.0.12": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Collections.Concurrent.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Collections.Concurrent.dll": {} - } - }, - "System.Console/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.Runtime": "4.1.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Console.dll": {} - } - }, - "System.Diagnostics.Debug/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Diagnostics.Debug.dll": {} - } - }, - "System.Diagnostics.DiagnosticSource/4.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} - } - }, - "System.Diagnostics.Tools/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Diagnostics.Tools.dll": {} - } - }, - "System.Diagnostics.Tracing/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Diagnostics.Tracing.dll": {} - } - }, - "System.Dynamic.Runtime/4.0.11": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Emit": "4.0.1", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Dynamic.Runtime.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Dynamic.Runtime.dll": {} - } - }, - "System.Globalization/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Globalization.dll": {} - } - }, - "System.Globalization.Calendars/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Globalization": "4.0.11", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Globalization.Calendars.dll": {} - } - }, - "System.IO/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.IO.dll": {} - } - }, - "System.IO.Compression/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "runtime.native.System": "4.0.0", - "runtime.native.System.IO.Compression": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.IO.Compression.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.IO.Compression.ZipFile/4.0.1": { - "type": "package", - "dependencies": { - "System.Buffers": "4.0.0", - "System.IO": "4.1.0", - "System.IO.Compression": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.IO.Compression.ZipFile.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.IO.Compression.ZipFile.dll": {} - } - }, - "System.IO.FileSystem/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Text.Encoding": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.IO.FileSystem.dll": {} - } - }, - "System.IO.FileSystem.Primitives/4.0.1": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} - } - }, - "System.Linq/4.1.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Linq.dll": {} - } - }, - "System.Linq.Expressions/4.1.0": { - "type": "package", - "dependencies": { - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Linq.Expressions.dll": {} - } - }, - "System.Net.Http/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.DiagnosticSource": "4.0.0", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.IO.Compression": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Net.Http.dll": {} - }, - "runtimeTargets": { - "runtimes/win/lib/netstandard1.3/System.Net.Http.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Net.Primitives/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/System.Net.Primitives.dll": {} - } - }, - "System.Net.Sockets/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Net.Sockets.dll": {} - } - }, - "System.ObjectModel/4.0.12": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.ObjectModel.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.ObjectModel.dll": {} - } - }, - "System.Reflection/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Reflection.dll": {} - } - }, - "System.Reflection.Emit/4.0.1": { - "type": "package", - "dependencies": { - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.1/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Reflection.Emit.dll": {} - } - }, - "System.Reflection.Emit.ILGeneration/4.0.1": { - "type": "package", - "dependencies": { - "System.Reflection": "4.1.0", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll": {} - } - }, - "System.Reflection.Extensions/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Reflection.Extensions.dll": {} - } - }, - "System.Reflection.Primitives/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Reflection.Primitives.dll": {} - } - }, - "System.Reflection.TypeExtensions/4.1.0": { - "type": "package", - "dependencies": { - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/_._": {} - } - }, - "System.Resources.ResourceManager/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Globalization": "4.0.11", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Resources.ResourceManager.dll": {} - } - }, - "System.Runtime/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.dll": {} - } - }, - "System.Runtime.Extensions/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.Extensions.dll": {} - } - }, - "System.Runtime.Handles/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.Handles.dll": {} - } - }, - "System.Runtime.InteropServices/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Reflection": "4.1.0", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.InteropServices.dll": {} - } - }, - "System.Runtime.InteropServices.RuntimeInformation/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Threading": "4.0.11", - "runtime.native.System": "4.0.0" - }, - "compile": { - "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Runtime.Numerics/4.0.1": { - "type": "package", - "dependencies": { - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0" - }, - "compile": { - "ref/netstandard1.1/System.Runtime.Numerics.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Runtime.Numerics.dll": {} - } - }, - "System.Runtime.Serialization.Primitives/4.1.1": { - "type": "package", - "dependencies": { - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} - } - }, - "System.Security.Cryptography.Algorithms/4.2.0": { - "type": "package", - "dependencies": { - "System.IO": "4.1.0", - "System.Runtime": "4.1.0", - "System.Security.Cryptography.Primitives": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll": {} - } - }, - "System.Security.Cryptography.Encoding/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Text.Encoding": "4.0.11", - "runtime.native.System.Security.Cryptography": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Security.Cryptography.Primitives/4.0.0": { - "type": "package", - "dependencies": { - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} - } - }, - "System.Security.Cryptography.X509Certificates/4.1.0": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll": {} - } - }, - "System.Text.Encoding/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Text.Encoding.dll": {} - } - }, - "System.Text.Encoding.Extensions/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": {} - } - }, - "System.Text.RegularExpressions/4.1.0": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Text.RegularExpressions.dll": {} - } - }, - "System.Threading/4.0.11": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Threading.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Threading.dll": {} - } - }, - "System.Threading.Tasks/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Threading.Tasks.dll": {} - } - }, - "System.Threading.Tasks.Extensions/4.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll": {} - } - }, - "System.Threading.Timer/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.2/System.Threading.Timer.dll": {} - } - }, - "System.Xml.ReaderWriter/4.0.11": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Tasks.Extensions": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Xml.ReaderWriter.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.ReaderWriter.dll": {} - } - }, - "System.Xml.XDocument/4.0.11": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tools": "4.0.1", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Xml.XDocument.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.XDocument.dll": {} - } - } - } - }, - "libraries": { - "Microsoft.Bcl/1.1.10": { - "sha512": "+tTqoh/M1pyL8El3qLy30EcwnAtyvFoDZJtdG9Cbg/WdFbh4N8kyrq198XHuEL7lnJbeD0DRO8jcX5IIOh05cQ==", - "type": "package", - "files": [ - "License-Stable.rtf", - "Microsoft.Bcl.1.1.10.nupkg", - "Microsoft.Bcl.1.1.10.nupkg.sha512", - "Microsoft.Bcl.nuspec", - "lib/Xamarin.iOS10/_._", - "lib/monoandroid/_._", - "lib/monotouch/_._", - "lib/net40/System.IO.dll", - "lib/net40/System.IO.xml", - "lib/net40/System.Runtime.dll", - "lib/net40/System.Runtime.xml", - "lib/net40/System.Threading.Tasks.dll", - "lib/net40/System.Threading.Tasks.xml", - "lib/net40/ensureRedirect.xml", - "lib/net45/_._", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.IO.dll", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.IO.xml", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Runtime.dll", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Runtime.xml", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Threading.Tasks.dll", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Threading.Tasks.xml", - "lib/portable-net40+sl4+win8+wp71+wpa81/ensureRedirect.xml", - "lib/portable-net40+sl4+win8+wp8+wpa81/System.IO.dll", - "lib/portable-net40+sl4+win8+wp8+wpa81/System.IO.xml", - "lib/portable-net40+sl4+win8+wp8+wpa81/System.Runtime.dll", - "lib/portable-net40+sl4+win8+wp8+wpa81/System.Runtime.xml", - "lib/portable-net40+sl4+win8+wp8+wpa81/System.Threading.Tasks.dll", - "lib/portable-net40+sl4+win8+wp8+wpa81/System.Threading.Tasks.xml", - "lib/portable-net40+sl4+win8+wp8+wpa81/ensureRedirect.xml", - "lib/portable-net40+sl4+win8/System.IO.dll", - "lib/portable-net40+sl4+win8/System.IO.xml", - "lib/portable-net40+sl4+win8/System.Runtime.dll", - "lib/portable-net40+sl4+win8/System.Runtime.xml", - "lib/portable-net40+sl4+win8/System.Threading.Tasks.dll", - "lib/portable-net40+sl4+win8/System.Threading.Tasks.xml", - "lib/portable-net40+sl4+win8/ensureRedirect.xml", - "lib/portable-net40+sl5+win8+wp8+wpa81/System.IO.dll", - "lib/portable-net40+sl5+win8+wp8+wpa81/System.IO.xml", - "lib/portable-net40+sl5+win8+wp8+wpa81/System.Runtime.dll", - "lib/portable-net40+sl5+win8+wp8+wpa81/System.Runtime.xml", - "lib/portable-net40+sl5+win8+wp8+wpa81/System.Threading.Tasks.dll", - "lib/portable-net40+sl5+win8+wp8+wpa81/System.Threading.Tasks.xml", - "lib/portable-net40+sl5+win8+wp8+wpa81/ensureRedirect.xml", - "lib/portable-net40+win8+wp8+wpa81/System.IO.dll", - "lib/portable-net40+win8+wp8+wpa81/System.IO.xml", - "lib/portable-net40+win8+wp8+wpa81/System.Runtime.dll", - "lib/portable-net40+win8+wp8+wpa81/System.Runtime.xml", - "lib/portable-net40+win8+wp8+wpa81/System.Threading.Tasks.dll", - "lib/portable-net40+win8+wp8+wpa81/System.Threading.Tasks.xml", - "lib/portable-net40+win8+wp8+wpa81/ensureRedirect.xml", - "lib/portable-net40+win8/System.IO.dll", - "lib/portable-net40+win8/System.IO.xml", - "lib/portable-net40+win8/System.Runtime.dll", - "lib/portable-net40+win8/System.Runtime.xml", - "lib/portable-net40+win8/System.Threading.Tasks.dll", - "lib/portable-net40+win8/System.Threading.Tasks.xml", - "lib/portable-net40+win8/ensureRedirect.xml", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/portable-net45+win8+wpa81/_._", - "lib/portable-net451+win81+wpa81/_._", - "lib/portable-net451+win81/_._", - "lib/portable-win81+wp81+wpa81/_._", - "lib/sl4-windowsphone71/System.IO.dll", - "lib/sl4-windowsphone71/System.IO.xml", - "lib/sl4-windowsphone71/System.Runtime.dll", - "lib/sl4-windowsphone71/System.Runtime.xml", - "lib/sl4-windowsphone71/System.Threading.Tasks.dll", - "lib/sl4-windowsphone71/System.Threading.Tasks.xml", - "lib/sl4-windowsphone71/ensureRedirect.xml", - "lib/sl4/System.IO.dll", - "lib/sl4/System.IO.xml", - "lib/sl4/System.Runtime.dll", - "lib/sl4/System.Runtime.xml", - "lib/sl4/System.Threading.Tasks.dll", - "lib/sl4/System.Threading.Tasks.xml", - "lib/sl5/System.IO.dll", - "lib/sl5/System.IO.xml", - "lib/sl5/System.Runtime.dll", - "lib/sl5/System.Runtime.xml", - "lib/sl5/System.Threading.Tasks.dll", - "lib/sl5/System.Threading.Tasks.xml", - "lib/win8/_._", - "lib/wp8/_._", - "lib/wpa81/_._" - ] - }, - "Microsoft.Bcl.Build/1.0.14": { - "sha512": "cDLKSvNvRa519hplsbSoYqO69TjdDIhfjtKUM0g20/nVROoWsGav9KCI9HtnGjLmdV1+TcUUDhbotcllibjPEA==", - "type": "package", - "files": [ - "License-Stable.rtf", - "Microsoft.Bcl.Build.1.0.14.nupkg", - "Microsoft.Bcl.Build.1.0.14.nupkg.sha512", - "Microsoft.Bcl.Build.nuspec", - "content/net40/_._", - "content/netcore45/_._", - "content/portable-net40+win8+sl4+wp71+wpa81/_._", - "content/sl4-windowsphone71/_._", - "content/sl4/_._", - "tools/Install.ps1", - "tools/Microsoft.Bcl.Build.Tasks.dll", - "tools/Microsoft.Bcl.Build.targets", - "tools/Uninstall.ps1" - ] - }, - "Microsoft.CSharp/4.0.1": { - "sha512": "H7XflzqSslugYlhNzZ2eSl0/vER1SfBqhdk6r/f69rGbRvXna5ACZD4QYgjwQgpFR+rM+nO6LP7ZZIdKKkqGoA==", - "type": "package", - "path": "Microsoft.CSharp/4.0.1", - "files": [ - "Microsoft.CSharp.4.0.1.nupkg.sha512", - "Microsoft.CSharp.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/Microsoft.CSharp.dll", - "lib/netstandard1.3/Microsoft.CSharp.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/Microsoft.CSharp.dll", - "ref/netcore50/Microsoft.CSharp.xml", - "ref/netcore50/de/Microsoft.CSharp.xml", - "ref/netcore50/es/Microsoft.CSharp.xml", - "ref/netcore50/fr/Microsoft.CSharp.xml", - "ref/netcore50/it/Microsoft.CSharp.xml", - "ref/netcore50/ja/Microsoft.CSharp.xml", - "ref/netcore50/ko/Microsoft.CSharp.xml", - "ref/netcore50/ru/Microsoft.CSharp.xml", - "ref/netcore50/zh-hans/Microsoft.CSharp.xml", - "ref/netcore50/zh-hant/Microsoft.CSharp.xml", - "ref/netstandard1.0/Microsoft.CSharp.dll", - "ref/netstandard1.0/Microsoft.CSharp.xml", - "ref/netstandard1.0/de/Microsoft.CSharp.xml", - "ref/netstandard1.0/es/Microsoft.CSharp.xml", - "ref/netstandard1.0/fr/Microsoft.CSharp.xml", - "ref/netstandard1.0/it/Microsoft.CSharp.xml", - "ref/netstandard1.0/ja/Microsoft.CSharp.xml", - "ref/netstandard1.0/ko/Microsoft.CSharp.xml", - "ref/netstandard1.0/ru/Microsoft.CSharp.xml", - "ref/netstandard1.0/zh-hans/Microsoft.CSharp.xml", - "ref/netstandard1.0/zh-hant/Microsoft.CSharp.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "Microsoft.Net.Http/2.2.29": { - "sha512": "fc4CPEewJ30Xgal+fSq1lYIBt582A7eKlAL7O4HXiYAiTp2VTnA4osSvk7T2n8aS4xTCPVJusQk3yKLT0XSpkg==", - "type": "package", - "files": [ - "License-Stable.rtf", - "Microsoft.Net.Http.2.2.29.nupkg", - "Microsoft.Net.Http.2.2.29.nupkg.sha512", - "Microsoft.Net.Http.nuspec", - "lib/Xamarin.iOS10/System.Net.Http.Extensions.XML", - "lib/Xamarin.iOS10/System.Net.Http.Extensions.dll", - "lib/Xamarin.iOS10/System.Net.Http.Primitives.dll", - "lib/Xamarin.iOS10/System.Net.Http.Primitives.xml", - "lib/monoandroid/System.Net.Http.Extensions.XML", - "lib/monoandroid/System.Net.Http.Extensions.dll", - "lib/monoandroid/System.Net.Http.Primitives.dll", - "lib/monoandroid/System.Net.Http.Primitives.xml", - "lib/monotouch/System.Net.Http.Extensions.XML", - "lib/monotouch/System.Net.Http.Extensions.dll", - "lib/monotouch/System.Net.Http.Primitives.dll", - "lib/monotouch/System.Net.Http.Primitives.xml", - "lib/net40/System.Net.Http.Extensions.XML", - "lib/net40/System.Net.Http.Extensions.dll", - "lib/net40/System.Net.Http.Primitives.dll", - "lib/net40/System.Net.Http.Primitives.xml", - "lib/net40/System.Net.Http.WebRequest.dll", - "lib/net40/System.Net.Http.WebRequest.xml", - "lib/net40/System.Net.Http.dll", - "lib/net40/System.Net.Http.xml", - "lib/net40/ensureRedirect.xml", - "lib/net45/System.Net.Http.Extensions.XML", - "lib/net45/System.Net.Http.Extensions.dll", - "lib/net45/System.Net.Http.Primitives.dll", - "lib/net45/System.Net.Http.Primitives.xml", - "lib/net45/ensureRedirect.xml", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Net.Http.Extensions.XML", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Net.Http.Extensions.dll", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Net.Http.Primitives.XML", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Net.Http.Primitives.dll", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Net.Http.dll", - "lib/portable-net40+sl4+win8+wp71+wpa81/System.Net.Http.xml", - "lib/portable-net40+sl4+win8+wp71+wpa81/ensureRedirect.xml", - "lib/portable-net45+win8+wpa81/System.Net.Http.Extensions.XML", - "lib/portable-net45+win8+wpa81/System.Net.Http.Extensions.dll", - "lib/portable-net45+win8+wpa81/System.Net.Http.Primitives.dll", - "lib/portable-net45+win8+wpa81/System.Net.Http.Primitives.xml", - "lib/portable-net45+win8+wpa81/ensureRedirect.xml", - "lib/portable-net45+win8/System.Net.Http.Extensions.XML", - "lib/portable-net45+win8/System.Net.Http.Extensions.dll", - "lib/portable-net45+win8/System.Net.Http.Primitives.dll", - "lib/portable-net45+win8/System.Net.Http.Primitives.xml", - "lib/portable-net45+win8/ensureRedirect.xml", - "lib/sl4-windowsphone71/System.Net.Http.Extensions.XML", - "lib/sl4-windowsphone71/System.Net.Http.Extensions.dll", - "lib/sl4-windowsphone71/System.Net.Http.Primitives.XML", - "lib/sl4-windowsphone71/System.Net.Http.Primitives.dll", - "lib/sl4-windowsphone71/System.Net.Http.dll", - "lib/sl4-windowsphone71/System.Net.Http.xml", - "lib/win8/System.Net.Http.Extensions.XML", - "lib/win8/System.Net.Http.Extensions.dll", - "lib/win8/System.Net.Http.Primitives.dll", - "lib/win8/System.Net.Http.Primitives.xml", - "lib/wpa81/System.Net.Http.Extensions.XML", - "lib/wpa81/System.Net.Http.Extensions.dll", - "lib/wpa81/System.Net.Http.Primitives.dll", - "lib/wpa81/System.Net.Http.Primitives.xml" - ] - }, - "Microsoft.NETCore.Platforms/1.0.1": { - "sha512": "K/zeK9P63QY+2fHsU4QhQH5FRbQTSRZaxEpWPa04XofUj8MxesWfQ4UnD2xomIRyCU47wH+X7Df/+Bgw7RWNmA==", - "type": "package", - "path": "Microsoft.NETCore.Platforms/1.0.1", - "files": [ - "Microsoft.NETCore.Platforms.1.0.1.nupkg.sha512", - "Microsoft.NETCore.Platforms.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.json" - ] - }, - "Microsoft.NETCore.Targets/1.0.1": { - "sha512": "aR2bILYirvew3+07TFLwLd2etSc5Gy5zjJnv7sKhMzjYJnxt2EtwI+vzKkeogZw23ELDsot2fGAdUnPrGtEBVA==", - "type": "package", - "path": "Microsoft.NETCore.Targets/1.0.1", - "files": [ - "Microsoft.NETCore.Targets.1.0.1.nupkg.sha512", - "Microsoft.NETCore.Targets.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.json" - ] - }, - "Microsoft.Win32.Primitives/4.0.1": { - "sha512": "39V1XGif+vuwm0Y5uc/7SgHAHFMbW2gw8xdjWsNPPTvmWpdcRo/dh8OwTAQpdI5xdf3MZtQmioFSm8xMGH4LsQ==", - "type": "package", - "path": "Microsoft.Win32.Primitives/4.0.1", - "files": [ - "Microsoft.Win32.Primitives.4.0.1.nupkg.sha512", - "Microsoft.Win32.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/Microsoft.Win32.Primitives.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/Microsoft.Win32.Primitives.dll", - "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", - "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "NETStandard.Library/1.6.0": { - "sha512": "7jH7TnxYPun6g64UHPluLdQVtWDaMo2yf1Ufg5vX/1FTlUnNseIu3s/4cmkffJvZodd3qE4JVQMze9A2/mNb1w==", - "type": "package", - "path": "NETStandard.Library/1.6.0", - "files": [ - "NETStandard.Library.1.6.0.nupkg.sha512", - "NETStandard.Library.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt" - ] - }, - "Newtonsoft.Json/9.0.1": { - "sha512": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", - "type": "package", - "path": "Newtonsoft.Json/9.0.1", - "files": [ - "Newtonsoft.Json.9.0.1.nupkg.sha512", - "Newtonsoft.Json.nuspec", - "lib/net20/Newtonsoft.Json.dll", - "lib/net20/Newtonsoft.Json.xml", - "lib/net35/Newtonsoft.Json.dll", - "lib/net35/Newtonsoft.Json.xml", - "lib/net40/Newtonsoft.Json.dll", - "lib/net40/Newtonsoft.Json.xml", - "lib/net45/Newtonsoft.Json.dll", - "lib/net45/Newtonsoft.Json.xml", - "lib/netstandard1.0/Newtonsoft.Json.dll", - "lib/netstandard1.0/Newtonsoft.Json.xml", - "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.dll", - "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.xml", - "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll", - "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.xml", - "tools/install.ps1" - ] - }, - "runtime.native.System/4.0.0": { - "sha512": "2c62iIT0dlLKev5lVnlZYQ62mXcuc/BRQ3el3Vbzbw3YEZ82aKoK9G0sIyiLMCQzCFD2TNRFvwUQ6g6uq9tXOA==", - "type": "package", - "path": "runtime.native.System/4.0.0", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.4.0.0.nupkg.sha512", - "runtime.native.System.nuspec" - ] - }, - "runtime.native.System.IO.Compression/4.1.0": { - "sha512": "UP/zjD5MwU1jT6/3h3nbI+iRakeqmz5sOV9kmssKIeFOuQ7OQwW2hA97IMUjKIvXy7zW3fCTPfcbVQpPj8Zq0A==", - "type": "package", - "path": "runtime.native.System.IO.Compression/4.1.0", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.IO.Compression.4.1.0.nupkg.sha512", - "runtime.native.System.IO.Compression.nuspec" - ] - }, - "runtime.native.System.Security.Cryptography/4.0.0": { - "sha512": "9KMQFDwEFcOs8kTQLbkviSFzUjb4r3Uo3ge34Dn+DLEBaVWPemA+9gS9em8JtypTmz52kDEGj/ktpanNc692XA==", - "type": "package", - "path": "runtime.native.System.Security.Cryptography/4.0.0", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.Security.Cryptography.4.0.0.nupkg.sha512", - "runtime.native.System.Security.Cryptography.nuspec" - ] - }, - "System.AppContext/4.1.0": { - "sha512": "uWU/zh6LM6FOQWm7Sr85uicsg9O4se+cXeLy+iRgjcF1yycWLiGMtOrqN9WIqqx6xqu3PNd0YI1tSHEQcb/DmA==", - "type": "package", - "path": "System.AppContext/4.1.0", - "files": [ - "System.AppContext.4.1.0.nupkg.sha512", - "System.AppContext.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.AppContext.dll", - "lib/net463/System.AppContext.dll", - "lib/netcore50/System.AppContext.dll", - "lib/netstandard1.6/System.AppContext.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.AppContext.dll", - "ref/net463/System.AppContext.dll", - "ref/netstandard/_._", - "ref/netstandard1.3/System.AppContext.dll", - "ref/netstandard1.3/System.AppContext.xml", - "ref/netstandard1.3/de/System.AppContext.xml", - "ref/netstandard1.3/es/System.AppContext.xml", - "ref/netstandard1.3/fr/System.AppContext.xml", - "ref/netstandard1.3/it/System.AppContext.xml", - "ref/netstandard1.3/ja/System.AppContext.xml", - "ref/netstandard1.3/ko/System.AppContext.xml", - "ref/netstandard1.3/ru/System.AppContext.xml", - "ref/netstandard1.3/zh-hans/System.AppContext.xml", - "ref/netstandard1.3/zh-hant/System.AppContext.xml", - "ref/netstandard1.6/System.AppContext.dll", - "ref/netstandard1.6/System.AppContext.xml", - "ref/netstandard1.6/de/System.AppContext.xml", - "ref/netstandard1.6/es/System.AppContext.xml", - "ref/netstandard1.6/fr/System.AppContext.xml", - "ref/netstandard1.6/it/System.AppContext.xml", - "ref/netstandard1.6/ja/System.AppContext.xml", - "ref/netstandard1.6/ko/System.AppContext.xml", - "ref/netstandard1.6/ru/System.AppContext.xml", - "ref/netstandard1.6/zh-hans/System.AppContext.xml", - "ref/netstandard1.6/zh-hant/System.AppContext.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.AppContext.dll" - ] - }, - "System.Buffers/4.0.0": { - "sha512": "1uyWVwoAK4iaV5I+JMSbafFmDjQquEp8yY5VNy79Oi3mKyMtJc2tyq3EkN8YalR+TAjfQGqT9c/WbPXpl7dOcQ==", - "type": "package", - "path": "System.Buffers/4.0.0", - "files": [ - "System.Buffers.4.0.0.nupkg.sha512", - "System.Buffers.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.1/.xml", - "lib/netstandard1.1/System.Buffers.dll" - ] - }, - "System.Collections/4.0.11": { - "sha512": "zxiv55PT9t9yWJmR4FjtjcAhzX6l/LjI6Bo4caigGUovI997BoYFP22jX7mcPhbBP3zJ3llBtr7OsyrNAEm4Rw==", - "type": "package", - "path": "System.Collections/4.0.11", - "files": [ - "System.Collections.4.0.11.nupkg.sha512", - "System.Collections.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Collections.dll", - "ref/netcore50/System.Collections.xml", - "ref/netcore50/de/System.Collections.xml", - "ref/netcore50/es/System.Collections.xml", - "ref/netcore50/fr/System.Collections.xml", - "ref/netcore50/it/System.Collections.xml", - "ref/netcore50/ja/System.Collections.xml", - "ref/netcore50/ko/System.Collections.xml", - "ref/netcore50/ru/System.Collections.xml", - "ref/netcore50/zh-hans/System.Collections.xml", - "ref/netcore50/zh-hant/System.Collections.xml", - "ref/netstandard1.0/System.Collections.dll", - "ref/netstandard1.0/System.Collections.xml", - "ref/netstandard1.0/de/System.Collections.xml", - "ref/netstandard1.0/es/System.Collections.xml", - "ref/netstandard1.0/fr/System.Collections.xml", - "ref/netstandard1.0/it/System.Collections.xml", - "ref/netstandard1.0/ja/System.Collections.xml", - "ref/netstandard1.0/ko/System.Collections.xml", - "ref/netstandard1.0/ru/System.Collections.xml", - "ref/netstandard1.0/zh-hans/System.Collections.xml", - "ref/netstandard1.0/zh-hant/System.Collections.xml", - "ref/netstandard1.3/System.Collections.dll", - "ref/netstandard1.3/System.Collections.xml", - "ref/netstandard1.3/de/System.Collections.xml", - "ref/netstandard1.3/es/System.Collections.xml", - "ref/netstandard1.3/fr/System.Collections.xml", - "ref/netstandard1.3/it/System.Collections.xml", - "ref/netstandard1.3/ja/System.Collections.xml", - "ref/netstandard1.3/ko/System.Collections.xml", - "ref/netstandard1.3/ru/System.Collections.xml", - "ref/netstandard1.3/zh-hans/System.Collections.xml", - "ref/netstandard1.3/zh-hant/System.Collections.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Collections.Concurrent/4.0.12": { - "sha512": "2H4UmaXvwJysx7FnqiFilpDw3mA2TbA4gU2wkqL54LgJh+SCMLWgINMkOE2HEmsiY8Gj6XREoT4QHEitAeRpyA==", - "type": "package", - "path": "System.Collections.Concurrent/4.0.12", - "files": [ - "System.Collections.Concurrent.4.0.12.nupkg.sha512", - "System.Collections.Concurrent.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Collections.Concurrent.dll", - "lib/netstandard1.3/System.Collections.Concurrent.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Collections.Concurrent.dll", - "ref/netcore50/System.Collections.Concurrent.xml", - "ref/netcore50/de/System.Collections.Concurrent.xml", - "ref/netcore50/es/System.Collections.Concurrent.xml", - "ref/netcore50/fr/System.Collections.Concurrent.xml", - "ref/netcore50/it/System.Collections.Concurrent.xml", - "ref/netcore50/ja/System.Collections.Concurrent.xml", - "ref/netcore50/ko/System.Collections.Concurrent.xml", - "ref/netcore50/ru/System.Collections.Concurrent.xml", - "ref/netcore50/zh-hans/System.Collections.Concurrent.xml", - "ref/netcore50/zh-hant/System.Collections.Concurrent.xml", - "ref/netstandard1.1/System.Collections.Concurrent.dll", - "ref/netstandard1.1/System.Collections.Concurrent.xml", - "ref/netstandard1.1/de/System.Collections.Concurrent.xml", - "ref/netstandard1.1/es/System.Collections.Concurrent.xml", - "ref/netstandard1.1/fr/System.Collections.Concurrent.xml", - "ref/netstandard1.1/it/System.Collections.Concurrent.xml", - "ref/netstandard1.1/ja/System.Collections.Concurrent.xml", - "ref/netstandard1.1/ko/System.Collections.Concurrent.xml", - "ref/netstandard1.1/ru/System.Collections.Concurrent.xml", - "ref/netstandard1.1/zh-hans/System.Collections.Concurrent.xml", - "ref/netstandard1.1/zh-hant/System.Collections.Concurrent.xml", - "ref/netstandard1.3/System.Collections.Concurrent.dll", - "ref/netstandard1.3/System.Collections.Concurrent.xml", - "ref/netstandard1.3/de/System.Collections.Concurrent.xml", - "ref/netstandard1.3/es/System.Collections.Concurrent.xml", - "ref/netstandard1.3/fr/System.Collections.Concurrent.xml", - "ref/netstandard1.3/it/System.Collections.Concurrent.xml", - "ref/netstandard1.3/ja/System.Collections.Concurrent.xml", - "ref/netstandard1.3/ko/System.Collections.Concurrent.xml", - "ref/netstandard1.3/ru/System.Collections.Concurrent.xml", - "ref/netstandard1.3/zh-hans/System.Collections.Concurrent.xml", - "ref/netstandard1.3/zh-hant/System.Collections.Concurrent.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Console/4.0.0": { - "sha512": "gJm89g39yYzEv8G0+UIxBQy0h/f1IpDCtrpM2vjMikSG+/hlzcK0t+Z1Psx5vBSCgaEgl3rVuD6cg9r79a04Dg==", - "type": "package", - "path": "System.Console/4.0.0", - "files": [ - "System.Console.4.0.0.nupkg.sha512", - "System.Console.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Console.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Console.dll", - "ref/netstandard1.3/System.Console.dll", - "ref/netstandard1.3/System.Console.xml", - "ref/netstandard1.3/de/System.Console.xml", - "ref/netstandard1.3/es/System.Console.xml", - "ref/netstandard1.3/fr/System.Console.xml", - "ref/netstandard1.3/it/System.Console.xml", - "ref/netstandard1.3/ja/System.Console.xml", - "ref/netstandard1.3/ko/System.Console.xml", - "ref/netstandard1.3/ru/System.Console.xml", - "ref/netstandard1.3/zh-hans/System.Console.xml", - "ref/netstandard1.3/zh-hant/System.Console.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Diagnostics.Debug/4.0.11": { - "sha512": "A6mOMxd1KqE/+q+rTW3kDXUrHj25WoEShyFLSvvSyk7rwiamZHf5tuR+IBqG5XJ9RH+MCA0OU0ClcghSUGbIpw==", - "type": "package", - "path": "System.Diagnostics.Debug/4.0.11", - "files": [ - "System.Diagnostics.Debug.4.0.11.nupkg.sha512", - "System.Diagnostics.Debug.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Diagnostics.Debug.dll", - "ref/netcore50/System.Diagnostics.Debug.xml", - "ref/netcore50/de/System.Diagnostics.Debug.xml", - "ref/netcore50/es/System.Diagnostics.Debug.xml", - "ref/netcore50/fr/System.Diagnostics.Debug.xml", - "ref/netcore50/it/System.Diagnostics.Debug.xml", - "ref/netcore50/ja/System.Diagnostics.Debug.xml", - "ref/netcore50/ko/System.Diagnostics.Debug.xml", - "ref/netcore50/ru/System.Diagnostics.Debug.xml", - "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", - "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/System.Diagnostics.Debug.dll", - "ref/netstandard1.0/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/System.Diagnostics.Debug.dll", - "ref/netstandard1.3/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Diagnostics.DiagnosticSource/4.0.0": { - "sha512": "HYqSKqf6o/dYLrVdhf6ieQy6vf/B469/R1zuXSu1eF8prbmGTxzVEPrGoURXfY1od9luFcn783Z0P4967JSKxw==", - "type": "package", - "path": "System.Diagnostics.DiagnosticSource/4.0.0", - "files": [ - "System.Diagnostics.DiagnosticSource.4.0.0.nupkg.sha512", - "System.Diagnostics.DiagnosticSource.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net46/System.Diagnostics.DiagnosticSource.dll", - "lib/net46/System.Diagnostics.DiagnosticSource.xml", - "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", - "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", - "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", - "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml" - ] - }, - "System.Diagnostics.Tools/4.0.1": { - "sha512": "12TsSvZ0IX3cWo7qLiJq3IEyxfQ9iLSFRZWWHVnF4ZconmO05Brf5ISXgnNc/sRWBG9imNXub2+ljLGHFGlbYw==", - "type": "package", - "path": "System.Diagnostics.Tools/4.0.1", - "files": [ - "System.Diagnostics.Tools.4.0.1.nupkg.sha512", - "System.Diagnostics.Tools.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Diagnostics.Tools.dll", - "ref/netcore50/System.Diagnostics.Tools.xml", - "ref/netcore50/de/System.Diagnostics.Tools.xml", - "ref/netcore50/es/System.Diagnostics.Tools.xml", - "ref/netcore50/fr/System.Diagnostics.Tools.xml", - "ref/netcore50/it/System.Diagnostics.Tools.xml", - "ref/netcore50/ja/System.Diagnostics.Tools.xml", - "ref/netcore50/ko/System.Diagnostics.Tools.xml", - "ref/netcore50/ru/System.Diagnostics.Tools.xml", - "ref/netcore50/zh-hans/System.Diagnostics.Tools.xml", - "ref/netcore50/zh-hant/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/System.Diagnostics.Tools.dll", - "ref/netstandard1.0/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/de/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/es/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/fr/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/it/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/ja/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/ko/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/ru/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/zh-hans/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/zh-hant/System.Diagnostics.Tools.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Diagnostics.Tracing/4.1.0": { - "sha512": "j7OAz8XHb/Q7lJ0Pv87s7pCIUqZpyX1BsjY8C4HlV6uT+0rEJDWXTVEGoRZINgRYMncbNrGz5vNCZ6dUNAIQtA==", - "type": "package", - "path": "System.Diagnostics.Tracing/4.1.0", - "files": [ - "System.Diagnostics.Tracing.4.1.0.nupkg.sha512", - "System.Diagnostics.Tracing.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Diagnostics.Tracing.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Diagnostics.Tracing.dll", - "ref/netcore50/System.Diagnostics.Tracing.dll", - "ref/netcore50/System.Diagnostics.Tracing.xml", - "ref/netcore50/de/System.Diagnostics.Tracing.xml", - "ref/netcore50/es/System.Diagnostics.Tracing.xml", - "ref/netcore50/fr/System.Diagnostics.Tracing.xml", - "ref/netcore50/it/System.Diagnostics.Tracing.xml", - "ref/netcore50/ja/System.Diagnostics.Tracing.xml", - "ref/netcore50/ko/System.Diagnostics.Tracing.xml", - "ref/netcore50/ru/System.Diagnostics.Tracing.xml", - "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/System.Diagnostics.Tracing.dll", - "ref/netstandard1.1/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/System.Diagnostics.Tracing.dll", - "ref/netstandard1.2/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/System.Diagnostics.Tracing.dll", - "ref/netstandard1.3/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/System.Diagnostics.Tracing.dll", - "ref/netstandard1.5/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Dynamic.Runtime/4.0.11": { - "sha512": "kg873KdhKoCtzmZVhMrUWG+YAFj0Cw2UGByRbOugS9g85wxGsNbmTIW0WVN0279kHaiZ/9GZ2r/omWx2lgcs/w==", - "type": "package", - "path": "System.Dynamic.Runtime/4.0.11", - "files": [ - "System.Dynamic.Runtime.4.0.11.nupkg.sha512", - "System.Dynamic.Runtime.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Dynamic.Runtime.dll", - "lib/netstandard1.3/System.Dynamic.Runtime.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Dynamic.Runtime.dll", - "ref/netcore50/System.Dynamic.Runtime.xml", - "ref/netcore50/de/System.Dynamic.Runtime.xml", - "ref/netcore50/es/System.Dynamic.Runtime.xml", - "ref/netcore50/fr/System.Dynamic.Runtime.xml", - "ref/netcore50/it/System.Dynamic.Runtime.xml", - "ref/netcore50/ja/System.Dynamic.Runtime.xml", - "ref/netcore50/ko/System.Dynamic.Runtime.xml", - "ref/netcore50/ru/System.Dynamic.Runtime.xml", - "ref/netcore50/zh-hans/System.Dynamic.Runtime.xml", - "ref/netcore50/zh-hant/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/System.Dynamic.Runtime.dll", - "ref/netstandard1.0/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/de/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/es/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/fr/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/it/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/ja/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/ko/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/ru/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/zh-hans/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/zh-hant/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/System.Dynamic.Runtime.dll", - "ref/netstandard1.3/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/de/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/es/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/fr/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/it/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/ja/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/ko/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/ru/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/zh-hans/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/zh-hant/System.Dynamic.Runtime.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Dynamic.Runtime.dll" - ] - }, - "System.Globalization/4.0.11": { - "sha512": "QtP7WdS3fw1vePjtXdL4m5pb6dcbOGPSOXHhwEoSqB0PJNjERLbJi/o8A/wqSzwABqGFkIth4e8m9H2J5hOW3g==", - "type": "package", - "path": "System.Globalization/4.0.11", - "files": [ - "System.Globalization.4.0.11.nupkg.sha512", - "System.Globalization.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Globalization.dll", - "ref/netcore50/System.Globalization.xml", - "ref/netcore50/de/System.Globalization.xml", - "ref/netcore50/es/System.Globalization.xml", - "ref/netcore50/fr/System.Globalization.xml", - "ref/netcore50/it/System.Globalization.xml", - "ref/netcore50/ja/System.Globalization.xml", - "ref/netcore50/ko/System.Globalization.xml", - "ref/netcore50/ru/System.Globalization.xml", - "ref/netcore50/zh-hans/System.Globalization.xml", - "ref/netcore50/zh-hant/System.Globalization.xml", - "ref/netstandard1.0/System.Globalization.dll", - "ref/netstandard1.0/System.Globalization.xml", - "ref/netstandard1.0/de/System.Globalization.xml", - "ref/netstandard1.0/es/System.Globalization.xml", - "ref/netstandard1.0/fr/System.Globalization.xml", - "ref/netstandard1.0/it/System.Globalization.xml", - "ref/netstandard1.0/ja/System.Globalization.xml", - "ref/netstandard1.0/ko/System.Globalization.xml", - "ref/netstandard1.0/ru/System.Globalization.xml", - "ref/netstandard1.0/zh-hans/System.Globalization.xml", - "ref/netstandard1.0/zh-hant/System.Globalization.xml", - "ref/netstandard1.3/System.Globalization.dll", - "ref/netstandard1.3/System.Globalization.xml", - "ref/netstandard1.3/de/System.Globalization.xml", - "ref/netstandard1.3/es/System.Globalization.xml", - "ref/netstandard1.3/fr/System.Globalization.xml", - "ref/netstandard1.3/it/System.Globalization.xml", - "ref/netstandard1.3/ja/System.Globalization.xml", - "ref/netstandard1.3/ko/System.Globalization.xml", - "ref/netstandard1.3/ru/System.Globalization.xml", - "ref/netstandard1.3/zh-hans/System.Globalization.xml", - "ref/netstandard1.3/zh-hant/System.Globalization.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Globalization.Calendars/4.0.1": { - "sha512": "CFqEWXzPkeWcBC99fXQfDtfdBGZ5Wh3xssBUjj1UqJsLgushnGG0yRnj1IhkJ1Lzw2QEGzrrq87Ys7SfOfE2Dg==", - "type": "package", - "path": "System.Globalization.Calendars/4.0.1", - "files": [ - "System.Globalization.Calendars.4.0.1.nupkg.sha512", - "System.Globalization.Calendars.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Globalization.Calendars.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Globalization.Calendars.dll", - "ref/netstandard1.3/System.Globalization.Calendars.dll", - "ref/netstandard1.3/System.Globalization.Calendars.xml", - "ref/netstandard1.3/de/System.Globalization.Calendars.xml", - "ref/netstandard1.3/es/System.Globalization.Calendars.xml", - "ref/netstandard1.3/fr/System.Globalization.Calendars.xml", - "ref/netstandard1.3/it/System.Globalization.Calendars.xml", - "ref/netstandard1.3/ja/System.Globalization.Calendars.xml", - "ref/netstandard1.3/ko/System.Globalization.Calendars.xml", - "ref/netstandard1.3/ru/System.Globalization.Calendars.xml", - "ref/netstandard1.3/zh-hans/System.Globalization.Calendars.xml", - "ref/netstandard1.3/zh-hant/System.Globalization.Calendars.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO/4.1.0": { - "sha512": "v8gRKvq5drvHlFuIs/p0hvX1pfV3H4Zw4fS2u9iqh9OFB0RBaw5Xuq2I1an5kvvNI2ZNyNILBWPNlN9yrRFm2Q==", - "type": "package", - "path": "System.IO/4.1.0", - "files": [ - "System.IO.4.1.0.nupkg.sha512", - "System.IO.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.IO.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.IO.dll", - "ref/netcore50/System.IO.dll", - "ref/netcore50/System.IO.xml", - "ref/netcore50/de/System.IO.xml", - "ref/netcore50/es/System.IO.xml", - "ref/netcore50/fr/System.IO.xml", - "ref/netcore50/it/System.IO.xml", - "ref/netcore50/ja/System.IO.xml", - "ref/netcore50/ko/System.IO.xml", - "ref/netcore50/ru/System.IO.xml", - "ref/netcore50/zh-hans/System.IO.xml", - "ref/netcore50/zh-hant/System.IO.xml", - "ref/netstandard1.0/System.IO.dll", - "ref/netstandard1.0/System.IO.xml", - "ref/netstandard1.0/de/System.IO.xml", - "ref/netstandard1.0/es/System.IO.xml", - "ref/netstandard1.0/fr/System.IO.xml", - "ref/netstandard1.0/it/System.IO.xml", - "ref/netstandard1.0/ja/System.IO.xml", - "ref/netstandard1.0/ko/System.IO.xml", - "ref/netstandard1.0/ru/System.IO.xml", - "ref/netstandard1.0/zh-hans/System.IO.xml", - "ref/netstandard1.0/zh-hant/System.IO.xml", - "ref/netstandard1.3/System.IO.dll", - "ref/netstandard1.3/System.IO.xml", - "ref/netstandard1.3/de/System.IO.xml", - "ref/netstandard1.3/es/System.IO.xml", - "ref/netstandard1.3/fr/System.IO.xml", - "ref/netstandard1.3/it/System.IO.xml", - "ref/netstandard1.3/ja/System.IO.xml", - "ref/netstandard1.3/ko/System.IO.xml", - "ref/netstandard1.3/ru/System.IO.xml", - "ref/netstandard1.3/zh-hans/System.IO.xml", - "ref/netstandard1.3/zh-hant/System.IO.xml", - "ref/netstandard1.5/System.IO.dll", - "ref/netstandard1.5/System.IO.xml", - "ref/netstandard1.5/de/System.IO.xml", - "ref/netstandard1.5/es/System.IO.xml", - "ref/netstandard1.5/fr/System.IO.xml", - "ref/netstandard1.5/it/System.IO.xml", - "ref/netstandard1.5/ja/System.IO.xml", - "ref/netstandard1.5/ko/System.IO.xml", - "ref/netstandard1.5/ru/System.IO.xml", - "ref/netstandard1.5/zh-hans/System.IO.xml", - "ref/netstandard1.5/zh-hant/System.IO.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO.Compression/4.1.0": { - "sha512": "BgEz23gkj3mfuxgY5I7QPX2CGevQ8fGOALbVvAGZ2vi7FAto1eW5pQOU2X26MC66hswgmnb3bGx/yLICnLLkkg==", - "type": "package", - "path": "System.IO.Compression/4.1.0", - "files": [ - "System.IO.Compression.4.1.0.nupkg.sha512", - "System.IO.Compression.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net46/System.IO.Compression.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net46/System.IO.Compression.dll", - "ref/netcore50/System.IO.Compression.dll", - "ref/netcore50/System.IO.Compression.xml", - "ref/netcore50/de/System.IO.Compression.xml", - "ref/netcore50/es/System.IO.Compression.xml", - "ref/netcore50/fr/System.IO.Compression.xml", - "ref/netcore50/it/System.IO.Compression.xml", - "ref/netcore50/ja/System.IO.Compression.xml", - "ref/netcore50/ko/System.IO.Compression.xml", - "ref/netcore50/ru/System.IO.Compression.xml", - "ref/netcore50/zh-hans/System.IO.Compression.xml", - "ref/netcore50/zh-hant/System.IO.Compression.xml", - "ref/netstandard1.1/System.IO.Compression.dll", - "ref/netstandard1.1/System.IO.Compression.xml", - "ref/netstandard1.1/de/System.IO.Compression.xml", - "ref/netstandard1.1/es/System.IO.Compression.xml", - "ref/netstandard1.1/fr/System.IO.Compression.xml", - "ref/netstandard1.1/it/System.IO.Compression.xml", - "ref/netstandard1.1/ja/System.IO.Compression.xml", - "ref/netstandard1.1/ko/System.IO.Compression.xml", - "ref/netstandard1.1/ru/System.IO.Compression.xml", - "ref/netstandard1.1/zh-hans/System.IO.Compression.xml", - "ref/netstandard1.1/zh-hant/System.IO.Compression.xml", - "ref/netstandard1.3/System.IO.Compression.dll", - "ref/netstandard1.3/System.IO.Compression.xml", - "ref/netstandard1.3/de/System.IO.Compression.xml", - "ref/netstandard1.3/es/System.IO.Compression.xml", - "ref/netstandard1.3/fr/System.IO.Compression.xml", - "ref/netstandard1.3/it/System.IO.Compression.xml", - "ref/netstandard1.3/ja/System.IO.Compression.xml", - "ref/netstandard1.3/ko/System.IO.Compression.xml", - "ref/netstandard1.3/ru/System.IO.Compression.xml", - "ref/netstandard1.3/zh-hans/System.IO.Compression.xml", - "ref/netstandard1.3/zh-hant/System.IO.Compression.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll", - "runtimes/win/lib/net46/System.IO.Compression.dll", - "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll" - ] - }, - "System.IO.Compression.ZipFile/4.0.1": { - "sha512": "cRnl0vZ1wyc1Llx+wJAitWCmVWNIsckGyU0TEboF84e+HLCVfgahXOaf4/QFBI/uyxQO15BwbFCHXkSagkixbg==", - "type": "package", - "path": "System.IO.Compression.ZipFile/4.0.1", - "files": [ - "System.IO.Compression.ZipFile.4.0.1.nupkg.sha512", - "System.IO.Compression.ZipFile.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.Compression.ZipFile.dll", - "lib/netstandard1.3/System.IO.Compression.ZipFile.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.Compression.ZipFile.dll", - "ref/netstandard1.3/System.IO.Compression.ZipFile.dll", - "ref/netstandard1.3/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/de/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/es/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/fr/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/it/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/ja/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/ko/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/ru/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/zh-hans/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/zh-hant/System.IO.Compression.ZipFile.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO.FileSystem/4.0.1": { - "sha512": "I0o+Xe2gSQObtzBOVWv/CkpWfveDF5e7jLuNiwLF1RJajRsXv1KmfMROtgeDiJbm6O/f41rgryglgeXjE2ieaA==", - "type": "package", - "path": "System.IO.FileSystem/4.0.1", - "files": [ - "System.IO.FileSystem.4.0.1.nupkg.sha512", - "System.IO.FileSystem.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.FileSystem.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.FileSystem.dll", - "ref/netstandard1.3/System.IO.FileSystem.dll", - "ref/netstandard1.3/System.IO.FileSystem.xml", - "ref/netstandard1.3/de/System.IO.FileSystem.xml", - "ref/netstandard1.3/es/System.IO.FileSystem.xml", - "ref/netstandard1.3/fr/System.IO.FileSystem.xml", - "ref/netstandard1.3/it/System.IO.FileSystem.xml", - "ref/netstandard1.3/ja/System.IO.FileSystem.xml", - "ref/netstandard1.3/ko/System.IO.FileSystem.xml", - "ref/netstandard1.3/ru/System.IO.FileSystem.xml", - "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", - "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO.FileSystem.Primitives/4.0.1": { - "sha512": "zNpxalyldw2daLfJMyRs0ZhyE5n/9eBOP051INInt/VsFa4KrD06eG/DM7TfwLuti0IQ1JFvKqty9Rhe/wfXqA==", - "type": "package", - "path": "System.IO.FileSystem.Primitives/4.0.1", - "files": [ - "System.IO.FileSystem.Primitives.4.0.1.nupkg.sha512", - "System.IO.FileSystem.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.FileSystem.Primitives.dll", - "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.FileSystem.Primitives.dll", - "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", - "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Linq/4.1.0": { - "sha512": "nfnEPOx+2IE3WAf2EPjJdAYPQJDB9WNpt58/OV6hyC1PQiaa/+CpuUUs9MoqljB9IdSO2bneSj0IeQfqn7Oiwg==", - "type": "package", - "path": "System.Linq/4.1.0", - "files": [ - "System.Linq.4.1.0.nupkg.sha512", - "System.Linq.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net463/System.Linq.dll", - "lib/netcore50/System.Linq.dll", - "lib/netstandard1.6/System.Linq.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net463/System.Linq.dll", - "ref/netcore50/System.Linq.dll", - "ref/netcore50/System.Linq.xml", - "ref/netcore50/de/System.Linq.xml", - "ref/netcore50/es/System.Linq.xml", - "ref/netcore50/fr/System.Linq.xml", - "ref/netcore50/it/System.Linq.xml", - "ref/netcore50/ja/System.Linq.xml", - "ref/netcore50/ko/System.Linq.xml", - "ref/netcore50/ru/System.Linq.xml", - "ref/netcore50/zh-hans/System.Linq.xml", - "ref/netcore50/zh-hant/System.Linq.xml", - "ref/netstandard1.0/System.Linq.dll", - "ref/netstandard1.0/System.Linq.xml", - "ref/netstandard1.0/de/System.Linq.xml", - "ref/netstandard1.0/es/System.Linq.xml", - "ref/netstandard1.0/fr/System.Linq.xml", - "ref/netstandard1.0/it/System.Linq.xml", - "ref/netstandard1.0/ja/System.Linq.xml", - "ref/netstandard1.0/ko/System.Linq.xml", - "ref/netstandard1.0/ru/System.Linq.xml", - "ref/netstandard1.0/zh-hans/System.Linq.xml", - "ref/netstandard1.0/zh-hant/System.Linq.xml", - "ref/netstandard1.6/System.Linq.dll", - "ref/netstandard1.6/System.Linq.xml", - "ref/netstandard1.6/de/System.Linq.xml", - "ref/netstandard1.6/es/System.Linq.xml", - "ref/netstandard1.6/fr/System.Linq.xml", - "ref/netstandard1.6/it/System.Linq.xml", - "ref/netstandard1.6/ja/System.Linq.xml", - "ref/netstandard1.6/ko/System.Linq.xml", - "ref/netstandard1.6/ru/System.Linq.xml", - "ref/netstandard1.6/zh-hans/System.Linq.xml", - "ref/netstandard1.6/zh-hant/System.Linq.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Linq.Expressions/4.1.0": { - "sha512": "yJ+iYvSdnXKC4usOzVmopzbj4EiWxe1FL3QTXOYV7JYA/XXOiCTY0kZi/uZht0Hc/e8DGFyXv1BOA/LAj1QwNA==", - "type": "package", - "path": "System.Linq.Expressions/4.1.0", - "files": [ - "System.Linq.Expressions.4.1.0.nupkg.sha512", - "System.Linq.Expressions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net463/System.Linq.Expressions.dll", - "lib/netcore50/System.Linq.Expressions.dll", - "lib/netstandard1.6/System.Linq.Expressions.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net463/System.Linq.Expressions.dll", - "ref/netcore50/System.Linq.Expressions.dll", - "ref/netcore50/System.Linq.Expressions.xml", - "ref/netcore50/de/System.Linq.Expressions.xml", - "ref/netcore50/es/System.Linq.Expressions.xml", - "ref/netcore50/fr/System.Linq.Expressions.xml", - "ref/netcore50/it/System.Linq.Expressions.xml", - "ref/netcore50/ja/System.Linq.Expressions.xml", - "ref/netcore50/ko/System.Linq.Expressions.xml", - "ref/netcore50/ru/System.Linq.Expressions.xml", - "ref/netcore50/zh-hans/System.Linq.Expressions.xml", - "ref/netcore50/zh-hant/System.Linq.Expressions.xml", - "ref/netstandard1.0/System.Linq.Expressions.dll", - "ref/netstandard1.0/System.Linq.Expressions.xml", - "ref/netstandard1.0/de/System.Linq.Expressions.xml", - "ref/netstandard1.0/es/System.Linq.Expressions.xml", - "ref/netstandard1.0/fr/System.Linq.Expressions.xml", - "ref/netstandard1.0/it/System.Linq.Expressions.xml", - "ref/netstandard1.0/ja/System.Linq.Expressions.xml", - "ref/netstandard1.0/ko/System.Linq.Expressions.xml", - "ref/netstandard1.0/ru/System.Linq.Expressions.xml", - "ref/netstandard1.0/zh-hans/System.Linq.Expressions.xml", - "ref/netstandard1.0/zh-hant/System.Linq.Expressions.xml", - "ref/netstandard1.3/System.Linq.Expressions.dll", - "ref/netstandard1.3/System.Linq.Expressions.xml", - "ref/netstandard1.3/de/System.Linq.Expressions.xml", - "ref/netstandard1.3/es/System.Linq.Expressions.xml", - "ref/netstandard1.3/fr/System.Linq.Expressions.xml", - "ref/netstandard1.3/it/System.Linq.Expressions.xml", - "ref/netstandard1.3/ja/System.Linq.Expressions.xml", - "ref/netstandard1.3/ko/System.Linq.Expressions.xml", - "ref/netstandard1.3/ru/System.Linq.Expressions.xml", - "ref/netstandard1.3/zh-hans/System.Linq.Expressions.xml", - "ref/netstandard1.3/zh-hant/System.Linq.Expressions.xml", - "ref/netstandard1.6/System.Linq.Expressions.dll", - "ref/netstandard1.6/System.Linq.Expressions.xml", - "ref/netstandard1.6/de/System.Linq.Expressions.xml", - "ref/netstandard1.6/es/System.Linq.Expressions.xml", - "ref/netstandard1.6/fr/System.Linq.Expressions.xml", - "ref/netstandard1.6/it/System.Linq.Expressions.xml", - "ref/netstandard1.6/ja/System.Linq.Expressions.xml", - "ref/netstandard1.6/ko/System.Linq.Expressions.xml", - "ref/netstandard1.6/ru/System.Linq.Expressions.xml", - "ref/netstandard1.6/zh-hans/System.Linq.Expressions.xml", - "ref/netstandard1.6/zh-hant/System.Linq.Expressions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Linq.Expressions.dll" - ] - }, - "System.Net.Http/4.1.0": { - "sha512": "NVHizE8/kIoVDYOgS13OPms9iGLjKPx+qVsn63YU+ybvH2rVdr4k1SqslkWWqHxAadLuyRbTFEZAon1otlfmRA==", - "type": "package", - "path": "System.Net.Http/4.1.0", - "files": [ - "System.Net.Http.4.1.0.nupkg.sha512", - "System.Net.Http.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/Xamarinmac20/_._", - "lib/monoandroid10/_._", - "lib/monotouch10/_._", - "lib/net45/_._", - "lib/net46/System.Net.Http.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/Xamarinmac20/_._", - "ref/monoandroid10/_._", - "ref/monotouch10/_._", - "ref/net45/_._", - "ref/net46/System.Net.Http.dll", - "ref/net46/System.Net.Http.xml", - "ref/net46/de/System.Net.Http.xml", - "ref/net46/es/System.Net.Http.xml", - "ref/net46/fr/System.Net.Http.xml", - "ref/net46/it/System.Net.Http.xml", - "ref/net46/ja/System.Net.Http.xml", - "ref/net46/ko/System.Net.Http.xml", - "ref/net46/ru/System.Net.Http.xml", - "ref/net46/zh-hans/System.Net.Http.xml", - "ref/net46/zh-hant/System.Net.Http.xml", - "ref/netcore50/System.Net.Http.dll", - "ref/netcore50/System.Net.Http.xml", - "ref/netcore50/de/System.Net.Http.xml", - "ref/netcore50/es/System.Net.Http.xml", - "ref/netcore50/fr/System.Net.Http.xml", - "ref/netcore50/it/System.Net.Http.xml", - "ref/netcore50/ja/System.Net.Http.xml", - "ref/netcore50/ko/System.Net.Http.xml", - "ref/netcore50/ru/System.Net.Http.xml", - "ref/netcore50/zh-hans/System.Net.Http.xml", - "ref/netcore50/zh-hant/System.Net.Http.xml", - "ref/netstandard1.1/System.Net.Http.dll", - "ref/netstandard1.1/System.Net.Http.xml", - "ref/netstandard1.1/de/System.Net.Http.xml", - "ref/netstandard1.1/es/System.Net.Http.xml", - "ref/netstandard1.1/fr/System.Net.Http.xml", - "ref/netstandard1.1/it/System.Net.Http.xml", - "ref/netstandard1.1/ja/System.Net.Http.xml", - "ref/netstandard1.1/ko/System.Net.Http.xml", - "ref/netstandard1.1/ru/System.Net.Http.xml", - "ref/netstandard1.1/zh-hans/System.Net.Http.xml", - "ref/netstandard1.1/zh-hant/System.Net.Http.xml", - "ref/netstandard1.3/System.Net.Http.dll", - "ref/netstandard1.3/System.Net.Http.xml", - "ref/netstandard1.3/de/System.Net.Http.xml", - "ref/netstandard1.3/es/System.Net.Http.xml", - "ref/netstandard1.3/fr/System.Net.Http.xml", - "ref/netstandard1.3/it/System.Net.Http.xml", - "ref/netstandard1.3/ja/System.Net.Http.xml", - "ref/netstandard1.3/ko/System.Net.Http.xml", - "ref/netstandard1.3/ru/System.Net.Http.xml", - "ref/netstandard1.3/zh-hans/System.Net.Http.xml", - "ref/netstandard1.3/zh-hant/System.Net.Http.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll", - "runtimes/win/lib/net46/System.Net.Http.dll", - "runtimes/win/lib/netcore50/System.Net.Http.dll", - "runtimes/win/lib/netstandard1.3/System.Net.Http.dll" - ] - }, - "System.Net.Primitives/4.0.11": { - "sha512": "DXP9sbeYldg0zOcitG3doPisY6YA+RRoJFZlqE3n4/QK5M7ex51cvlcwteHpEetWQ4HKE9mXflOSd9sgR3fBiQ==", - "type": "package", - "path": "System.Net.Primitives/4.0.11", - "files": [ - "System.Net.Primitives.4.0.11.nupkg.sha512", - "System.Net.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Net.Primitives.dll", - "ref/netcore50/System.Net.Primitives.xml", - "ref/netcore50/de/System.Net.Primitives.xml", - "ref/netcore50/es/System.Net.Primitives.xml", - "ref/netcore50/fr/System.Net.Primitives.xml", - "ref/netcore50/it/System.Net.Primitives.xml", - "ref/netcore50/ja/System.Net.Primitives.xml", - "ref/netcore50/ko/System.Net.Primitives.xml", - "ref/netcore50/ru/System.Net.Primitives.xml", - "ref/netcore50/zh-hans/System.Net.Primitives.xml", - "ref/netcore50/zh-hant/System.Net.Primitives.xml", - "ref/netstandard1.0/System.Net.Primitives.dll", - "ref/netstandard1.0/System.Net.Primitives.xml", - "ref/netstandard1.0/de/System.Net.Primitives.xml", - "ref/netstandard1.0/es/System.Net.Primitives.xml", - "ref/netstandard1.0/fr/System.Net.Primitives.xml", - "ref/netstandard1.0/it/System.Net.Primitives.xml", - "ref/netstandard1.0/ja/System.Net.Primitives.xml", - "ref/netstandard1.0/ko/System.Net.Primitives.xml", - "ref/netstandard1.0/ru/System.Net.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", - "ref/netstandard1.1/System.Net.Primitives.dll", - "ref/netstandard1.1/System.Net.Primitives.xml", - "ref/netstandard1.1/de/System.Net.Primitives.xml", - "ref/netstandard1.1/es/System.Net.Primitives.xml", - "ref/netstandard1.1/fr/System.Net.Primitives.xml", - "ref/netstandard1.1/it/System.Net.Primitives.xml", - "ref/netstandard1.1/ja/System.Net.Primitives.xml", - "ref/netstandard1.1/ko/System.Net.Primitives.xml", - "ref/netstandard1.1/ru/System.Net.Primitives.xml", - "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", - "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", - "ref/netstandard1.3/System.Net.Primitives.dll", - "ref/netstandard1.3/System.Net.Primitives.xml", - "ref/netstandard1.3/de/System.Net.Primitives.xml", - "ref/netstandard1.3/es/System.Net.Primitives.xml", - "ref/netstandard1.3/fr/System.Net.Primitives.xml", - "ref/netstandard1.3/it/System.Net.Primitives.xml", - "ref/netstandard1.3/ja/System.Net.Primitives.xml", - "ref/netstandard1.3/ko/System.Net.Primitives.xml", - "ref/netstandard1.3/ru/System.Net.Primitives.xml", - "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", - "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Net.Sockets/4.1.0": { - "sha512": "m8eHuv0RQZFLEeM77E66zncjtuvx/JMoTBkcVwTzQPdXLi33TijlOPtULIxBu91qDiIMDkzFcoVpmZlpk8RSTw==", - "type": "package", - "path": "System.Net.Sockets/4.1.0", - "files": [ - "System.Net.Sockets.4.1.0.nupkg.sha512", - "System.Net.Sockets.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Net.Sockets.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Net.Sockets.dll", - "ref/netstandard1.3/System.Net.Sockets.dll", - "ref/netstandard1.3/System.Net.Sockets.xml", - "ref/netstandard1.3/de/System.Net.Sockets.xml", - "ref/netstandard1.3/es/System.Net.Sockets.xml", - "ref/netstandard1.3/fr/System.Net.Sockets.xml", - "ref/netstandard1.3/it/System.Net.Sockets.xml", - "ref/netstandard1.3/ja/System.Net.Sockets.xml", - "ref/netstandard1.3/ko/System.Net.Sockets.xml", - "ref/netstandard1.3/ru/System.Net.Sockets.xml", - "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", - "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.ObjectModel/4.0.12": { - "sha512": "5XXWb8TqSiLfQ2YRkjy2ibbe0y817j6V2OypygsC5thKZPicQc+kLj44vNTqp4AgoJ/aAd8ceCAcalPDezQpqw==", - "type": "package", - "path": "System.ObjectModel/4.0.12", - "files": [ - "System.ObjectModel.4.0.12.nupkg.sha512", - "System.ObjectModel.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.ObjectModel.dll", - "lib/netstandard1.3/System.ObjectModel.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.ObjectModel.dll", - "ref/netcore50/System.ObjectModel.xml", - "ref/netcore50/de/System.ObjectModel.xml", - "ref/netcore50/es/System.ObjectModel.xml", - "ref/netcore50/fr/System.ObjectModel.xml", - "ref/netcore50/it/System.ObjectModel.xml", - "ref/netcore50/ja/System.ObjectModel.xml", - "ref/netcore50/ko/System.ObjectModel.xml", - "ref/netcore50/ru/System.ObjectModel.xml", - "ref/netcore50/zh-hans/System.ObjectModel.xml", - "ref/netcore50/zh-hant/System.ObjectModel.xml", - "ref/netstandard1.0/System.ObjectModel.dll", - "ref/netstandard1.0/System.ObjectModel.xml", - "ref/netstandard1.0/de/System.ObjectModel.xml", - "ref/netstandard1.0/es/System.ObjectModel.xml", - "ref/netstandard1.0/fr/System.ObjectModel.xml", - "ref/netstandard1.0/it/System.ObjectModel.xml", - "ref/netstandard1.0/ja/System.ObjectModel.xml", - "ref/netstandard1.0/ko/System.ObjectModel.xml", - "ref/netstandard1.0/ru/System.ObjectModel.xml", - "ref/netstandard1.0/zh-hans/System.ObjectModel.xml", - "ref/netstandard1.0/zh-hant/System.ObjectModel.xml", - "ref/netstandard1.3/System.ObjectModel.dll", - "ref/netstandard1.3/System.ObjectModel.xml", - "ref/netstandard1.3/de/System.ObjectModel.xml", - "ref/netstandard1.3/es/System.ObjectModel.xml", - "ref/netstandard1.3/fr/System.ObjectModel.xml", - "ref/netstandard1.3/it/System.ObjectModel.xml", - "ref/netstandard1.3/ja/System.ObjectModel.xml", - "ref/netstandard1.3/ko/System.ObjectModel.xml", - "ref/netstandard1.3/ru/System.ObjectModel.xml", - "ref/netstandard1.3/zh-hans/System.ObjectModel.xml", - "ref/netstandard1.3/zh-hant/System.ObjectModel.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Reflection/4.1.0": { - "sha512": "rnrpF/BYzqOHTiX3125iEtFc4B/cGkjckdJY5Aw4VBB6okR8Wk3uFpNfXIEl5Mir7XJHjOQB3vDTGDi4xppsSA==", - "type": "package", - "path": "System.Reflection/4.1.0", - "files": [ - "System.Reflection.4.1.0.nupkg.sha512", - "System.Reflection.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Reflection.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Reflection.dll", - "ref/netcore50/System.Reflection.dll", - "ref/netcore50/System.Reflection.xml", - "ref/netcore50/de/System.Reflection.xml", - "ref/netcore50/es/System.Reflection.xml", - "ref/netcore50/fr/System.Reflection.xml", - "ref/netcore50/it/System.Reflection.xml", - "ref/netcore50/ja/System.Reflection.xml", - "ref/netcore50/ko/System.Reflection.xml", - "ref/netcore50/ru/System.Reflection.xml", - "ref/netcore50/zh-hans/System.Reflection.xml", - "ref/netcore50/zh-hant/System.Reflection.xml", - "ref/netstandard1.0/System.Reflection.dll", - "ref/netstandard1.0/System.Reflection.xml", - "ref/netstandard1.0/de/System.Reflection.xml", - "ref/netstandard1.0/es/System.Reflection.xml", - "ref/netstandard1.0/fr/System.Reflection.xml", - "ref/netstandard1.0/it/System.Reflection.xml", - "ref/netstandard1.0/ja/System.Reflection.xml", - "ref/netstandard1.0/ko/System.Reflection.xml", - "ref/netstandard1.0/ru/System.Reflection.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.xml", - "ref/netstandard1.3/System.Reflection.dll", - "ref/netstandard1.3/System.Reflection.xml", - "ref/netstandard1.3/de/System.Reflection.xml", - "ref/netstandard1.3/es/System.Reflection.xml", - "ref/netstandard1.3/fr/System.Reflection.xml", - "ref/netstandard1.3/it/System.Reflection.xml", - "ref/netstandard1.3/ja/System.Reflection.xml", - "ref/netstandard1.3/ko/System.Reflection.xml", - "ref/netstandard1.3/ru/System.Reflection.xml", - "ref/netstandard1.3/zh-hans/System.Reflection.xml", - "ref/netstandard1.3/zh-hant/System.Reflection.xml", - "ref/netstandard1.5/System.Reflection.dll", - "ref/netstandard1.5/System.Reflection.xml", - "ref/netstandard1.5/de/System.Reflection.xml", - "ref/netstandard1.5/es/System.Reflection.xml", - "ref/netstandard1.5/fr/System.Reflection.xml", - "ref/netstandard1.5/it/System.Reflection.xml", - "ref/netstandard1.5/ja/System.Reflection.xml", - "ref/netstandard1.5/ko/System.Reflection.xml", - "ref/netstandard1.5/ru/System.Reflection.xml", - "ref/netstandard1.5/zh-hans/System.Reflection.xml", - "ref/netstandard1.5/zh-hant/System.Reflection.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Reflection.Emit/4.0.1": { - "sha512": "DwiOFKZ3LZlDucdSHezsgBhkJly64vgaQGA2/V/IaYfGce+bLleEBmUFfHEEw+TD2d5v9/31NDzOI78beB4KUg==", - "type": "package", - "path": "System.Reflection.Emit/4.0.1", - "files": [ - "System.Reflection.Emit.4.0.1.nupkg.sha512", - "System.Reflection.Emit.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/net45/_._", - "lib/netcore50/System.Reflection.Emit.dll", - "lib/netstandard1.3/System.Reflection.Emit.dll", - "lib/xamarinmac20/_._", - "ref/MonoAndroid10/_._", - "ref/net45/_._", - "ref/netstandard1.1/System.Reflection.Emit.dll", - "ref/netstandard1.1/System.Reflection.Emit.xml", - "ref/netstandard1.1/de/System.Reflection.Emit.xml", - "ref/netstandard1.1/es/System.Reflection.Emit.xml", - "ref/netstandard1.1/fr/System.Reflection.Emit.xml", - "ref/netstandard1.1/it/System.Reflection.Emit.xml", - "ref/netstandard1.1/ja/System.Reflection.Emit.xml", - "ref/netstandard1.1/ko/System.Reflection.Emit.xml", - "ref/netstandard1.1/ru/System.Reflection.Emit.xml", - "ref/netstandard1.1/zh-hans/System.Reflection.Emit.xml", - "ref/netstandard1.1/zh-hant/System.Reflection.Emit.xml", - "ref/xamarinmac20/_._" - ] - }, - "System.Reflection.Emit.ILGeneration/4.0.1": { - "sha512": "+aziEgdhjyTGqr3YOLrRqmxkCp3Mrs9kCmTkATLY8K3ot04mK8b9wbu+q2N2gpgPXy4sss21pI00zBxqoktzKg==", - "type": "package", - "path": "System.Reflection.Emit.ILGeneration/4.0.1", - "files": [ - "System.Reflection.Emit.ILGeneration.4.0.1.nupkg.sha512", - "System.Reflection.Emit.ILGeneration.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net45/_._", - "lib/netcore50/System.Reflection.Emit.ILGeneration.dll", - "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll", - "lib/portable-net45+wp8/_._", - "lib/wp80/_._", - "ref/net45/_._", - "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.dll", - "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/de/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/es/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/fr/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/it/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/ja/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/ko/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/ru/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Emit.ILGeneration.xml", - "ref/portable-net45+wp8/_._", - "ref/wp80/_._", - "runtimes/aot/lib/netcore50/_._" - ] - }, - "System.Reflection.Extensions/4.0.1": { - "sha512": "ZxrxO3gVDLC9NI9O29WPqaDYwP02oX2mtjsdNWY7RJ8jGLBB581/222dX/WXJSsCUrmduEpqhJOWaQh+ZVHitQ==", - "type": "package", - "path": "System.Reflection.Extensions/4.0.1", - "files": [ - "System.Reflection.Extensions.4.0.1.nupkg.sha512", - "System.Reflection.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Reflection.Extensions.dll", - "ref/netcore50/System.Reflection.Extensions.xml", - "ref/netcore50/de/System.Reflection.Extensions.xml", - "ref/netcore50/es/System.Reflection.Extensions.xml", - "ref/netcore50/fr/System.Reflection.Extensions.xml", - "ref/netcore50/it/System.Reflection.Extensions.xml", - "ref/netcore50/ja/System.Reflection.Extensions.xml", - "ref/netcore50/ko/System.Reflection.Extensions.xml", - "ref/netcore50/ru/System.Reflection.Extensions.xml", - "ref/netcore50/zh-hans/System.Reflection.Extensions.xml", - "ref/netcore50/zh-hant/System.Reflection.Extensions.xml", - "ref/netstandard1.0/System.Reflection.Extensions.dll", - "ref/netstandard1.0/System.Reflection.Extensions.xml", - "ref/netstandard1.0/de/System.Reflection.Extensions.xml", - "ref/netstandard1.0/es/System.Reflection.Extensions.xml", - "ref/netstandard1.0/fr/System.Reflection.Extensions.xml", - "ref/netstandard1.0/it/System.Reflection.Extensions.xml", - "ref/netstandard1.0/ja/System.Reflection.Extensions.xml", - "ref/netstandard1.0/ko/System.Reflection.Extensions.xml", - "ref/netstandard1.0/ru/System.Reflection.Extensions.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Extensions.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Extensions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Reflection.Primitives/4.0.1": { - "sha512": "KY2jsN5AQHWNfVYFQ8H8sem/r86IhljZ9GsSLznlwJG3E7qMYkUIW68o3dpD/2RvAnLcPBYbjSdLOiQmsjqLog==", - "type": "package", - "path": "System.Reflection.Primitives/4.0.1", - "files": [ - "System.Reflection.Primitives.4.0.1.nupkg.sha512", - "System.Reflection.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Reflection.Primitives.dll", - "ref/netcore50/System.Reflection.Primitives.xml", - "ref/netcore50/de/System.Reflection.Primitives.xml", - "ref/netcore50/es/System.Reflection.Primitives.xml", - "ref/netcore50/fr/System.Reflection.Primitives.xml", - "ref/netcore50/it/System.Reflection.Primitives.xml", - "ref/netcore50/ja/System.Reflection.Primitives.xml", - "ref/netcore50/ko/System.Reflection.Primitives.xml", - "ref/netcore50/ru/System.Reflection.Primitives.xml", - "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", - "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", - "ref/netstandard1.0/System.Reflection.Primitives.dll", - "ref/netstandard1.0/System.Reflection.Primitives.xml", - "ref/netstandard1.0/de/System.Reflection.Primitives.xml", - "ref/netstandard1.0/es/System.Reflection.Primitives.xml", - "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", - "ref/netstandard1.0/it/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Reflection.TypeExtensions/4.1.0": { - "sha512": "x8VVvmzLSBOwduizAfCwT4bkW38ngLKsiHCLC+0xdCFkfO81B5sP6YOb4aAeXEXefgwucNdyodHFPt+jcdSVQw==", - "type": "package", - "path": "System.Reflection.TypeExtensions/4.1.0", - "files": [ - "System.Reflection.TypeExtensions.4.1.0.nupkg.sha512", - "System.Reflection.TypeExtensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Reflection.TypeExtensions.dll", - "lib/net462/System.Reflection.TypeExtensions.dll", - "lib/netcore50/System.Reflection.TypeExtensions.dll", - "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Reflection.TypeExtensions.dll", - "ref/net462/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll" - ] - }, - "System.Resources.ResourceManager/4.0.1": { - "sha512": "gMKjsYvUgWFzGnVlqCIzWtZcnf1ay3+YHda+6NT87rDOatkJg5V6XmCfPbjAySxJ9NZiI2B7BJV3hMRgohFl1Q==", - "type": "package", - "path": "System.Resources.ResourceManager/4.0.1", - "files": [ - "System.Resources.ResourceManager.4.0.1.nupkg.sha512", - "System.Resources.ResourceManager.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Resources.ResourceManager.dll", - "ref/netcore50/System.Resources.ResourceManager.xml", - "ref/netcore50/de/System.Resources.ResourceManager.xml", - "ref/netcore50/es/System.Resources.ResourceManager.xml", - "ref/netcore50/fr/System.Resources.ResourceManager.xml", - "ref/netcore50/it/System.Resources.ResourceManager.xml", - "ref/netcore50/ja/System.Resources.ResourceManager.xml", - "ref/netcore50/ko/System.Resources.ResourceManager.xml", - "ref/netcore50/ru/System.Resources.ResourceManager.xml", - "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", - "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/System.Resources.ResourceManager.dll", - "ref/netstandard1.0/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime/4.1.0": { - "sha512": "s8wL63RS5HqLkKIPScn8fcujlBF9fHJyDYOdFIOpOkrN8v7aHnH88e0va7xyCC9bc1wQgRLrses4pWoht2JHLw==", - "type": "package", - "path": "System.Runtime/4.1.0", - "files": [ - "System.Runtime.4.1.0.nupkg.sha512", - "System.Runtime.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Runtime.dll", - "lib/portable-net45+win8+wp80+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Runtime.dll", - "ref/netcore50/System.Runtime.dll", - "ref/netcore50/System.Runtime.xml", - "ref/netcore50/de/System.Runtime.xml", - "ref/netcore50/es/System.Runtime.xml", - "ref/netcore50/fr/System.Runtime.xml", - "ref/netcore50/it/System.Runtime.xml", - "ref/netcore50/ja/System.Runtime.xml", - "ref/netcore50/ko/System.Runtime.xml", - "ref/netcore50/ru/System.Runtime.xml", - "ref/netcore50/zh-hans/System.Runtime.xml", - "ref/netcore50/zh-hant/System.Runtime.xml", - "ref/netstandard1.0/System.Runtime.dll", - "ref/netstandard1.0/System.Runtime.xml", - "ref/netstandard1.0/de/System.Runtime.xml", - "ref/netstandard1.0/es/System.Runtime.xml", - "ref/netstandard1.0/fr/System.Runtime.xml", - "ref/netstandard1.0/it/System.Runtime.xml", - "ref/netstandard1.0/ja/System.Runtime.xml", - "ref/netstandard1.0/ko/System.Runtime.xml", - "ref/netstandard1.0/ru/System.Runtime.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.xml", - "ref/netstandard1.2/System.Runtime.dll", - "ref/netstandard1.2/System.Runtime.xml", - "ref/netstandard1.2/de/System.Runtime.xml", - "ref/netstandard1.2/es/System.Runtime.xml", - "ref/netstandard1.2/fr/System.Runtime.xml", - "ref/netstandard1.2/it/System.Runtime.xml", - "ref/netstandard1.2/ja/System.Runtime.xml", - "ref/netstandard1.2/ko/System.Runtime.xml", - "ref/netstandard1.2/ru/System.Runtime.xml", - "ref/netstandard1.2/zh-hans/System.Runtime.xml", - "ref/netstandard1.2/zh-hant/System.Runtime.xml", - "ref/netstandard1.3/System.Runtime.dll", - "ref/netstandard1.3/System.Runtime.xml", - "ref/netstandard1.3/de/System.Runtime.xml", - "ref/netstandard1.3/es/System.Runtime.xml", - "ref/netstandard1.3/fr/System.Runtime.xml", - "ref/netstandard1.3/it/System.Runtime.xml", - "ref/netstandard1.3/ja/System.Runtime.xml", - "ref/netstandard1.3/ko/System.Runtime.xml", - "ref/netstandard1.3/ru/System.Runtime.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.xml", - "ref/netstandard1.5/System.Runtime.dll", - "ref/netstandard1.5/System.Runtime.xml", - "ref/netstandard1.5/de/System.Runtime.xml", - "ref/netstandard1.5/es/System.Runtime.xml", - "ref/netstandard1.5/fr/System.Runtime.xml", - "ref/netstandard1.5/it/System.Runtime.xml", - "ref/netstandard1.5/ja/System.Runtime.xml", - "ref/netstandard1.5/ko/System.Runtime.xml", - "ref/netstandard1.5/ru/System.Runtime.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.xml", - "ref/portable-net45+win8+wp80+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.Extensions/4.1.0": { - "sha512": "K/RM0vBhu+8azG/jmIP3mhbv8a6DtXkQZKV6/xnBFxbY3fNpWXzVkM43jMNNH2xkE3MDKvRX1NnOspQ08NP0tw==", - "type": "package", - "path": "System.Runtime.Extensions/4.1.0", - "files": [ - "System.Runtime.Extensions.4.1.0.nupkg.sha512", - "System.Runtime.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Runtime.Extensions.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Runtime.Extensions.dll", - "ref/netcore50/System.Runtime.Extensions.dll", - "ref/netcore50/System.Runtime.Extensions.xml", - "ref/netcore50/de/System.Runtime.Extensions.xml", - "ref/netcore50/es/System.Runtime.Extensions.xml", - "ref/netcore50/fr/System.Runtime.Extensions.xml", - "ref/netcore50/it/System.Runtime.Extensions.xml", - "ref/netcore50/ja/System.Runtime.Extensions.xml", - "ref/netcore50/ko/System.Runtime.Extensions.xml", - "ref/netcore50/ru/System.Runtime.Extensions.xml", - "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", - "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", - "ref/netstandard1.0/System.Runtime.Extensions.dll", - "ref/netstandard1.0/System.Runtime.Extensions.xml", - "ref/netstandard1.0/de/System.Runtime.Extensions.xml", - "ref/netstandard1.0/es/System.Runtime.Extensions.xml", - "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", - "ref/netstandard1.0/it/System.Runtime.Extensions.xml", - "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", - "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", - "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", - "ref/netstandard1.3/System.Runtime.Extensions.dll", - "ref/netstandard1.3/System.Runtime.Extensions.xml", - "ref/netstandard1.3/de/System.Runtime.Extensions.xml", - "ref/netstandard1.3/es/System.Runtime.Extensions.xml", - "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", - "ref/netstandard1.3/it/System.Runtime.Extensions.xml", - "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", - "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", - "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", - "ref/netstandard1.5/System.Runtime.Extensions.dll", - "ref/netstandard1.5/System.Runtime.Extensions.xml", - "ref/netstandard1.5/de/System.Runtime.Extensions.xml", - "ref/netstandard1.5/es/System.Runtime.Extensions.xml", - "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", - "ref/netstandard1.5/it/System.Runtime.Extensions.xml", - "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", - "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", - "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.Handles/4.0.1": { - "sha512": "ETpDTkH5pxBFMD7QnNikWS+2GWww3PoguV/Oy4PQKukWUknD1W9cHAkfAdZ04CcHIZzD+yhrZ4sb4nH77JfwUw==", - "type": "package", - "path": "System.Runtime.Handles/4.0.1", - "files": [ - "System.Runtime.Handles.4.0.1.nupkg.sha512", - "System.Runtime.Handles.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/_._", - "ref/netstandard1.3/System.Runtime.Handles.dll", - "ref/netstandard1.3/System.Runtime.Handles.xml", - "ref/netstandard1.3/de/System.Runtime.Handles.xml", - "ref/netstandard1.3/es/System.Runtime.Handles.xml", - "ref/netstandard1.3/fr/System.Runtime.Handles.xml", - "ref/netstandard1.3/it/System.Runtime.Handles.xml", - "ref/netstandard1.3/ja/System.Runtime.Handles.xml", - "ref/netstandard1.3/ko/System.Runtime.Handles.xml", - "ref/netstandard1.3/ru/System.Runtime.Handles.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.InteropServices/4.1.0": { - "sha512": "E0XzSdHcrRIpk1jDtMV++uu3fDqUpTZWCvJoKCQzoP2T4V/BfjGzCWyqIXvp4qxQAB6iE4eLIA47FTj1iYZ5JQ==", - "type": "package", - "path": "System.Runtime.InteropServices/4.1.0", - "files": [ - "System.Runtime.InteropServices.4.1.0.nupkg.sha512", - "System.Runtime.InteropServices.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Runtime.InteropServices.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Runtime.InteropServices.dll", - "ref/netcore50/System.Runtime.InteropServices.dll", - "ref/netcore50/System.Runtime.InteropServices.xml", - "ref/netcore50/de/System.Runtime.InteropServices.xml", - "ref/netcore50/es/System.Runtime.InteropServices.xml", - "ref/netcore50/fr/System.Runtime.InteropServices.xml", - "ref/netcore50/it/System.Runtime.InteropServices.xml", - "ref/netcore50/ja/System.Runtime.InteropServices.xml", - "ref/netcore50/ko/System.Runtime.InteropServices.xml", - "ref/netcore50/ru/System.Runtime.InteropServices.xml", - "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", - "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/System.Runtime.InteropServices.dll", - "ref/netstandard1.1/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/System.Runtime.InteropServices.dll", - "ref/netstandard1.2/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/System.Runtime.InteropServices.dll", - "ref/netstandard1.3/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/System.Runtime.InteropServices.dll", - "ref/netstandard1.5/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.InteropServices.RuntimeInformation/4.0.0": { - "sha512": "TLKvhWY3+dXapQv557gdfJFEeZ6iqWCK9G3HX7BPdcbSWwIXNPN3a14w5zrCvhZ5cxneLhwLYoKBQR9ti6BZEA==", - "type": "package", - "path": "System.Runtime.InteropServices.RuntimeInformation/4.0.0", - "files": [ - "System.Runtime.InteropServices.RuntimeInformation.4.0.0.nupkg.sha512", - "System.Runtime.InteropServices.RuntimeInformation.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll", - "lib/win8/System.Runtime.InteropServices.RuntimeInformation.dll", - "lib/wpa81/System.Runtime.InteropServices.RuntimeInformation.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/win/lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/win/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll" - ] - }, - "System.Runtime.Numerics/4.0.1": { - "sha512": "SDTqtZHMaR/TBArOovyXB8qX/kWpookL0I3rmVx/BKd3Mau3cYpdk8uzSvC7L9CfF5lLWKpVZexWUEdqu20hkg==", - "type": "package", - "path": "System.Runtime.Numerics/4.0.1", - "files": [ - "System.Runtime.Numerics.4.0.1.nupkg.sha512", - "System.Runtime.Numerics.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Runtime.Numerics.dll", - "lib/netstandard1.3/System.Runtime.Numerics.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Runtime.Numerics.dll", - "ref/netcore50/System.Runtime.Numerics.xml", - "ref/netcore50/de/System.Runtime.Numerics.xml", - "ref/netcore50/es/System.Runtime.Numerics.xml", - "ref/netcore50/fr/System.Runtime.Numerics.xml", - "ref/netcore50/it/System.Runtime.Numerics.xml", - "ref/netcore50/ja/System.Runtime.Numerics.xml", - "ref/netcore50/ko/System.Runtime.Numerics.xml", - "ref/netcore50/ru/System.Runtime.Numerics.xml", - "ref/netcore50/zh-hans/System.Runtime.Numerics.xml", - "ref/netcore50/zh-hant/System.Runtime.Numerics.xml", - "ref/netstandard1.1/System.Runtime.Numerics.dll", - "ref/netstandard1.1/System.Runtime.Numerics.xml", - "ref/netstandard1.1/de/System.Runtime.Numerics.xml", - "ref/netstandard1.1/es/System.Runtime.Numerics.xml", - "ref/netstandard1.1/fr/System.Runtime.Numerics.xml", - "ref/netstandard1.1/it/System.Runtime.Numerics.xml", - "ref/netstandard1.1/ja/System.Runtime.Numerics.xml", - "ref/netstandard1.1/ko/System.Runtime.Numerics.xml", - "ref/netstandard1.1/ru/System.Runtime.Numerics.xml", - "ref/netstandard1.1/zh-hans/System.Runtime.Numerics.xml", - "ref/netstandard1.1/zh-hant/System.Runtime.Numerics.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.Serialization.Primitives/4.1.1": { - "sha512": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", - "type": "package", - "path": "System.Runtime.Serialization.Primitives/4.1.1", - "files": [ - "System.Runtime.Serialization.Primitives.4.1.1.nupkg.sha512", - "System.Runtime.Serialization.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net46/System.Runtime.Serialization.Primitives.dll", - "lib/netcore50/System.Runtime.Serialization.Primitives.dll", - "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net46/System.Runtime.Serialization.Primitives.dll", - "ref/netcore50/System.Runtime.Serialization.Primitives.dll", - "ref/netcore50/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/de/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/es/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/fr/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/it/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/ja/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/ko/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/ru/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/zh-hans/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/zh-hant/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/System.Runtime.Serialization.Primitives.dll", - "ref/netstandard1.0/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/de/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/es/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/fr/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/it/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/ja/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/ko/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/ru/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll", - "ref/netstandard1.3/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/de/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/es/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/fr/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/it/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/ja/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/ko/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/ru/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.Serialization.Primitives.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Runtime.Serialization.Primitives.dll" - ] - }, - "System.Security.Cryptography.Algorithms/4.2.0": { - "sha512": "xEQyT4yzn2SDJ+XRk8KwsyM3tTRk++pseFawznqcdnmcxAt5apYl2e/5VWx845WzNZM545s+dJHfGihnwBAI8w==", - "type": "package", - "path": "System.Security.Cryptography.Algorithms/4.2.0", - "files": [ - "System.Security.Cryptography.Algorithms.4.2.0.nupkg.sha512", - "System.Security.Cryptography.Algorithms.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.Algorithms.dll", - "lib/net461/System.Security.Cryptography.Algorithms.dll", - "lib/net463/System.Security.Cryptography.Algorithms.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.Algorithms.dll", - "ref/net461/System.Security.Cryptography.Algorithms.dll", - "ref/net463/System.Security.Cryptography.Algorithms.dll", - "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll", - "ref/netstandard1.4/System.Security.Cryptography.Algorithms.dll", - "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net461/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/netcore50/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll" - ] - }, - "System.Security.Cryptography.Encoding/4.0.0": { - "sha512": "1JDszptVGZUDhJp3aKFYf0rsFDlWG/Rzq9M2Xa5LVIGGKQH98/NUIS+Eo1Ny9O0DuEBwx6OFRSLqW/P5Y2YwRw==", - "type": "package", - "path": "System.Security.Cryptography.Encoding/4.0.0", - "files": [ - "System.Security.Cryptography.Encoding.4.0.0.nupkg.sha512", - "System.Security.Cryptography.Encoding.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.Encoding.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.Encoding.dll", - "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll", - "ref/netstandard1.3/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/de/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/es/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/fr/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/it/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/ja/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/ko/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/ru/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/zh-hans/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/zh-hant/System.Security.Cryptography.Encoding.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.Encoding.dll", - "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll" - ] - }, - "System.Security.Cryptography.Primitives/4.0.0": { - "sha512": "U/4lK4mUd3zpERQ37EqSHEAPNTfoN45QxzfBJreFxsL200vq2dw7hS68+TyF5AYvXZflcxg2iJEAp7sdmne7CQ==", - "type": "package", - "path": "System.Security.Cryptography.Primitives/4.0.0", - "files": [ - "System.Security.Cryptography.Primitives.4.0.0.nupkg.sha512", - "System.Security.Cryptography.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.Primitives.dll", - "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.Primitives.dll", - "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Security.Cryptography.X509Certificates/4.1.0": { - "sha512": "ZFuG9Tge1W5uwCKHFdVfpyynsthmMZtZX5LEha7dtHtJ4Sv5hjMboJa95ZO24nZml0JvKta3siJSUz62zfQcFA==", - "type": "package", - "path": "System.Security.Cryptography.X509Certificates/4.1.0", - "files": [ - "System.Security.Cryptography.X509Certificates.4.1.0.nupkg.sha512", - "System.Security.Cryptography.X509Certificates.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.X509Certificates.dll", - "lib/net461/System.Security.Cryptography.X509Certificates.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.X509Certificates.dll", - "ref/net461/System.Security.Cryptography.X509Certificates.dll", - "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll", - "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/de/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/es/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/fr/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/it/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/ja/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/ko/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/ru/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/zh-hans/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/zh-hant/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll", - "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/de/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/es/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/fr/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/it/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/ja/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/ko/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/ru/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/zh-hans/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/zh-hant/System.Security.Cryptography.X509Certificates.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/netcore50/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll" - ] - }, - "System.Text.Encoding/4.0.11": { - "sha512": "PZ+X6tSiY9t9IQtJy3L/bdXGrSwjxe1cIBTptJJslYK+SMaq0Cd9uFl2V89d86LEnEwcw82MZlJ1b9RNloYYNA==", - "type": "package", - "path": "System.Text.Encoding/4.0.11", - "files": [ - "System.Text.Encoding.4.0.11.nupkg.sha512", - "System.Text.Encoding.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Text.Encoding.dll", - "ref/netcore50/System.Text.Encoding.xml", - "ref/netcore50/de/System.Text.Encoding.xml", - "ref/netcore50/es/System.Text.Encoding.xml", - "ref/netcore50/fr/System.Text.Encoding.xml", - "ref/netcore50/it/System.Text.Encoding.xml", - "ref/netcore50/ja/System.Text.Encoding.xml", - "ref/netcore50/ko/System.Text.Encoding.xml", - "ref/netcore50/ru/System.Text.Encoding.xml", - "ref/netcore50/zh-hans/System.Text.Encoding.xml", - "ref/netcore50/zh-hant/System.Text.Encoding.xml", - "ref/netstandard1.0/System.Text.Encoding.dll", - "ref/netstandard1.0/System.Text.Encoding.xml", - "ref/netstandard1.0/de/System.Text.Encoding.xml", - "ref/netstandard1.0/es/System.Text.Encoding.xml", - "ref/netstandard1.0/fr/System.Text.Encoding.xml", - "ref/netstandard1.0/it/System.Text.Encoding.xml", - "ref/netstandard1.0/ja/System.Text.Encoding.xml", - "ref/netstandard1.0/ko/System.Text.Encoding.xml", - "ref/netstandard1.0/ru/System.Text.Encoding.xml", - "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", - "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", - "ref/netstandard1.3/System.Text.Encoding.dll", - "ref/netstandard1.3/System.Text.Encoding.xml", - "ref/netstandard1.3/de/System.Text.Encoding.xml", - "ref/netstandard1.3/es/System.Text.Encoding.xml", - "ref/netstandard1.3/fr/System.Text.Encoding.xml", - "ref/netstandard1.3/it/System.Text.Encoding.xml", - "ref/netstandard1.3/ja/System.Text.Encoding.xml", - "ref/netstandard1.3/ko/System.Text.Encoding.xml", - "ref/netstandard1.3/ru/System.Text.Encoding.xml", - "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", - "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Text.Encoding.Extensions/4.0.11": { - "sha512": "ZDnKxrBG3IoPjvCwicXcYJkhZD5HpYwLZbAbQDJ+bUfLiq5MdMsvrwhjingVrI5Bt8qMl8AIv5NzoRoqm0Tsxw==", - "type": "package", - "path": "System.Text.Encoding.Extensions/4.0.11", - "files": [ - "System.Text.Encoding.Extensions.4.0.11.nupkg.sha512", - "System.Text.Encoding.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Text.Encoding.Extensions.dll", - "ref/netcore50/System.Text.Encoding.Extensions.xml", - "ref/netcore50/de/System.Text.Encoding.Extensions.xml", - "ref/netcore50/es/System.Text.Encoding.Extensions.xml", - "ref/netcore50/fr/System.Text.Encoding.Extensions.xml", - "ref/netcore50/it/System.Text.Encoding.Extensions.xml", - "ref/netcore50/ja/System.Text.Encoding.Extensions.xml", - "ref/netcore50/ko/System.Text.Encoding.Extensions.xml", - "ref/netcore50/ru/System.Text.Encoding.Extensions.xml", - "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml", - "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/System.Text.Encoding.Extensions.dll", - "ref/netstandard1.0/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/System.Text.Encoding.Extensions.dll", - "ref/netstandard1.3/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Text.RegularExpressions/4.1.0": { - "sha512": "ql40bKnFB+QrdtG2TEhucDmD+bSJZfp3ufWcvUw94E1KtkZIhHJkLmbPcIyfCEdBvDSymVRCFmLgA+1riPp4Rg==", - "type": "package", - "path": "System.Text.RegularExpressions/4.1.0", - "files": [ - "System.Text.RegularExpressions.4.1.0.nupkg.sha512", - "System.Text.RegularExpressions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net463/System.Text.RegularExpressions.dll", - "lib/netcore50/System.Text.RegularExpressions.dll", - "lib/netstandard1.6/System.Text.RegularExpressions.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net463/System.Text.RegularExpressions.dll", - "ref/netcore50/System.Text.RegularExpressions.dll", - "ref/netcore50/System.Text.RegularExpressions.xml", - "ref/netcore50/de/System.Text.RegularExpressions.xml", - "ref/netcore50/es/System.Text.RegularExpressions.xml", - "ref/netcore50/fr/System.Text.RegularExpressions.xml", - "ref/netcore50/it/System.Text.RegularExpressions.xml", - "ref/netcore50/ja/System.Text.RegularExpressions.xml", - "ref/netcore50/ko/System.Text.RegularExpressions.xml", - "ref/netcore50/ru/System.Text.RegularExpressions.xml", - "ref/netcore50/zh-hans/System.Text.RegularExpressions.xml", - "ref/netcore50/zh-hant/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/System.Text.RegularExpressions.dll", - "ref/netstandard1.0/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/de/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/es/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/fr/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/it/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/ja/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/ko/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/ru/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/zh-hans/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/zh-hant/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/System.Text.RegularExpressions.dll", - "ref/netstandard1.3/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/de/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/es/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/fr/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/it/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/ja/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/ko/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/ru/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/zh-hans/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/zh-hant/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/System.Text.RegularExpressions.dll", - "ref/netstandard1.6/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/de/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/es/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/fr/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/it/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/ja/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/ko/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/ru/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/zh-hans/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/zh-hant/System.Text.RegularExpressions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Threading/4.0.11": { - "sha512": "nyxza0yI2nRw88u7WjVl4LdIhV8ASwED0huD6PPr8xSpdUhGQGlmFkv7an2MHl9ntPEUv8irR+KoSfO+K+Ekgw==", - "type": "package", - "path": "System.Threading/4.0.11", - "files": [ - "System.Threading.4.0.11.nupkg.sha512", - "System.Threading.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Threading.dll", - "lib/netstandard1.3/System.Threading.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Threading.dll", - "ref/netcore50/System.Threading.xml", - "ref/netcore50/de/System.Threading.xml", - "ref/netcore50/es/System.Threading.xml", - "ref/netcore50/fr/System.Threading.xml", - "ref/netcore50/it/System.Threading.xml", - "ref/netcore50/ja/System.Threading.xml", - "ref/netcore50/ko/System.Threading.xml", - "ref/netcore50/ru/System.Threading.xml", - "ref/netcore50/zh-hans/System.Threading.xml", - "ref/netcore50/zh-hant/System.Threading.xml", - "ref/netstandard1.0/System.Threading.dll", - "ref/netstandard1.0/System.Threading.xml", - "ref/netstandard1.0/de/System.Threading.xml", - "ref/netstandard1.0/es/System.Threading.xml", - "ref/netstandard1.0/fr/System.Threading.xml", - "ref/netstandard1.0/it/System.Threading.xml", - "ref/netstandard1.0/ja/System.Threading.xml", - "ref/netstandard1.0/ko/System.Threading.xml", - "ref/netstandard1.0/ru/System.Threading.xml", - "ref/netstandard1.0/zh-hans/System.Threading.xml", - "ref/netstandard1.0/zh-hant/System.Threading.xml", - "ref/netstandard1.3/System.Threading.dll", - "ref/netstandard1.3/System.Threading.xml", - "ref/netstandard1.3/de/System.Threading.xml", - "ref/netstandard1.3/es/System.Threading.xml", - "ref/netstandard1.3/fr/System.Threading.xml", - "ref/netstandard1.3/it/System.Threading.xml", - "ref/netstandard1.3/ja/System.Threading.xml", - "ref/netstandard1.3/ko/System.Threading.xml", - "ref/netstandard1.3/ru/System.Threading.xml", - "ref/netstandard1.3/zh-hans/System.Threading.xml", - "ref/netstandard1.3/zh-hant/System.Threading.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Threading.dll" - ] - }, - "System.Threading.Tasks/4.0.11": { - "sha512": "M3oSLlfC1MfxUReleoz2kt73sqKU03HkRyz3Sfv0sU91UhakeT8ORCT+c2GroXwP9rdGKEdnzfU5bN/ohBwUcw==", - "type": "package", - "path": "System.Threading.Tasks/4.0.11", - "files": [ - "System.Threading.Tasks.4.0.11.nupkg.sha512", - "System.Threading.Tasks.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Threading.Tasks.dll", - "ref/netcore50/System.Threading.Tasks.xml", - "ref/netcore50/de/System.Threading.Tasks.xml", - "ref/netcore50/es/System.Threading.Tasks.xml", - "ref/netcore50/fr/System.Threading.Tasks.xml", - "ref/netcore50/it/System.Threading.Tasks.xml", - "ref/netcore50/ja/System.Threading.Tasks.xml", - "ref/netcore50/ko/System.Threading.Tasks.xml", - "ref/netcore50/ru/System.Threading.Tasks.xml", - "ref/netcore50/zh-hans/System.Threading.Tasks.xml", - "ref/netcore50/zh-hant/System.Threading.Tasks.xml", - "ref/netstandard1.0/System.Threading.Tasks.dll", - "ref/netstandard1.0/System.Threading.Tasks.xml", - "ref/netstandard1.0/de/System.Threading.Tasks.xml", - "ref/netstandard1.0/es/System.Threading.Tasks.xml", - "ref/netstandard1.0/fr/System.Threading.Tasks.xml", - "ref/netstandard1.0/it/System.Threading.Tasks.xml", - "ref/netstandard1.0/ja/System.Threading.Tasks.xml", - "ref/netstandard1.0/ko/System.Threading.Tasks.xml", - "ref/netstandard1.0/ru/System.Threading.Tasks.xml", - "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", - "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", - "ref/netstandard1.3/System.Threading.Tasks.dll", - "ref/netstandard1.3/System.Threading.Tasks.xml", - "ref/netstandard1.3/de/System.Threading.Tasks.xml", - "ref/netstandard1.3/es/System.Threading.Tasks.xml", - "ref/netstandard1.3/fr/System.Threading.Tasks.xml", - "ref/netstandard1.3/it/System.Threading.Tasks.xml", - "ref/netstandard1.3/ja/System.Threading.Tasks.xml", - "ref/netstandard1.3/ko/System.Threading.Tasks.xml", - "ref/netstandard1.3/ru/System.Threading.Tasks.xml", - "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", - "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Threading.Tasks.Extensions/4.0.0": { - "sha512": "QDFX4+HETEOgQxlGzdxqbyqluB0MKcwuFgpP4b5D7PqbPor/XVP/kxV2qE8jC0txl+edC1dRAHVl8c6pJ8piZg==", - "type": "package", - "path": "System.Threading.Tasks.Extensions/4.0.0", - "files": [ - "System.Threading.Tasks.Extensions.4.0.0.nupkg.sha512", - "System.Threading.Tasks.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", - "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", - "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", - "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml" - ] - }, - "System.Threading.Timer/4.0.1": { - "sha512": "v7x1ryDOJAWDILadVIEj6ejTAPz92SRzihqDfqr5uq32GMB2OjDlQi1xpO+0+X7pBszYXAO887ygBtK27hyusg==", - "type": "package", - "path": "System.Threading.Timer/4.0.1", - "files": [ - "System.Threading.Timer.4.0.1.nupkg.sha512", - "System.Threading.Timer.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net451/_._", - "lib/portable-net451+win81+wpa81/_._", - "lib/win81/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net451/_._", - "ref/netcore50/System.Threading.Timer.dll", - "ref/netcore50/System.Threading.Timer.xml", - "ref/netcore50/de/System.Threading.Timer.xml", - "ref/netcore50/es/System.Threading.Timer.xml", - "ref/netcore50/fr/System.Threading.Timer.xml", - "ref/netcore50/it/System.Threading.Timer.xml", - "ref/netcore50/ja/System.Threading.Timer.xml", - "ref/netcore50/ko/System.Threading.Timer.xml", - "ref/netcore50/ru/System.Threading.Timer.xml", - "ref/netcore50/zh-hans/System.Threading.Timer.xml", - "ref/netcore50/zh-hant/System.Threading.Timer.xml", - "ref/netstandard1.2/System.Threading.Timer.dll", - "ref/netstandard1.2/System.Threading.Timer.xml", - "ref/netstandard1.2/de/System.Threading.Timer.xml", - "ref/netstandard1.2/es/System.Threading.Timer.xml", - "ref/netstandard1.2/fr/System.Threading.Timer.xml", - "ref/netstandard1.2/it/System.Threading.Timer.xml", - "ref/netstandard1.2/ja/System.Threading.Timer.xml", - "ref/netstandard1.2/ko/System.Threading.Timer.xml", - "ref/netstandard1.2/ru/System.Threading.Timer.xml", - "ref/netstandard1.2/zh-hans/System.Threading.Timer.xml", - "ref/netstandard1.2/zh-hant/System.Threading.Timer.xml", - "ref/portable-net451+win81+wpa81/_._", - "ref/win81/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Xml.ReaderWriter/4.0.11": { - "sha512": "0aI0a6QDlcnqhfQ9lGcAVBRsSFS1FrDMapRo+R2oVHHRvyj5fYXSi9nR5p27JS+k8By1AXDHO56QjGwRPqBwXA==", - "type": "package", - "path": "System.Xml.ReaderWriter/4.0.11", - "files": [ - "System.Xml.ReaderWriter.4.0.11.nupkg.sha512", - "System.Xml.ReaderWriter.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Xml.ReaderWriter.dll", - "lib/netstandard1.3/System.Xml.ReaderWriter.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Xml.ReaderWriter.dll", - "ref/netcore50/System.Xml.ReaderWriter.xml", - "ref/netcore50/de/System.Xml.ReaderWriter.xml", - "ref/netcore50/es/System.Xml.ReaderWriter.xml", - "ref/netcore50/fr/System.Xml.ReaderWriter.xml", - "ref/netcore50/it/System.Xml.ReaderWriter.xml", - "ref/netcore50/ja/System.Xml.ReaderWriter.xml", - "ref/netcore50/ko/System.Xml.ReaderWriter.xml", - "ref/netcore50/ru/System.Xml.ReaderWriter.xml", - "ref/netcore50/zh-hans/System.Xml.ReaderWriter.xml", - "ref/netcore50/zh-hant/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/System.Xml.ReaderWriter.dll", - "ref/netstandard1.0/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/de/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/es/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/fr/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/it/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/ja/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/ko/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/ru/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/zh-hans/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/zh-hant/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/System.Xml.ReaderWriter.dll", - "ref/netstandard1.3/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/de/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/es/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/fr/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/it/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/ja/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/ko/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/ru/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/zh-hans/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/zh-hant/System.Xml.ReaderWriter.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Xml.XDocument/4.0.11": { - "sha512": "ho0Eab1wTiBEZUrB/bScAMMsrQOwnhPf/EC/Egi4/llbY6CQlEbZSL2vUOSOXJUuB9tMQHn1zducOHTlHLS6QA==", - "type": "package", - "path": "System.Xml.XDocument/4.0.11", - "files": [ - "System.Xml.XDocument.4.0.11.nupkg.sha512", - "System.Xml.XDocument.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Xml.XDocument.dll", - "lib/netstandard1.3/System.Xml.XDocument.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Xml.XDocument.dll", - "ref/netcore50/System.Xml.XDocument.xml", - "ref/netcore50/de/System.Xml.XDocument.xml", - "ref/netcore50/es/System.Xml.XDocument.xml", - "ref/netcore50/fr/System.Xml.XDocument.xml", - "ref/netcore50/it/System.Xml.XDocument.xml", - "ref/netcore50/ja/System.Xml.XDocument.xml", - "ref/netcore50/ko/System.Xml.XDocument.xml", - "ref/netcore50/ru/System.Xml.XDocument.xml", - "ref/netcore50/zh-hans/System.Xml.XDocument.xml", - "ref/netcore50/zh-hant/System.Xml.XDocument.xml", - "ref/netstandard1.0/System.Xml.XDocument.dll", - "ref/netstandard1.0/System.Xml.XDocument.xml", - "ref/netstandard1.0/de/System.Xml.XDocument.xml", - "ref/netstandard1.0/es/System.Xml.XDocument.xml", - "ref/netstandard1.0/fr/System.Xml.XDocument.xml", - "ref/netstandard1.0/it/System.Xml.XDocument.xml", - "ref/netstandard1.0/ja/System.Xml.XDocument.xml", - "ref/netstandard1.0/ko/System.Xml.XDocument.xml", - "ref/netstandard1.0/ru/System.Xml.XDocument.xml", - "ref/netstandard1.0/zh-hans/System.Xml.XDocument.xml", - "ref/netstandard1.0/zh-hant/System.Xml.XDocument.xml", - "ref/netstandard1.3/System.Xml.XDocument.dll", - "ref/netstandard1.3/System.Xml.XDocument.xml", - "ref/netstandard1.3/de/System.Xml.XDocument.xml", - "ref/netstandard1.3/es/System.Xml.XDocument.xml", - "ref/netstandard1.3/fr/System.Xml.XDocument.xml", - "ref/netstandard1.3/it/System.Xml.XDocument.xml", - "ref/netstandard1.3/ja/System.Xml.XDocument.xml", - "ref/netstandard1.3/ko/System.Xml.XDocument.xml", - "ref/netstandard1.3/ru/System.Xml.XDocument.xml", - "ref/netstandard1.3/zh-hans/System.Xml.XDocument.xml", - "ref/netstandard1.3/zh-hant/System.Xml.XDocument.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - } - }, - "projectFileDependencyGroups": { - "": [], - ".NETFramework,Version=v4.0,Profile=Client": [ - "Microsoft.Net.Http >= 2.2.29", - "Newtonsoft.Json >= 9.0.1" - ], - ".NETFramework,Version=v4.5": [ - "Newtonsoft.Json >= 9.0.1", - "System.Net.Http >= 4.0.0", - "System.Security >= 4.0.0" - ], - ".NETFramework,Version=v4.5.1": [ - "Newtonsoft.Json >= 9.0.1", - "System.Net.Http >= 4.0.0", - "System.Security >= 4.0.0" - ], - ".NETPortable,Version=v4.5,Profile=Profile111": [ - "Newtonsoft.Json >= 9.0.1", - "System.Collections", - "System.ComponentModel", - "System.Diagnostics.Debug", - "System.Dynamic.Runtime", - "System.Globalization", - "System.IO", - "System.Linq", - "System.Linq.Expressions", - "System.Linq.Queryable", - "System.Net", - "System.Net.Http", - "System.Net.Primitives", - "System.Net.Requests", - "System.ObjectModel", - "System.Reflection", - "System.Reflection.Extensions", - "System.Runtime", - "System.Runtime.Extensions", - "System.Text.Encoding", - "System.Text.RegularExpressions", - "System.Threading", - "System.Threading.Tasks", - "mscorlib" - ], - ".NETStandard,Version=v1.3": [ - "NETStandard.Library >= 1.6.0", - "Newtonsoft.Json >= 9.0.1" - ] - }, - "tools": {}, - "projectFileToolGroups": {} -} \ No newline at end of file diff --git a/tools/NuGet/nuget.exe b/tools/NuGet/nuget.exe deleted file mode 100644 index 3ffdd33c6106bb292523c979289efb2b30220df5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659904 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%0DUM827xxU9P%WYnzkYEv&Q7ib|J&WA5|Z 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 v){veq_9Y58 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

dRfRo6H&-O6G_NG6G6y86FJC06EVm@6Di0* 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

S>iHS|@46sMM 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%0Dbb%>LJ;tb|o`Kp8Evufeht>W*BXmS?4^&TB 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%0A{4Qko^d0b`ex!LBAWYhRF*1EWi7u)hrY#_Gf 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 z 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 diff --git a/tools/dnv.exe b/tools/dnv.exe deleted file mode 100644 index 227ee01d4a96d08ea3cd59508aae031668da03c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 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 Re;@iQRJ;HC^Zz>z{7(|x^iu!;