public async Task<IReadOnlyList<AddressBookData>> GetUserAddressBooksNoThrow (bool useWellKnownUrl)
{
try
{
var autodiscoveryUrl = useWellKnownUrl ? AutoDiscoveryUrl : _serverUrl;
var currentUserPrincipalUrl = await GetCurrentUserPrincipalUrl (autodiscoveryUrl);
var addressbooks = new List<AddressBookData>();
if (currentUserPrincipalUrl != null)
{
var addressBookHomeSetProperties = await GetAddressBookHomeSet (currentUserPrincipalUrl);
XmlNode homeSetNode = addressBookHomeSetProperties.XmlDocument.SelectSingleNode ("/D:multistatus/D:response/D:propstat/D:prop/A:addressbook-home-set", addressBookHomeSetProperties.XmlNamespaceManager);
if (homeSetNode != null && homeSetNode.HasChildNodes)
{
foreach (XmlNode homeSetNodeHref in homeSetNode.ChildNodes)
{
if (!string.IsNullOrEmpty (homeSetNodeHref.InnerText))
{
var addressBookHomeSetUri = Uri.IsWellFormedUriString (homeSetNodeHref.InnerText, UriKind.Absolute) ?
new Uri (homeSetNodeHref.InnerText) :
new Uri (addressBookHomeSetProperties.DocumentUri.GetLeftPart (UriPartial.Authority) + homeSetNodeHref.InnerText);
var addressBookDocument = await ListAddressBooks (addressBookHomeSetUri);
XmlNodeList responseNodes = addressBookDocument.XmlDocument.SelectNodes ("/D:multistatus/D:response", addressBookDocument.XmlNamespaceManager);
foreach (XmlElement responseElement in responseNodes)
{
var urlNode = responseElement.SelectSingleNode ("D:href", addressBookDocument.XmlNamespaceManager);
var displayNameNode = responseElement.SelectSingleNode ("D:propstat/D:prop/D:displayname", addressBookDocument.XmlNamespaceManager);
if (urlNode != null && displayNameNode != null)
{
XmlNode isCollection = responseElement.SelectSingleNode ("D:propstat/D:prop/D:resourcetype/A:addressbook", addressBookDocument.XmlNamespaceManager);
if (isCollection != null)
{
var path = urlNode.InnerText.EndsWith ("/") ? urlNode.InnerText : urlNode.InnerText + "/";
var displayName = string.IsNullOrEmpty (displayNameNode.InnerText) ? "Default Addressbook" : displayNameNode.InnerText;
addressbooks.Add (new AddressBookData (new Uri (addressBookDocument.DocumentUri, path), displayName));
}
}
}
}
}
}
}
return addressbooks;
}
catch (Exception x)
{
if (x.Message.Contains ("404") || x.Message.Contains ("405") || x is XmlException)
return new AddressBookData[] { };
else
throw;
}
}