protected static TransferLocation GetSourceDirectoryTransferLocation(TransferLocation dirLocation, string relativePath)
        {
            if (dirLocation.Type == TransferLocationType.AzureFileDirectory)
            {
                AzureFileDirectoryLocation azureFileDirLocation = dirLocation as AzureFileDirectoryLocation;
                var destDirectory = azureFileDirLocation.FileDirectory.GetDirectoryReference(relativePath);

                AzureFileDirectoryLocation azureFileLocation = new AzureFileDirectoryLocation(destDirectory);
                azureFileLocation.FileRequestOptions = azureFileDirLocation.FileRequestOptions;

                return(azureFileLocation);
            }
            else if (dirLocation.Type == TransferLocationType.LocalDirectory)
            {
                DirectoryLocation localDirLocation = dirLocation as DirectoryLocation;
                var destDirectory = Path.Combine(localDirLocation.DirectoryPath, relativePath);

                DirectoryLocation localSubDirLocation = new DirectoryLocation(destDirectory);

                return(localSubDirLocation);
            }
            else
            {
                // For now, HierarchyDirectoryTransfer should only be used when source is Azure File Directory.
                throw new ArgumentException("TransferLocationType");
            }
        }
Esempio n. 2
0
        protected static TransferLocation GetSourceTransferLocation(TransferLocation dirLocation, TransferEntry entry)
        {
            switch (dirLocation.Type)
            {
            case TransferLocationType.AzureBlobDirectory:
                AzureBlobDirectoryLocation azureBlobDirLocation = dirLocation as AzureBlobDirectoryLocation;
                AzureBlobEntry             azureBlobEntry       = entry as AzureBlobEntry;

                AzureBlobLocation azureBlobLocation = new AzureBlobLocation(azureBlobEntry.Blob);
                azureBlobLocation.BlobRequestOptions = azureBlobDirLocation.BlobRequestOptions;

                return(azureBlobLocation);

            case TransferLocationType.AzureFileDirectory:
                AzureFileDirectoryLocation azureFileDirLocation = dirLocation as AzureFileDirectoryLocation;
                AzureFileEntry             azureFileEntry       = entry as AzureFileEntry;

                AzureFileLocation azureFileLocation = new AzureFileLocation(azureFileEntry.File);
                azureFileLocation.FileRequestOptions = azureFileDirLocation.FileRequestOptions;

                return(azureFileLocation);

            case TransferLocationType.LocalDirectory:
                FileEntry fileEntry = entry as FileEntry;

                return(new FileLocation(fileEntry.FullPath, fileEntry.RelativePath));

            default:
                throw new ArgumentException("TransferLocationType");
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Transfer"/> class.
 /// </summary>
 /// <param name="source">Transfer source.</param>
 /// <param name="dest">Transfer destination.</param>
 /// <param name="transferMethod">Transfer method, see <see cref="TransferMethod"/> for detail available methods.</param>
 public Transfer(TransferLocation source, TransferLocation dest, TransferMethod transferMethod)
 {
     this.Source                = source;
     this.Destination           = dest;
     this.TransferMethod        = transferMethod;
     this.ProgressTracker       = new TransferProgressTracker();
     this.OriginalFormatVersion = Constants.FormatVersion;
 }
        // Summary:
        //     Determines whether the specified transfer location is equal to the current transfer location.
        //
        // Parameters:
        //   obj:
        //     The transfer location to compare with the current transfer location.
        //
        // Returns:
        //     true if the specified transfer location is equal to the current transfer location; otherwise, false.
        public override bool Equals(object obj)
        {
            TransferLocation location = obj as TransferLocation;

            if (location == null || this.Type != location.Type)
            {
                return(false);
            }

            return(this.ToString() == location.ToString());
        }
Esempio n. 5
0
        internal SingleObjectTransfer CreateTransfer(TransferEntry entry)
        {
            TransferLocation sourceLocation = GetSourceTransferLocation(this.Source, entry);

            sourceLocation.IsInstanceInfoFetched = true;
            TransferLocation destLocation = GetDestinationTransferLocation(this.Destination, entry);
            var transferMethod            = IsDummyCopy(entry) ? TransferMethod.DummyCopy : this.TransferMethod;
            SingleObjectTransfer transfer = new SingleObjectTransfer(sourceLocation, destLocation, transferMethod);

            transfer.Context = this.Context;
            return(transfer);
        }
Esempio n. 6
0
 private static void UpdateCredentials(TransferLocation dirLocation, TransferLocation subLocation)
 {
     if (dirLocation.Type == TransferLocationType.AzureBlobDirectory)
     {
         AzureBlobDirectoryLocation blobDirectoryLocation = dirLocation as AzureBlobDirectoryLocation;
         (subLocation as AzureBlobLocation).UpdateCredentials(blobDirectoryLocation.BlobDirectory.ServiceClient.Credentials);
     }
     else if (dirLocation.Type == TransferLocationType.AzureFileDirectory)
     {
         AzureFileDirectoryLocation fileDirectoryLocation = dirLocation as AzureFileDirectoryLocation;
         (subLocation as AzureFileLocation).UpdateCredentials(fileDirectoryLocation.FileDirectory.ServiceClient.Credentials);
     }
 }
Esempio n. 7
0
        private static INameResolver GetNameResolver(TransferLocation sourceLocation, TransferLocation destLocation, char?delimiter)
        {
            Debug.Assert(sourceLocation != null, "sourceLocation");
            Debug.Assert(destLocation != null, "destLocation");

            switch (sourceLocation.Type)
            {
            case TransferLocationType.AzureBlobDirectory:
                if (destLocation.Type == TransferLocationType.AzureBlobDirectory)
                {
                    return(new AzureBlobToAzureBlobNameResolver());
                }
                else if (destLocation.Type == TransferLocationType.AzureFileDirectory)
                {
                    return(new AzureBlobToAzureFileNameResolver(delimiter));
                }
                else if (destLocation.Type == TransferLocationType.LocalDirectory)
                {
                    return(new AzureToFileNameResolver(delimiter));
                }
                break;

            case TransferLocationType.AzureFileDirectory:
                if (destLocation.Type == TransferLocationType.AzureBlobDirectory ||
                    destLocation.Type == TransferLocationType.AzureFileDirectory)
                {
                    return(new AzureFileToAzureNameResolver());
                }
                else if (destLocation.Type == TransferLocationType.LocalDirectory)
                {
                    return(new AzureToFileNameResolver(null));
                }
                break;

            case TransferLocationType.LocalDirectory:
                if (destLocation.Type == TransferLocationType.AzureBlobDirectory)
                {
                    return(new FileToAzureBlobNameResolver());
                }
                else if (destLocation.Type == TransferLocationType.AzureFileDirectory)
                {
                    return(new FileToAzureFileNameResolver());
                }
                break;

            default:
                throw new ArgumentException("Unsupported source location", "sourceLocation");
            }

            throw new ArgumentException("Unsupported destination location", "destLocation");
        }
Esempio n. 8
0
        /// <summary>
        /// Gets a transfer with the specified source location, destination location and transfer method.
        /// </summary>
        /// <param name="sourceLocation">Source location of the transfer.</param>
        /// <param name="destLocation">Destination location of the transfer.</param>
        /// <param name="transferMethod">Transfer method.</param>
        /// <returns>A transfer that matches the specified source location, destination location and transfer method; Or null if no matches.</returns>
        public Transfer GetTransfer(TransferLocation sourceLocation, TransferLocation destLocation, TransferMethod transferMethod)
        {
            Transfer transfer = null;

            if (this.transfers.TryGetValue(new TransferKey(sourceLocation, destLocation), out transfer))
            {
                if (transfer.TransferMethod == transferMethod)
                {
                    return(transfer);
                }
            }

            return(null);
        }
 internal void GetSubDirLocation(string relativePath, out TransferLocation sourceLocation, out TransferLocation destLocation)
 {
     if (string.IsNullOrEmpty(relativePath))
     {
         sourceLocation = this.Source;
         destLocation   = this.Destination;
         return;
     }
     else
     {
         var transferEntry = CreateDirectoryTransferEntry(relativePath);
         sourceLocation = GetSourceDirectoryTransferLocation(this.Source, relativePath);
         destLocation   = GetDestinationSubDirTransferLocation(this.Destination, transferEntry);
     }
 }
        /// <summary>
        /// Creates the default request options for specific location.
        /// </summary>
        /// <param name="location">The location <see cref="TransferLocation"/> which needs get a default request options.</param>
        /// <returns>The default request options which implements <see cref="IRequestOptions"/> for specific location.</returns>
        internal static IRequestOptions CreateDefaultRequestOptions(TransferLocation location)
        {
            if (null == location)
            {
                throw new ArgumentNullException(nameof(location));
            }

            IRequestOptions requestOptions;

            switch (location.Type)
            {
            case TransferLocationType.AzureBlob:
                requestOptions = ((AzureBlobLocation)location).Blob.Uri.Scheme == Uri.UriSchemeHttps
                        ? DefaultHttpsBlobRequestOptions
                        : DefaultBlobRequestOptions;
                break;

            case TransferLocationType.AzureBlobDirectory:
                requestOptions = ((AzureBlobDirectoryLocation)location).BlobDirectory.Uri.Scheme == Uri.UriSchemeHttps
                        ? DefaultHttpsBlobRequestOptions
                        : DefaultBlobRequestOptions;
                break;

            case TransferLocationType.AzureFile:
                requestOptions = ((AzureFileLocation)location).AzureFile.Uri.Scheme == Uri.UriSchemeHttps
                        ? DefaultHttpsFileRequestOptions
                        : DefaultFileRequestOptions;
                break;

            case TransferLocationType.AzureFileDirectory:
                requestOptions = ((AzureFileDirectoryLocation)location).FileDirectory.Uri.Scheme == Uri.UriSchemeHttps
                        ? DefaultHttpsFileRequestOptions
                        : DefaultFileRequestOptions;
                break;

            default:
                throw new ArgumentException(
                          string.Format(
                              CultureInfo.CurrentCulture,
                              "{0} is invalid, cannot get IRequestOptions for location type {1}",
                              nameof(location),
                              location.Type));
            }

            return(requestOptions);
        }
Esempio n. 11
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SingleObjectTransfer"/> class.
        /// This constructor will check whether source and destination is valid for the operation:
        /// Uri is only valid for non-staging copy.
        /// cannot copy from local file/stream to local file/stream
        /// </summary>
        /// <param name="source">Transfer source.</param>
        /// <param name="dest">Transfer destination.</param>
        /// <param name="transferMethod">Transfer method, see <see cref="TransferMethod"/> for detail available methods.</param>
        public SingleObjectTransfer(TransferLocation source, TransferLocation dest, TransferMethod transferMethod)
            : base(source, dest, transferMethod)
        {
            Debug.Assert(source != null && dest != null);
            Debug.Assert(
                source.Type == TransferLocationType.FilePath || source.Type == TransferLocationType.Stream ||
                source.Type == TransferLocationType.AzureBlob || source.Type == TransferLocationType.AzureFile ||
                source.Type == TransferLocationType.SourceUri);
            Debug.Assert(
                dest.Type == TransferLocationType.FilePath || dest.Type == TransferLocationType.Stream ||
                dest.Type == TransferLocationType.AzureBlob || dest.Type == TransferLocationType.AzureFile ||
                dest.Type == TransferLocationType.SourceUri);
            Debug.Assert(!((source.Type == TransferLocationType.FilePath || source.Type == TransferLocationType.Stream) &&
                           (dest.Type == TransferLocationType.FilePath || dest.Type == TransferLocationType.Stream)));

            if (source.Type == TransferLocationType.AzureBlob && dest.Type == TransferLocationType.AzureBlob)
            {
                CloudBlob sourceBlob = (source as AzureBlobLocation).Blob;
                CloudBlob destBlob   = (dest as AzureBlobLocation).Blob;
                if (sourceBlob.BlobType != destBlob.BlobType)
                {
                    throw new InvalidOperationException(Resources.SourceAndDestinationBlobTypeDifferent);
                }

                if (StorageExtensions.Equals(sourceBlob, destBlob))
                {
                    throw new InvalidOperationException(Resources.SourceAndDestinationLocationCannotBeEqualException);
                }
            }

            if (source.Type == TransferLocationType.AzureFile && dest.Type == TransferLocationType.AzureFile)
            {
                CloudFile sourceFile = (source as AzureFileLocation).AzureFile;
                CloudFile destFile   = (dest as AzureFileLocation).AzureFile;
                if (string.Equals(sourceFile.SnapshotQualifiedUri.Host, destFile.SnapshotQualifiedUri.Host, StringComparison.OrdinalIgnoreCase) &&
                    string.Equals(sourceFile.SnapshotQualifiedUri.PathAndQuery, destFile.SnapshotQualifiedUri.PathAndQuery, StringComparison.OrdinalIgnoreCase))
                {
                    throw new InvalidOperationException(Resources.SourceAndDestinationLocationCannotBeEqualException);
                }
            }

            this.transferJob = new TransferJob(this);
        }
        protected TransferLocation GetDestinationSubDirTransferLocation(TransferLocation dirLocation, TransferEntry entry)
        {
            string destRelativePath = this.NameResolver.ResolveName(entry);

            switch (dirLocation.Type)
            {
            case TransferLocationType.AzureBlobDirectory:
            {
                AzureBlobDirectoryLocation blobDirLocation = dirLocation as AzureBlobDirectoryLocation;
                BlobType destBlobType = this.BlobType;

                // TODO: should handle blob type here.
                AzureBlobDirectoryLocation retLocation = new AzureBlobDirectoryLocation(blobDirLocation.BlobDirectory.GetDirectoryReference(destRelativePath));
                retLocation.BlobRequestOptions = blobDirLocation.BlobRequestOptions;
                return(retLocation);
            }

            case TransferLocationType.AzureFileDirectory:
            {
                AzureFileDirectoryLocation fileDirLocation = dirLocation as AzureFileDirectoryLocation;
                CloudFileDirectory         azureDirectory  = fileDirLocation.FileDirectory.GetDirectoryReference(destRelativePath);

                AzureFileDirectoryLocation retLocation = new AzureFileDirectoryLocation(azureDirectory);
                retLocation.FileRequestOptions = fileDirLocation.FileRequestOptions;
                return(retLocation);
            }

            case TransferLocationType.LocalDirectory:
            {
                DirectoryLocation localDirLocation = dirLocation as DirectoryLocation;
                string            path             = LongPath.Combine(localDirLocation.DirectoryPath, destRelativePath);

                return(new DirectoryLocation(path));
            }

            default:
                throw new ArgumentException("TransferLocationType");
            }
        }
Esempio n. 13
0
        protected TransferLocation GetDestTransferLocationForEmptyDir(TransferLocation dirLocation, TransferEntry entry)
        {
            string destRelativePath = this.nameResolver.ResolveName(entry);

            AzureBlobEntry sourceBlobEntry = entry as AzureBlobEntry;

            switch (dirLocation.Type)
            {
            case TransferLocationType.AzureBlobDirectory:
            {
                return(null);
            }

            case TransferLocationType.AzureFileDirectory:
            {
                AzureFileDirectoryLocation fileDirLocation = dirLocation as AzureFileDirectoryLocation;
                CloudFileDirectory         destDirLocation = fileDirLocation.FileDirectory;

                if (!string.IsNullOrEmpty(destRelativePath))
                {
                    destDirLocation = destDirLocation.GetDirectoryReference(destRelativePath);
                }

                AzureFileDirectoryLocation retLocation = new AzureFileDirectoryLocation(destDirLocation);
                retLocation.FileRequestOptions = fileDirLocation.FileRequestOptions;
                return(retLocation);
            }

            case TransferLocationType.LocalDirectory:
            {
                return(null);
            }

            default:
                throw new ArgumentException("TransferLocationType");
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="MultipleObjectsTransfer"/> class.
 /// </summary>
 /// <param name="source">Transfer source.</param>
 /// <param name="dest">Transfer destination.</param>
 /// <param name="transferMethod">Transfer method, see <see cref="TransferMethod"/> for detail available methods.</param>
 public MultipleObjectsTransfer(TransferLocation source, TransferLocation dest, TransferMethod transferMethod)
     : base(source, dest, transferMethod)
 {
     this.subTransfers = new TransferCollection <SingleObjectTransfer>();
     this.subTransfers.OverallProgressTracker.Parent = this.ProgressTracker;
 }
Esempio n. 15
0
 public SerializableTransferLocation(TransferLocation location)
 {
     this.Location = location;
 }
 /// <summary>
 /// Gets a transfer with the specified source location, destination location and transfer method.
 /// </summary>
 /// <param name="sourceLocation">Source location of the transfer.</param>
 /// <param name="destLocation">Destination location of the transfer.</param>
 /// <param name="transferMethod">Transfer method.</param>
 /// <returns>A transfer that matches the specified source location, destination location and transfer method; Or null if no matches.</returns>
 internal Transfer GetTransfer(TransferLocation sourceLocation, TransferLocation destLocation, TransferMethod transferMethod)
 {
     return(this.TransferCollection.GetTransfer(sourceLocation, destLocation, transferMethod));
 }
Esempio n. 17
0
        protected TransferLocation GetDestinationTransferLocation(TransferLocation dirLocation, TransferEntry entry)
        {
            string destRelativePath = this.nameResolver.ResolveName(entry);

            AzureBlobEntry sourceBlobEntry = entry as AzureBlobEntry;

            switch (dirLocation.Type)
            {
            case TransferLocationType.AzureBlobDirectory:
            {
                AzureBlobDirectoryLocation blobDirLocation = dirLocation as AzureBlobDirectoryLocation;
                BlobType destBlobType = this.BlobType;

                if (sourceBlobEntry != null)
                {
                    // if source is Azure blob storage, source and destination blob share the same blob type
                    destBlobType = sourceBlobEntry.Blob.BlobType;
                }

                CloudBlob blob = null;
                switch (destBlobType)
                {
                case Blob.BlobType.BlockBlob:
                case Blob.BlobType.Unspecified:
                    blob = blobDirLocation.BlobDirectory.GetBlockBlobReference(destRelativePath);
                    break;

                case Blob.BlobType.PageBlob:
                    blob = blobDirLocation.BlobDirectory.GetPageBlobReference(destRelativePath);
                    break;

                case Blob.BlobType.AppendBlob:
                    blob = blobDirLocation.BlobDirectory.GetAppendBlobReference(destRelativePath);
                    break;
                }

                AzureBlobLocation retLocation = new AzureBlobLocation(blob);
                retLocation.BlobRequestOptions = blobDirLocation.BlobRequestOptions;
                return(retLocation);
            }

            case TransferLocationType.AzureFileDirectory:
            {
                AzureFileDirectoryLocation fileDirLocation = dirLocation as AzureFileDirectoryLocation;
                CloudFile file = fileDirLocation.FileDirectory.GetFileReference(destRelativePath);

                AzureFileLocation retLocation = new AzureFileLocation(file);
                retLocation.FileRequestOptions = fileDirLocation.FileRequestOptions;
                return(retLocation);
            }

            case TransferLocationType.LocalDirectory:
            {
                DirectoryLocation localDirLocation = dirLocation as DirectoryLocation;
                string            path             = Path.Combine(localDirLocation.DirectoryPath, destRelativePath);

                return(new FileLocation(path, destRelativePath));
            }

            default:
                throw new ArgumentException("TransferLocationType");
            }
        }
Esempio n. 18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DirectoryTransfer"/> class.
 /// </summary>
 /// <param name="source">Transfer source.</param>
 /// <param name="dest">Transfer destination.</param>
 /// <param name="transferMethod">Transfer method, see <see cref="TransferMethod"/> for detail available methods.</param>
 public DirectoryTransfer(TransferLocation source, TransferLocation dest, TransferMethod transferMethod)
     : base(source, dest, transferMethod)
 {
 }