in sdk/storage/azure-storage-files-shares/src/rest_client.cpp [4641:4850]
Response<Models::_detail::ListHandlesResponse> FileClient::ListHandles(
Core::Http::_internal::HttpPipeline& pipeline,
const Core::Url& url,
const ListFileHandlesOptions& options,
const Core::Context& context)
{
auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
request.GetUrl().AppendQueryParameter("comp", "listhandles");
if (options.Marker.HasValue() && !options.Marker.Value().empty())
{
request.GetUrl().AppendQueryParameter(
"marker", _internal::UrlEncodeQueryParameter(options.Marker.Value()));
}
if (options.MaxResults.HasValue())
{
request.GetUrl().AppendQueryParameter(
"maxresults", std::to_string(options.MaxResults.Value()));
}
if (options.Sharesnapshot.HasValue() && !options.Sharesnapshot.Value().empty())
{
request.GetUrl().AppendQueryParameter(
"sharesnapshot", _internal::UrlEncodeQueryParameter(options.Sharesnapshot.Value()));
}
request.SetHeader("x-ms-version", "2025-05-05");
if (options.AllowTrailingDot.HasValue())
{
request.SetHeader(
"x-ms-allow-trailing-dot", options.AllowTrailingDot.Value() ? "true" : "false");
}
if (options.FileRequestIntent.HasValue()
&& !options.FileRequestIntent.Value().ToString().empty())
{
request.SetHeader("x-ms-file-request-intent", options.FileRequestIntent.Value().ToString());
}
auto pRawResponse = pipeline.Send(request, context);
auto httpStatusCode = pRawResponse->GetStatusCode();
if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
{
throw StorageException::CreateFromResponse(std::move(pRawResponse));
}
Models::_detail::ListHandlesResponse response;
{
const auto& responseBody = pRawResponse->GetBody();
_internal::XmlReader reader(
reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
enum class XmlTagEnum
{
kUnknown,
kEnumerationResults,
kEntries,
kHandle,
kHandleId,
kPath,
kFileId,
kParentId,
kSessionId,
kClientIp,
kClientName,
kOpenTime,
kLastReconnectTime,
kAccessRightList,
kAccessRight,
kNextMarker,
};
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
{"EnumerationResults", XmlTagEnum::kEnumerationResults},
{"Entries", XmlTagEnum::kEntries},
{"Handle", XmlTagEnum::kHandle},
{"HandleId", XmlTagEnum::kHandleId},
{"Path", XmlTagEnum::kPath},
{"FileId", XmlTagEnum::kFileId},
{"ParentId", XmlTagEnum::kParentId},
{"SessionId", XmlTagEnum::kSessionId},
{"ClientIp", XmlTagEnum::kClientIp},
{"ClientName", XmlTagEnum::kClientName},
{"OpenTime", XmlTagEnum::kOpenTime},
{"LastReconnectTime", XmlTagEnum::kLastReconnectTime},
{"AccessRightList", XmlTagEnum::kAccessRightList},
{"AccessRight", XmlTagEnum::kAccessRight},
{"NextMarker", XmlTagEnum::kNextMarker},
};
std::vector<XmlTagEnum> xmlPath;
Models::_detail::HandleItem vectorElement1;
Models::_detail::AccessRight vectorElement2;
while (true)
{
auto node = reader.Read();
if (node.Type == _internal::XmlNodeType::End)
{
break;
}
else if (node.Type == _internal::XmlNodeType::StartTag)
{
auto ite = XmlTagEnumMap.find(node.Name);
xmlPath.push_back(ite == XmlTagEnumMap.end() ? XmlTagEnum::kUnknown : ite->second);
}
else if (node.Type == _internal::XmlNodeType::Text)
{
if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kHandleId)
{
vectorElement1.HandleId = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kPath)
{
vectorElement1.Path.Content = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kFileId)
{
vectorElement1.FileId = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kParentId)
{
vectorElement1.ParentId = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kSessionId)
{
vectorElement1.SessionId = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kClientIp)
{
vectorElement1.ClientIp = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kClientName)
{
vectorElement1.ClientName = node.Value;
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kOpenTime)
{
vectorElement1.OpenedOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kLastReconnectTime)
{
vectorElement1.LastReconnectedOn
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
}
else if (
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kAccessRightList
&& xmlPath[4] == XmlTagEnum::kAccessRight)
{
vectorElement2 = Models::_detail::AccessRight(node.Value);
}
else if (
xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kNextMarker)
{
response.NextMarker = node.Value;
}
}
else if (node.Type == _internal::XmlNodeType::Attribute)
{
if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kPath && node.Name == "Encoded")
{
vectorElement1.Path.Encoded = node.Value == std::string("true");
}
}
else if (node.Type == _internal::XmlNodeType::EndTag)
{
if (xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
&& xmlPath[3] == XmlTagEnum::kAccessRightList
&& xmlPath[4] == XmlTagEnum::kAccessRight)
{
vectorElement1.AccessRightList.push_back(std::move(vectorElement2));
vectorElement2 = Models::_detail::AccessRight();
}
else if (
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kEnumerationResults
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle)
{
response.HandleList.push_back(std::move(vectorElement1));
vectorElement1 = Models::_detail::HandleItem();
}
xmlPath.pop_back();
}
}
}
return Response<Models::_detail::ListHandlesResponse>(
std::move(response), std::move(pRawResponse));
}