CalDavSynchronizer.DataAccess.CardDavDataAccess.ExtractVersions C# (CSharp) Method

ExtractVersions() private method

private ExtractVersions ( XmlDocumentWithNamespaceManager responseXml ) : string>>.IReadOnlyList
responseXml XmlDocumentWithNamespaceManager
return string>>.IReadOnlyList
    private IReadOnlyList<EntityVersion<WebResourceName, string>> ExtractVersions (XmlDocumentWithNamespaceManager responseXml)
    {
      s_logger.Debug ("Entered ExtractVersions.");

      var entities = new List<EntityVersion<WebResourceName, string>> ();

      XmlNodeList responseNodes = responseXml.XmlDocument.SelectNodes ("/D:multistatus/D:response", responseXml.XmlNamespaceManager);

      // ReSharper disable once LoopCanBeConvertedToQuery
      // ReSharper disable once PossibleNullReferenceException
      foreach (XmlElement responseElement in responseNodes)
      {
        var urlNode = responseElement.SelectSingleNode ("D:href", responseXml.XmlNamespaceManager);
        var etagNode = responseElement.SelectSingleNode ("D:propstat/D:prop/D:getetag", responseXml.XmlNamespaceManager);
        var contentTypeNode = responseElement.SelectSingleNode ("D:propstat/D:prop/D:getcontenttype", responseXml.XmlNamespaceManager);

        if (urlNode != null && etagNode != null)
        {
          string contentType = contentTypeNode?.InnerText ?? string.Empty;
          var eTag = HttpUtility.GetQuotedEtag (etagNode.InnerText);
          // the directory is also included in the list. It has a etag of '"None"' and is skipped
          // in Owncloud eTag is empty for directory
          // Yandex returns some eTag and the urlNode for the directory itself, so we need to filter that out aswell
          // TODO: add vlist support but for now filter out sogo vlists since we can't parse them atm

          if (!string.IsNullOrEmpty (eTag) &&
              String.Compare (eTag, @"""None""", StringComparison.OrdinalIgnoreCase) != 0 &&
              _serverUrl.AbsolutePath != UriHelper.DecodeUrlString (urlNode.InnerText) &&
              contentType != "text/x-vlist"
              )
          {
            if (s_logger.IsDebugEnabled)
              s_logger.DebugFormat ($"'{urlNode.InnerText}': '{eTag}'");
            entities.Add (EntityVersion.Create (new WebResourceName (urlNode.InnerText), eTag));
          }
        }
      }

      s_logger.Debug ("Exiting ExtractVersions.");
      return entities;
    }