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;
}