StartFileCopyOperation ShareFileClient::StartCopy()

in sdk/storage/azure-storage-files-shares/src/share_file_client.cpp [400:564]


  StartFileCopyOperation ShareFileClient::StartCopy(
      std::string copySource,
      const StartFileCopyOptions& options,
      const Azure::Core::Context& context) const
  {
    auto protocolLayerOptions = _detail::FileClient::StartFileCopyOptions();
    protocolLayerOptions.Metadata
        = std::map<std::string, std::string>(options.Metadata.begin(), options.Metadata.end());
    protocolLayerOptions.CopySource = std::move(copySource);

    if (options.SmbPropertiesToCopy.HasValue())
    {
      if ((options.SmbPropertiesToCopy.Value() & CopyableFileSmbPropertyFlags::FileAttributes)
          == CopyableFileSmbPropertyFlags::FileAttributes)
      {
        protocolLayerOptions.FileAttributes = FileCopySourceTime;
      }
      else if (!options.SmbProperties.Attributes.GetValues().empty())
      {
        protocolLayerOptions.FileAttributes = options.SmbProperties.Attributes.ToString();
      }

      if ((options.SmbPropertiesToCopy.Value() & CopyableFileSmbPropertyFlags::CreatedOn)
          == CopyableFileSmbPropertyFlags::CreatedOn)
      {
        protocolLayerOptions.FileCreationTime = std::string(FileCopySourceTime);
      }
      else if (options.SmbProperties.CreatedOn.HasValue())
      {
        protocolLayerOptions.FileCreationTime = options.SmbProperties.CreatedOn.Value().ToString(
            Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
      }

      if ((options.SmbPropertiesToCopy.Value() & CopyableFileSmbPropertyFlags::LastWrittenOn)
          == CopyableFileSmbPropertyFlags::LastWrittenOn)
      {
        protocolLayerOptions.FileLastWriteTime = std::string(FileCopySourceTime);
      }
      else if (options.SmbProperties.LastWrittenOn.HasValue())
      {
        protocolLayerOptions.FileLastWriteTime
            = options.SmbProperties.LastWrittenOn.Value().ToString(
                Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
      }

      if ((options.SmbPropertiesToCopy.Value() & CopyableFileSmbPropertyFlags::ChangedOn)
          == CopyableFileSmbPropertyFlags::ChangedOn)
      {
        protocolLayerOptions.FileChangeTime = std::string(FileCopySourceTime);
      }
      else if (options.SmbProperties.ChangedOn.HasValue())
      {
        protocolLayerOptions.FileChangeTime = options.SmbProperties.ChangedOn.Value().ToString(
            Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
      }

      if ((options.SmbPropertiesToCopy.Value() & CopyableFileSmbPropertyFlags::Permission)
          == CopyableFileSmbPropertyFlags::Permission)
      {
        protocolLayerOptions.FilePermissionCopyMode = Models::PermissionCopyMode::Source;
      }
      else if (options.PermissionCopyMode.HasValue())
      {
        protocolLayerOptions.FilePermissionCopyMode = options.PermissionCopyMode.Value();
        if (options.PermissionCopyMode.Value() == Models::PermissionCopyMode::Override)
        {
          if (options.Permission.HasValue())
          {
            protocolLayerOptions.FilePermission = options.Permission;
            protocolLayerOptions.FilePermissionFormat = options.FilePermissionFormat;
          }
          else if (options.SmbProperties.PermissionKey.HasValue())
          {
            protocolLayerOptions.FilePermissionKey = options.SmbProperties.PermissionKey;
          }
          else
          {
            AZURE_ASSERT_MSG(false, "Either FilePermission or FilePermissionKey must be set.");
          }
        }
      }
    }
    else
    {
      if (options.SmbProperties.Attributes.GetValues().empty())
      {
        protocolLayerOptions.FileAttributes = FileCopySourceTime;
      }
      else
      {
        protocolLayerOptions.FileAttributes = options.SmbProperties.Attributes.ToString();
      }
      if (options.SmbProperties.CreatedOn.HasValue())
      {
        protocolLayerOptions.FileCreationTime = options.SmbProperties.CreatedOn.Value().ToString(
            Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
      }
      else
      {
        protocolLayerOptions.FileCreationTime = std::string(FileCopySourceTime);
      }
      if (options.SmbProperties.LastWrittenOn.HasValue())
      {
        protocolLayerOptions.FileLastWriteTime
            = options.SmbProperties.LastWrittenOn.Value().ToString(
                Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
      }
      else
      {
        protocolLayerOptions.FileLastWriteTime = std::string(FileCopySourceTime);
      }
      if (options.SmbProperties.ChangedOn.HasValue())
      {
        protocolLayerOptions.FileChangeTime = options.SmbProperties.ChangedOn.Value().ToString(
            Azure::DateTime::DateFormat::Rfc3339, DateTime::TimeFractionFormat::AllDigits);
      }
      if (options.PermissionCopyMode.HasValue())
      {
        protocolLayerOptions.FilePermissionCopyMode = options.PermissionCopyMode.Value();
        if (options.PermissionCopyMode.Value() == Models::PermissionCopyMode::Override)
        {
          if (options.Permission.HasValue())
          {
            protocolLayerOptions.FilePermission = options.Permission;
            protocolLayerOptions.FilePermissionFormat = options.FilePermissionFormat;
          }
          else if (options.SmbProperties.PermissionKey.HasValue())
          {
            protocolLayerOptions.FilePermissionKey = options.SmbProperties.PermissionKey;
          }
          else
          {
            AZURE_ASSERT_MSG(false, "Either FilePermission or FilePermissionKey must be set.");
          }
        }
      }
      else
      {
        protocolLayerOptions.FilePermissionCopyMode = Models::PermissionCopyMode::Source;
      }
    }

    protocolLayerOptions.IgnoreReadOnly = options.IgnoreReadOnly;
    protocolLayerOptions.SetArchiveAttribute = options.SetArchiveAttribute;
    protocolLayerOptions.LeaseId = options.AccessConditions.LeaseId;
    protocolLayerOptions.AllowTrailingDot = m_allowTrailingDot;
    protocolLayerOptions.AllowSourceTrailingDot = m_allowSourceTrailingDot;
    protocolLayerOptions.FileRequestIntent = m_shareTokenIntent;
    if (options.PosixProperties.FileMode.HasValue())
    {
      protocolLayerOptions.FileMode = options.PosixProperties.FileMode.Value().ToOctalFileMode();
    }
    protocolLayerOptions.FileModeCopyMode = options.ModeCopyMode;
    protocolLayerOptions.Owner = options.PosixProperties.Owner;
    protocolLayerOptions.Group = options.PosixProperties.Group;
    protocolLayerOptions.FileOwnerCopyMode = options.OwnerCopyMode;

    auto response = _detail::FileClient::StartCopy(
        *m_pipeline, m_shareFileUrl, protocolLayerOptions, context);

    StartFileCopyOperation res;
    res.m_rawResponse = std::move(response.RawResponse);
    res.m_fileClient = std::make_shared<ShareFileClient>(*this);
    return res;
  }