Response DirectoryClient::ListHandles()

in sdk/storage/azure-storage-files-shares/src/rest_client.cpp [2875:3088]


    Response<Models::_detail::ListHandlesResponse> DirectoryClient::ListHandles(
        Core::Http::_internal::HttpPipeline& pipeline,
        const Core::Url& url,
        const ListDirectoryHandlesOptions& 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()));
      }
      if (options.Recursive.HasValue())
      {
        request.SetHeader("x-ms-recursive", options.Recursive.Value() ? "true" : "false");
      }
      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));
    }