/*
 * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 * 
 *  http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;
using System.IO;
using Amazon.Runtime;
using Amazon.Runtime.Internal;
namespace Amazon.S3.Model
{
    /// 
    /// Container for the parameters to the CopyPart operation.
    /// Uploads a part by copying data from an existing object as data source.
    /// 
    public partial class CopyPartRequest : AmazonWebServiceRequest
    {
        private string srcBucket;
        private string srcKey;
        private string srcVersionId;
        private string dstBucket;
        private string dstKey;
        private string uploadId;
        private List etagsToMatch;
        private List etagsToNotMatch;
        private DateTime? modifiedSinceDate;
        private DateTime? unmodifiedSinceDate;
        private int? partNumber;
        private long? firstByte;
        private long? lastByte;
        [Obsolete("Use ServerSideEncryptionMethod in InitiateMultipartUploadRequest instead.")]
        private ServerSideEncryptionMethod serverSideEncryption;
        private ServerSideEncryptionCustomerMethod serverSideCustomerEncryption;
        private string serverSideEncryptionCustomerProvidedKey;
        private string serverSideEncryptionCustomerProvidedKeyMD5;
        [Obsolete("Use ServerSideEncryptionKeyManagementServiceKeyId in InitiateMultipartUploadRequest instead.")]
        private string serverSideEncryptionKeyManagementServiceKeyId;
        private ServerSideEncryptionCustomerMethod copySourceServerSideCustomerEncryption;
        private string copySourceServerSideEncryptionCustomerProvidedKey;
        private string copySourceServerSideEncryptionCustomerProvidedKeyMD5;
        /// 
        /// The name of the bucket containing the object to copy.
        /// 
        public string SourceBucket
        {
            get { return this.srcBucket; }
            set { this.srcBucket = value; }
        }
        /// 
        /// Checks if SourceBucket property is set.
        /// 
        /// true if SourceBucket property is set.
        internal bool IsSetSourceBucket()
        {
            return !System.String.IsNullOrEmpty(this.srcBucket);
        }
        /// 
        /// The key of the object to copy.
        /// 
        public string SourceKey
        {
            get { return this.srcKey; }
            set { this.srcKey = value; }
        }
        /// 
        /// Checks if SourceKey property is set.
        /// 
        /// true if SourceKey property is set.
        internal bool IsSetSourceKey()
        {
            return !System.String.IsNullOrEmpty(this.srcKey);
        }
        /// 
        /// Specifies a particular version of the source object to copy. By default the latest version is copied.
        /// 
        public string SourceVersionId
        {
            get { return this.srcVersionId; }
            set { this.srcVersionId = value; }
        }
        /// 
        /// Checks if SourceVersionId property is set.
        /// 
        /// true if SourceVersionId property is set.
        internal bool IsSetSourceVersionId()
        {
            return !System.String.IsNullOrEmpty(this.srcVersionId);
        }
        /// 
        /// The name of the bucket to contain the copy of the source object.
        /// 
        public string DestinationBucket
        {
            get { return this.dstBucket; }
            set { this.dstBucket = value; }
        }
        /// 
        /// Checks if DestinationBucket property is set.
        /// 
        /// true if DestinationBucket property is set.
        internal bool IsSetDestinationBucket()
        {
            return !System.String.IsNullOrEmpty(this.dstBucket);
        }
        /// 
        /// The key to be given to the copy of the source object.
        /// 
        public string DestinationKey
        {
            get { return this.dstKey; }
            set { this.dstKey = value; }
        }
        /// 
        /// Checks if DestinationKey property is set.
        /// 
        /// true if DestinationKey property is set.
        internal bool IsSetDestinationKey()
        {
            return !System.String.IsNullOrEmpty(this.dstKey);
        }
        /// 
        /// The ID identifying multipart upload for which we are copying a part.
        /// 
        public string UploadId
        {
            get { return this.uploadId; }
            set { this.uploadId = value; }
        }
        /// 
        /// Checks if UploadId property is set.
        /// 
        /// true if UploadId property is set.
        internal bool IsSetUploadId()
        {
            return !System.String.IsNullOrEmpty(this.uploadId);
        }
        /// 
        /// Collection of ETags to be matched as a pre-condition for copying the source object
        /// otherwise returns a PreconditionFailed.
        /// 
        /// 
        /// Copies the object if its entity tag (ETag) matches one of
        /// the specified tags; otherwise return a 412 (precondition failed).
        /// Constraints: This property can be used with IfUnmodifiedSince,
        /// but cannot be used with other conditional copy properties.
        /// 
        public List ETagToMatch
        {
            get
            {
                if (this.etagsToMatch == null)
                {
                    this.etagsToMatch = new List();
                }
                return this.etagsToMatch;
            }
            set { this.etagsToMatch = value; }
        }
        /// 
        /// Checks if ETagsToMatch property is set.
        /// 
        /// true if ETagToMatch property is set.
        internal bool IsSetETagToMatch()
        {
            return ((etagsToMatch != null) && (etagsToMatch.Count > 0));
        }
        /// 
        /// Collection of ETags that must not be matched as a pre-condition for copying the source object
        /// otherwise returns a PreconditionFailed.
        /// 
        /// 
        /// Copies the object if its entity tag (ETag) does not match any of the specified
        /// tags; otherwise returns a 412 (failed condition).
        /// Constraints: This header can be used with IfModifiedSince, but cannot
        /// be used with other conditional copy properties.
        /// 
        public List ETagsToNotMatch
        {
            get
            {
                if (this.etagsToNotMatch == null)
                {
                    this.etagsToNotMatch = new List();
                }
                return this.etagsToNotMatch;
            }
            set { this.etagsToNotMatch = value; }
        }
        /// 
        /// Checks if ETagToNotMatch property is set.
        /// 
        /// true if ETagToNotMatch property is set.
        internal bool IsSetETagToNotMatch()
        {
            return ((etagsToNotMatch != null) && (etagsToNotMatch.Count > 0));
        }
        /// 
        /// Copies the object if it has been modified since the specified time, otherwise returns a PreconditionFailed.
        /// 
        /// 
        /// Copies the object if it has been modified since the
        /// specified time; otherwise returns a 412 (failed condition).
        /// Constraints: This property can be used with ETagToNotMatch,
        /// but cannot be used with other conditional copy properties.
        /// 
        public DateTime ModifiedSinceDate
        {
            get { return this.modifiedSinceDate.GetValueOrDefault(); }
            set { this.modifiedSinceDate = value; }
        }
        /// 
        /// Checks if ModifiedSinceDate property is set.
        /// 
        /// true if ModifiedSinceDate property is set.
        internal bool IsSetModifiedSinceDate()
        {
            return this.modifiedSinceDate.HasValue;
        }
        /// 
        /// Copies the object if it has not been modified since the specified time, otherwise returns a PreconditionFailed.
        /// 
        /// 
        /// Copies the object if it hasn't been modified since the
        /// specified time; otherwise returns a 412 (precondition failed).
        /// Constraints: This property can be used with ETagToMatch,
        /// but cannot be used with other conditional copy properties.
        /// 
        public DateTime UnmodifiedSinceDate
        {
            get { return this.unmodifiedSinceDate.GetValueOrDefault(); }
            set { this.unmodifiedSinceDate = value; }
        }
        /// 
        /// Checks if UnmodifiedSinceDate property is set.
        /// 
        /// true if UnmodifiedSinceDate property is set.
        internal bool IsSetUnmodifiedSinceDate()
        {
            return this.unmodifiedSinceDate.HasValue;
        }
        /// 
        /// The number of the part to be copied.
        /// 
        /// 
        /// Valid part numbers are from 1 to 10,000 inclusive and will uniquely identify the part 
        /// and determine the relative ordering within the destination object.  If a part already
        /// exists with the PartNumber it will be overwritten.
        /// 
        public int PartNumber
        {
            get { return this.partNumber.GetValueOrDefault(); }
            set { this.partNumber = value; }
        }
        /// 
        /// Checks if PartNumber property is set.
        /// 
        /// true if PartNumber property is set.
        internal bool IsSetPartNumber()
        {
            return this.partNumber.HasValue;
        }
        /// 
        /// The location of the first byte in the range if only a portion of the 
        /// source object is to be copied as the part. 
        /// 
        /// 
        /// The LastByte property must also be set or this value will be ignored.
        /// 
        public long FirstByte
        {
            get { return this.firstByte.GetValueOrDefault(); }
            set { this.firstByte = value; }
        }
        /// 
        /// Checks if FirstByte property is set.
        /// 
        /// true if FirstByte property is set.
        internal bool IsSetFirstByte()
        {
            return this.firstByte.HasValue;
        }
        /// 
        /// The location of the last byte in the range if only a portion of the 
        /// source object is to be copied as the part.  
        /// 
        /// 
        /// The FirstByte property must also be set or this value will be ignored.
        /// 
        public long LastByte
        {
            get { return this.lastByte.GetValueOrDefault(); }
            set { this.lastByte = value; }
        }
        /// 
        /// Checks if LastByte property is set.
        /// 
        /// true if LastByte property is set.
        internal bool IsSetLastByte()
        {
            return this.lastByte.HasValue;
        }
        /// 
        /// 
        /// This property is obsolete. Use ServerSideEncryptionMethod in InitiateMultipartUploadRequest instead.
        /// 
        /// 
        /// Default: None
        /// 
        /// 
        [Obsolete("Use ServerSideEncryptionMethod in InitiateMultipartUploadRequest instead.")]
        public ServerSideEncryptionMethod ServerSideEncryptionMethod
        {
            get { return this.serverSideEncryption; }
            set { this.serverSideEncryption = value; }
        }
        /// 
        /// Checks if ServerSideEncryptionMethod property is set.
        /// 
        /// true if ServerSideEncryptionMethod property is set.
        [Obsolete("Use ServerSideEncryptionMethod in InitiateMultipartUploadRequest instead.")]
        internal bool IsSetServerSideEncryptionMethod()
        {
            return this.serverSideEncryption != null && this.serverSideEncryption != ServerSideEncryptionMethod.None;
        }
        /// 
        /// The Server-side encryption algorithm to be used with the customer provided key.
        ///  
        /// 
        public ServerSideEncryptionCustomerMethod ServerSideEncryptionCustomerMethod
        {
            get { return this.serverSideCustomerEncryption; }
            set { this.serverSideCustomerEncryption = value; }
        }
        // Check to see if ServerSideEncryptionCustomerMethod property is set
        internal bool IsSetServerSideEncryptionCustomerMethod()
        {
            return this.serverSideCustomerEncryption != null && this.serverSideCustomerEncryption != ServerSideEncryptionCustomerMethod.None;
        }
        /// 
        /// The base64-encoded encryption key for Amazon S3 to use to encrypt the object
        /// 
        /// Using the encryption key you provide as part of your request Amazon S3 manages both the encryption, as it writes 
        /// to disks, and decryption, when you access your objects. Therefore, you don't need to maintain any data encryption code. The only 
        /// thing you do is manage the encryption keys you provide.
        /// 
        /// 
        /// When you retrieve an object, you must provide the same encryption key as part of your request. Amazon S3 first verifies 
        /// the encryption key you provided matches, and then decrypts the object before returning the object data to you.
        /// 
        /// 
        /// Important: Amazon S3 does not store the encryption key you provide.
        /// 
        /// 
        public string ServerSideEncryptionCustomerProvidedKey
        {
            get { return this.serverSideEncryptionCustomerProvidedKey; }
            set { this.serverSideEncryptionCustomerProvidedKey = value; }
        }
        /// 
        /// Checks if ServerSideEncryptionCustomerProvidedKey property is set.
        /// 
        /// true if ServerSideEncryptionCustomerProvidedKey property is set.
        internal bool IsSetServerSideEncryptionCustomerProvidedKey()
        {
            return !System.String.IsNullOrEmpty(this.serverSideEncryptionCustomerProvidedKey);
        }
        /// 
        /// The MD5 of the customer encryption key specified in the ServerSideEncryptionCustomerProvidedKey property. The MD5 is
        /// base 64 encoded. This field is optional, the SDK will calculate the MD5 if this is not set.
        /// 
        public string ServerSideEncryptionCustomerProvidedKeyMD5
        {
            get { return this.serverSideEncryptionCustomerProvidedKeyMD5; }
            set { this.serverSideEncryptionCustomerProvidedKeyMD5 = value; }
        }
        /// 
        /// Checks if ServerSideEncryptionCustomerProvidedKeyMD5 property is set.
        /// 
        /// true if ServerSideEncryptionCustomerProvidedKey property is set.
        internal bool IsSetServerSideEncryptionCustomerProvidedKeyMD5()
        {
            return !System.String.IsNullOrEmpty(this.serverSideEncryptionCustomerProvidedKeyMD5);
        }
        /// 
        /// This property is obsolete. Use ServerSideEncryptionKeyManagementServiceKeyId in InitiateMultipartUploadRequest instead.
        /// 
        [Obsolete("Use ServerSideEncryptionKeyManagementServiceKeyId in InitiateMultipartUploadRequest instead.")]
        public string ServerSideEncryptionKeyManagementServiceKeyId
        {
            get { return this.serverSideEncryptionKeyManagementServiceKeyId; }
            set { this.serverSideEncryptionKeyManagementServiceKeyId = value; }
        }
        /// 
        /// Checks if ServerSideEncryptionKeyManagementServiceKeyId property is set.
        /// 
        /// true if ServerSideEncryptionKeyManagementServiceKeyId property is set.
        [Obsolete("Use ServerSideEncryptionKeyManagementServiceKeyId in InitiateMultipartUploadRequest instead.")]
        internal bool IsSetServerSideEncryptionKeyManagementServiceKeyId()
        {
            return !System.String.IsNullOrEmpty(this.serverSideEncryptionKeyManagementServiceKeyId);
        }
        /// 
        /// The Server-side encryption algorithm to be used with the customer provided key.
        ///  
        /// 
        public ServerSideEncryptionCustomerMethod CopySourceServerSideEncryptionCustomerMethod
        {
            get { return this.copySourceServerSideCustomerEncryption; }
            set { this.copySourceServerSideCustomerEncryption = value; }
        }
        // Check to see if CopySourceServerSideEncryptionCustomerMethod property is set
        internal bool IsSetCopySourceServerSideEncryptionCustomerMethod()
        {
            return this.copySourceServerSideCustomerEncryption != null && this.copySourceServerSideCustomerEncryption != ServerSideEncryptionCustomerMethod.None;
        }
        /// 
        /// The customer provided encryption key for the source object of the copy.
        /// 
        /// Important: Amazon S3 does not store the encryption key you provide.
        /// 
        /// 
        public string CopySourceServerSideEncryptionCustomerProvidedKey
        {
            get { return this.copySourceServerSideEncryptionCustomerProvidedKey; }
            set { this.copySourceServerSideEncryptionCustomerProvidedKey = value; }
        }
        /// 
        /// Checks if CopySourceServerSideEncryptionCustomerProvidedKey property is set.
        /// 
        /// true if CopySourceServerSideEncryptionCustomerProvidedKey property is set.
        internal bool IsSetCopySourceServerSideEncryptionCustomerProvidedKey()
        {
            return !System.String.IsNullOrEmpty(this.copySourceServerSideEncryptionCustomerProvidedKey);
        }
        /// 
        /// The MD5 of the customer encryption key specified in the CopySourceServerSideEncryptionCustomerProvidedKey property. The MD5 is
        /// base 64 encoded. This field is optional, the SDK will calculate the MD5 if this is not set.
        /// 
        public string CopySourceServerSideEncryptionCustomerProvidedKeyMD5
        {
            get { return this.copySourceServerSideEncryptionCustomerProvidedKeyMD5; }
            set { this.copySourceServerSideEncryptionCustomerProvidedKeyMD5 = value; }
        }
        /// 
        /// Checks if CopySourceServerSideEncryptionCustomerProvidedKeyMD5 property is set.
        /// 
        /// true if CopySourceServerSideEncryptionCustomerProvidedKey property is set.
        internal bool IsSetCopySourceServerSideEncryptionCustomerProvidedKeyMD5()
        {
            return !System.String.IsNullOrEmpty(this.copySourceServerSideEncryptionCustomerProvidedKeyMD5);
        }
    }
}