From 4c0aa45e6a69de77cc9e685edac9213ba34192dd Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Sun, 19 Sep 2010 09:19:42 -0700 Subject: Added Conn.I.Addressing as an extension. --- extensions/Connection_Interface_Addressing.xml | 258 +++++++++++++++++++++++++ extensions/Makefile.am | 1 + extensions/all.xml | 6 + 3 files changed, 265 insertions(+) create mode 100644 extensions/Connection_Interface_Addressing.xml (limited to 'extensions') diff --git a/extensions/Connection_Interface_Addressing.xml b/extensions/Connection_Interface_Addressing.xml new file mode 100644 index 000000000..497c6d0d9 --- /dev/null +++ b/extensions/Connection_Interface_Addressing.xml @@ -0,0 +1,258 @@ + + + Copyright (C) 2010 Collabora Limited + +

This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or (at + your option) any later version.

+ +

This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + General Public License for more details.

+ +

You should have received a copy of the GNU Lesser General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

+
+ + + + (as draft) + +

This interface deals with the multiple address types that can + refer to the same contact, such as vCard fields and URIs.

+ +

It can be used to retrieve contacts with a specific addresses + through GetContactsByVCardField and + GetContactsByURI, as well as + defining the various addressing methods for a given contact + through this interface's contact attributes.

+
+ + + + +

The vCard field of the addresses we are requesting. The + field name SHOULD be in lower case. Supported + fields can be found in + AddressableVCardFields.

+ +

The url vCard field MUST NOT appear here; see + GetContactsByURI instead.

+ + +

In practice, protocols have a limited set of URI + schemes that make sense to resolve as a contact.

+
+ +
+
+ + + The addresses to get contact handles for. The address types + should match the given vCard field. + + + + +

A list of strings indicating which D-Bus interfaces the calling + process is interested in. All supported attributes from these + interfaces, whose values can be obtained without additional network + activity, will be in the reply.

+ +

Attributes from this interface and from + org.freedesktop.Telepathy.Connection + are always returned, and need not be requested + explicitly.

+ +

The behavior of this parameter is similar to the same + parameter in + Contacts.GetContactAttributes.

+
+
+ + + +

A dictionary mapping the contact handles to contact attributes. + If any of the requested addresses are in fact invalid, they are + simply omitted from this mapping. If contact attributes are not + immediately known, the behaviour is defined by the interface; + the attribute should either be omitted from the result or + replaced with a default value.

+ +

Requested addresses that cannot be satisfied MUST be ommitted + from the mapping.

+ +

Each contact's attributes will always include at least the + identifier that would be obtained by inspecting the handle + (org.freedesktop.Telepathy.Connection/contact-id), + and the vCard field used for requesting the contact in + org.freedesktop.Telepathy.Connection.Interface.ContactInfo/info. +

+
+
+ + +

Request contacts and retrieve their attributes using a given field + in their vCards.

+ +

The connection manager should record that these handles are in + use by the client who invokes this method, and must not + deallocate the handles until the client disconnects from the + bus or calls the + Connection.ReleaseHandles + method.

+
+ + + + +
+ + + + + The URI addresses to get contact handles for. Supported + schemes can be found in + AddressableURISchemes. + + + + +

A list of strings indicating which D-Bus interfaces the calling + process is interested in. All supported attributes from these + interfaces, whose values can be obtained without additional network + activity, will be in the reply.

+ +

Attributes from this interface and from + org.freedesktop.Telepathy.Connection + are always returned, and need not be requested + explicitly.

+ +

The behavior of this parameter is similar to the same + parameter in + Contacts.GetContactAttributes.

+
+
+ + + +

A dictionary mapping the contact handles to contact attributes. + If any of the requested addresses are in fact invalid, they are + simply omitted from this mapping. If contact attributes are not + immediately known, the behaviour is defined by the interface; + the attribute should either be omitted from the result or + replaced with a default value.

+ +

Requested URIs that cannot be satisfied MUST be ommitted + from the mapping.

+ +

Each contact's attributes will always include at least the + identifier that would be obtained by inspecting the handle + (org.freedesktop.Telepathy.Connection/contact-id). +

+
+
+ + +

Request contacts and retrieve their attributes using URI addresses.

+ +

The connection manager should record that these handles are in + use by the client who invokes this method, and must not + deallocate the handles until the client disconnects from the + bus or calls the + Connection.ReleaseHandles + method.

+
+ + + + +
+ + + +

A mapping of vCard fields and addresses that repreent + the given contact.

+
+ + +
+ + + + The various vCard addresses that identify this contact. + + + + + + The various URI addresses that identify this contact. + + + + + +

The contact's address, as it was requested + through GetContactsByVCardField. This + attribute MUST be ommitted if the contact was not retrieved + through GetContactsByVCardField.

+ +

When retrieving more than one contact + through GetContactsByVCardField, + there needs to be a way to map the given contact back o the + original request.

+
+
+
+ + + +

The contact's URI, as it was requested through + GetContactsByURI. This + attribute MUST be ommitted if the contact was not retrieved + through GetContactsByURI.

+ +

When retrieving more than one contact + through GetContactsByURI, + there needs to be a way to map the given contact back o the + original request.

+
+
+
+ + + + The address that has been requested by + GetContactsByVCardField or + GetContactsByURI. + + + + + The vCard field used in GetContactsByVCardField. + + + + + + The address that was requested. + + + + + +
+
+ diff --git a/extensions/Makefile.am b/extensions/Makefile.am index 27d471fa0..14c7b6f8f 100644 --- a/extensions/Makefile.am +++ b/extensions/Makefile.am @@ -4,6 +4,7 @@ EXTRA_DIST = \ all.xml \ Channel_Type_FileTransfer_Future.xml \ Connection_Future.xml \ + Connection_Interface_Addressing.xml \ Connection_Interface_Gabble_Decloak.xml \ Gabble_Plugin_Console.xml \ Gabble_Plugin_Gateways.xml \ diff --git a/extensions/all.xml b/extensions/all.xml index 90f52a89b..99997d6db 100644 --- a/extensions/all.xml +++ b/extensions/all.xml @@ -33,6 +33,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

from="Telepathy specification"/> + + @@ -81,6 +83,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

+ + + -- cgit v1.2.3 From f84a9c17a256a17ad0118a9a932cc90650399143 Mon Sep 17 00:00:00 2001 From: "Andre Moreira Magalhaes (andrunko)" Date: Wed, 16 Nov 2011 17:16:56 -0200 Subject: Split requested contacts into a separate argument in Conn.I.Addressing. Remove the contact attributes ".../requested-*" and return the satisfied requested addresses on GetContactsByURI/VCardField. --- extensions/Connection_Interface_Addressing.xml | 81 ++++++++++-------------- src/conn-addressing.c | 86 ++++++-------------------- tests/twisted/addressing.py | 51 +++++++-------- 3 files changed, 76 insertions(+), 142 deletions(-) (limited to 'extensions') diff --git a/extensions/Connection_Interface_Addressing.xml b/extensions/Connection_Interface_Addressing.xml index 497c6d0d9..c5794a66a 100644 --- a/extensions/Connection_Interface_Addressing.xml +++ b/extensions/Connection_Interface_Addressing.xml @@ -76,7 +76,18 @@ - + +

A mapping of requested vCard addresses and the corresponding + contact handles.

+ +

Requested addresses that cannot be satisfied MUST be ommitted + from the mapping.

+
+
+ +

A dictionary mapping the contact handles to contact attributes. @@ -91,9 +102,7 @@

Each contact's attributes will always include at least the identifier that would be obtained by inspecting the handle - (org.freedesktop.Telepathy.Connection/contact-id), - and the vCard field used for requesting the contact in - org.freedesktop.Telepathy.Connection.Interface.ContactInfo/info. + (org.freedesktop.Telepathy.Connection/contact-id).

@@ -143,7 +152,17 @@ - + +

A mapping of requested URIs and the corresponding contact handles.

+ +

Requested URIs that cannot be satisfied MUST be ommitted + from the mapping.

+
+
+ +

A dictionary mapping the contact handles to contact attributes. @@ -201,57 +220,25 @@ - - -

The contact's address, as it was requested - through GetContactsByVCardField. This - attribute MUST be ommitted if the contact was not retrieved - through GetContactsByVCardField.

- -

When retrieving more than one contact - through GetContactsByVCardField, - there needs to be a way to map the given contact back o the - original request.

-
-
- - - - -

The contact's URI, as it was requested through - GetContactsByURI. This - attribute MUST be ommitted if the contact was not retrieved - through GetContactsByURI.

- -

When retrieving more than one contact - through GetContactsByURI, - there needs to be a way to map the given contact back o the - original request.

-
-
-
- - + - The address that has been requested by - GetContactsByVCardField or - GetContactsByURI. + A map from URIs/vCard addresses to the corresponding handle. + - + - The vCard field used in GetContactsByVCardField. + The URI or vCard address that has been requested by + GetContactsByVCardField or + GetContactsByURI. - - + - The address that was requested. + A nonzero handle. - - + diff --git a/src/conn-addressing.c b/src/conn-addressing.c index 38f35d8f4..6d5dc8b4b 100644 --- a/src/conn-addressing.c +++ b/src/conn-addressing.c @@ -76,13 +76,11 @@ conn_addressing_get_contacts_by_uri (GabbleSvcConnectionInterfaceAddressing *ifa const gchar **uri; TpHandleRepoIface *contact_repo = tp_base_connection_get_handles ( (TpBaseConnection *) iface, TP_HANDLE_TYPE_CONTACT); - GHashTable *result; + GHashTable *attributes; GHashTable *requested = g_hash_table_new (g_direct_hash, g_direct_equal); GArray *handles = g_array_sized_new (TRUE, TRUE, sizeof (TpHandle), g_strv_length ((gchar **) uris)); gchar *sender = dbus_g_method_get_sender (context); - GList *contacts; - GList *contact; for (uri = uris; *uri != NULL; uri++) { @@ -91,33 +89,19 @@ conn_addressing_get_contacts_by_uri (GabbleSvcConnectionInterfaceAddressing *ifa if (h == 0) continue; - g_hash_table_insert (requested, GUINT_TO_POINTER (h), (gpointer) *uri); + g_hash_table_insert (requested, (gpointer) *uri, GUINT_TO_POINTER (h)); g_array_append_val (handles, h); } - result = tp_contacts_mixin_get_contact_attributes (G_OBJECT (iface), handles, + attributes = tp_contacts_mixin_get_contact_attributes (G_OBJECT (iface), handles, interfaces, assumed_interfaces, sender); - /* copy the keys, because we'll be modifying the hash table while we iterate over them */ - contacts = g_hash_table_get_keys (result); - - for (contact = contacts; contact != NULL; contact = contact->next) - { - GValue *val = tp_g_value_slice_new_string (g_hash_table_lookup (requested, - contact->data)); - TpHandle h = GPOINTER_TO_UINT (contact->data); - - tp_contacts_mixin_set_contact_attribute (result, h, - GABBLE_IFACE_CONNECTION_INTERFACE_ADDRESSING"/requested-uri", val); - } - - gabble_svc_connection_interface_addressing_return_from_get_contacts_by_uri (context, - result); + gabble_svc_connection_interface_addressing_return_from_get_contacts_by_uri ( + context, requested, attributes); tp_handles_unref (contact_repo, handles); - g_list_free (contacts); - g_hash_table_destroy (requested); - g_hash_table_unref (result); + g_hash_table_unref (requested); + g_hash_table_unref (attributes); g_free (sender); } @@ -128,70 +112,36 @@ conn_addressing_get_contacts_by_vcard_field (GabbleSvcConnectionInterfaceAddress const gchar **interfaces, DBusGMethodInvocation *context) { + const gchar **address; TpHandleRepoIface *contact_repo = tp_base_connection_get_handles ( (TpBaseConnection *) iface, TP_HANDLE_TYPE_CONTACT); - const gchar **address; - gchar *sender = dbus_g_method_get_sender (context); - GHashTable *result; + GHashTable *attributes; GHashTable *requested = g_hash_table_new (g_direct_hash, g_direct_equal); GArray *handles = g_array_sized_new (TRUE, TRUE, sizeof (TpHandle), g_strv_length ((gchar **) addresses)); - GList *contacts; - GList *contact; + gchar *sender = dbus_g_method_get_sender (context); for (address = addresses; *address != NULL; address++) { - GError *error = NULL; TpHandle h = gabble_ensure_handle_from_vcard_address (contact_repo, field, - *address, &error); + *address, NULL); if (h == 0) - { - if (g_error_matches (error, TP_ERROR, TP_ERROR_NOT_IMPLEMENTED)) - { - error->code = TP_ERROR_INVALID_ARGUMENT; - dbus_g_method_return_error (context, error); - g_error_free (error); - return; - } - else - { - g_error_free (error); - continue; - } - } - - g_hash_table_insert (requested, GUINT_TO_POINTER (h), (gpointer) *address); + continue; + + g_hash_table_insert (requested, (gpointer) *address, GUINT_TO_POINTER (h)); g_array_append_val (handles, h); } - result = tp_contacts_mixin_get_contact_attributes (G_OBJECT (iface), handles, + attributes = tp_contacts_mixin_get_contact_attributes (G_OBJECT (iface), handles, interfaces, assumed_interfaces, sender); - /* copy the keys, because we'll be modifying the hash table while we iterate over them */ - contacts = g_hash_table_get_keys (result); - - for (contact = contacts; contact != NULL; contact = contact->next) - { - TpHandle h = GPOINTER_TO_UINT (contact->data); - GValueArray *req_address = tp_value_array_build (2, - G_TYPE_STRING, field, - G_TYPE_STRING, g_hash_table_lookup (requested, contact->data), - G_TYPE_INVALID); - GValue *val = tp_g_value_slice_new_take_boxed ( - GABBLE_STRUCT_TYPE_REQUESTED_ADDRESS, req_address); - - tp_contacts_mixin_set_contact_attribute (result, h, - GABBLE_IFACE_CONNECTION_INTERFACE_ADDRESSING"/requested-address", val); - } - gabble_svc_connection_interface_addressing_return_from_get_contacts_by_vcard_field ( - context, result); + context, requested, attributes); tp_handles_unref (contact_repo, handles); - g_list_free (contacts); - g_hash_table_destroy (requested); - g_hash_table_unref (result); + g_hash_table_unref (requested); + g_hash_table_unref (attributes); g_free (sender); } diff --git a/tests/twisted/addressing.py b/tests/twisted/addressing.py index 4f9164868..264eeb600 100644 --- a/tests/twisted/addressing.py +++ b/tests/twisted/addressing.py @@ -69,53 +69,50 @@ def test_protocol(q, bus, conn, stream): name=cs.INVALID_ARGUMENT) def test_connection(q, bus, conn, stream): - conn.Connect() - event = q.expect('stream-iq', query_ns=ns.ROSTER) event.stanza['type'] = 'result' - buddies = ['amy@foo.com', 'bob@foo.com', 'che@foo.com'] - not_normal_buddies = ['AMY@foo.com', 'bob@FOO.com', 'che@foo.com/resource'] + normalized_buddies = ['amy@foo.com', 'bob@foo.com', 'che@foo.com'] + buddies = ['AMY@foo.com', 'bob@FOO.com', 'che@foo.com/resource'] - for buddy in buddies: + for buddy in normalized_buddies: item = event.query.addElement('item') item['jid'] = buddy item['subscription'] = 'both' stream.send(event.stanza) - contacts = conn.Addressing.GetContactsByVCardField( - "X-JABBER", not_normal_buddies[:2] + ['bad!jid'] + not_normal_buddies[2:], []) + requested, attributes = conn.Addressing.GetContactsByVCardField( + "X-JABBER", buddies[:2] + ['bad!jid'] + buddies[2:], []) - req_addresses = [] addresses = [] - for c in contacts.values(): - assertContains(cs.CONN_IFACE_ADDRESSING + '/requested-address', c.keys()) - req_addresses.append(c[cs.CONN_IFACE_ADDRESSING + '/requested-address'][1]) - assertEquals("X-JABBER", c[cs.CONN_IFACE_ADDRESSING + '/requested-address'][0]) - assertContains(cs.CONN_IFACE_ADDRESSING + '/addresses', c.keys()) - assertContains('x-jabber', c[cs.CONN_IFACE_ADDRESSING + '/addresses'].keys()) - addresses.append(c[cs.CONN_IFACE_ADDRESSING + '/addresses']['x-jabber']) + assertEquals(3, len(attributes)) + assertEquals(3, len(requested)) + + for attr in attributes.values(): + assertContains(cs.CONN_IFACE_ADDRESSING + '/addresses', attr.keys()) + assertContains('x-jabber', attr[cs.CONN_IFACE_ADDRESSING + '/addresses'].keys()) + addresses.append(attr[cs.CONN_IFACE_ADDRESSING + '/addresses']['x-jabber']) - assertSameSets(buddies, addresses) - assertSameSets(not_normal_buddies, req_addresses) + assertSameSets(normalized_buddies, addresses) + assertSameSets(buddies, requested.keys()); schemes = ["xmpp", "XMPP", "http"] + valid_schemes = ["xmpp", "XMPP"] + + request_uris = [a + ":" + b for a, b in zip(schemes, buddies)] + valid_uris = [a + ":" + b for a, b in zip(valid_schemes, buddies)] - get_uris = [a + ":" + b for a,b in zip(schemes, not_normal_buddies)] + requested, attributes = conn.Addressing.GetContactsByURI(request_uris, []) - contacts = conn.Addressing.GetContactsByURI(get_uris, []) + assertEquals(2, len(attributes)) + assertEquals(2, len(requested)) - # Only two of the schemes we provided are valid. - assertEquals(2, len(contacts)) + for attr in attributes.values(): + assertContains(cs.CONN_IFACE_ADDRESSING + '/uris', attr.keys()) - for c in contacts.values(): - assertContains(cs.CONN_IFACE_ADDRESSING + '/requested-uri', c.keys()) - req_uri = c[cs.CONN_IFACE_ADDRESSING + '/requested-uri'] - assertDoesNotContain("http", req_uri) - assertContains(cs.CONN_IFACE_ADDRESSING + '/uris', c.keys()) - assertContains(req_uri.lower(), c[cs.CONN_IFACE_ADDRESSING + '/uris']) + assertSameSets(valid_uris, requested.keys()) if __name__ == '__main__': exec_test(test_protocol) -- cgit v1.2.3 From 774995d3b527ced96f236ac7937d8861c9403c03 Mon Sep 17 00:00:00 2001 From: "Andre Moreira Magalhaes (andrunko)" Date: Wed, 16 Nov 2011 17:37:08 -0200 Subject: Fix typo in Conn.I.Addressing. --- extensions/Connection_Interface_Addressing.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'extensions') diff --git a/extensions/Connection_Interface_Addressing.xml b/extensions/Connection_Interface_Addressing.xml index c5794a66a..a00918d3f 100644 --- a/extensions/Connection_Interface_Addressing.xml +++ b/extensions/Connection_Interface_Addressing.xml @@ -82,7 +82,7 @@

A mapping of requested vCard addresses and the corresponding contact handles.

-

Requested addresses that cannot be satisfied MUST be ommitted +

Requested addresses that cannot be satisfied MUST be omitted from the mapping.

@@ -97,7 +97,7 @@ the attribute should either be omitted from the result or replaced with a default value.

-

Requested addresses that cannot be satisfied MUST be ommitted +

Requested addresses that cannot be satisfied MUST be omitted from the mapping.

Each contact's attributes will always include at least the @@ -157,7 +157,7 @@

A mapping of requested URIs and the corresponding contact handles.

-

Requested URIs that cannot be satisfied MUST be ommitted +

Requested URIs that cannot be satisfied MUST be omitted from the mapping.

@@ -172,7 +172,7 @@ the attribute should either be omitted from the result or replaced with a default value.

-

Requested URIs that cannot be satisfied MUST be ommitted +

Requested URIs that cannot be satisfied MUST be omitted from the mapping.

Each contact's attributes will always include at least the -- cgit v1.2.3 From 1393bc432a2a271e94d528df15b9166c9fa9a8b7 Mon Sep 17 00:00:00 2001 From: "Andre Moreira Magalhaes (andrunko)" Date: Wed, 16 Nov 2011 17:41:42 -0200 Subject: Update docs for Conn.I.Addressing. --- extensions/Connection_Interface_Addressing.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'extensions') diff --git a/extensions/Connection_Interface_Addressing.xml b/extensions/Connection_Interface_Addressing.xml index a00918d3f..f2b069010 100644 --- a/extensions/Connection_Interface_Addressing.xml +++ b/extensions/Connection_Interface_Addressing.xml @@ -79,11 +79,11 @@ -

A mapping of requested vCard addresses and the corresponding +

A mapping from requested vCard addresses and the corresponding contact handles.

-

Requested addresses that cannot be satisfied MUST be omitted - from the mapping.

+

Requested addresses that are not valid or understood for this protocol + MUST be omitted from the mapping.

@@ -97,8 +97,8 @@ the attribute should either be omitted from the result or replaced with a default value.

-

Requested addresses that cannot be satisfied MUST be omitted - from the mapping.

+

Requested addresses that are not valid or understood for this protocol + MUST be omitted from the mapping.

Each contact's attributes will always include at least the identifier that would be obtained by inspecting the handle @@ -157,8 +157,8 @@

A mapping of requested URIs and the corresponding contact handles.

-

Requested URIs that cannot be satisfied MUST be omitted - from the mapping.

+

Requested URIs that are not valid or understood for this protocol + MUST be omitted from the mapping.

@@ -172,8 +172,8 @@ the attribute should either be omitted from the result or replaced with a default value.

-

Requested URIs that cannot be satisfied MUST be omitted - from the mapping.

+

Requested URIs that are not valid or understood for this protocol + MUST be omitted from the mapping.

Each contact's attributes will always include at least the identifier that would be obtained by inspecting the handle -- cgit v1.2.3 From 26594e8d47c0af050128d9133892f676cde96e55 Mon Sep 17 00:00:00 2001 From: "Andre Moreira Magalhaes (andrunko)" Date: Thu, 17 Nov 2011 10:41:33 -0200 Subject: Update docs for Conn.I.Addressing. --- extensions/Connection_Interface_Addressing.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'extensions') diff --git a/extensions/Connection_Interface_Addressing.xml b/extensions/Connection_Interface_Addressing.xml index f2b069010..b22910328 100644 --- a/extensions/Connection_Interface_Addressing.xml +++ b/extensions/Connection_Interface_Addressing.xml @@ -79,7 +79,7 @@ -

A mapping from requested vCard addresses and the corresponding +

A mapping from requested vCard addresses to the corresponding contact handles.

Requested addresses that are not valid or understood for this protocol @@ -155,7 +155,7 @@ -

A mapping of requested URIs and the corresponding contact handles.

+

A mapping of requested URIs to the corresponding contact handles.

Requested URIs that are not valid or understood for this protocol MUST be omitted from the mapping.

-- cgit v1.2.3 From 7fa869b1f319ab42c75d61fdd3b22859f3bb1dfb Mon Sep 17 00:00:00 2001 From: "Andre Moreira Magalhaes (andrunko)" Date: Mon, 21 Nov 2011 13:25:27 -0200 Subject: Update Conn.I.Addressing from tp-spec. --- extensions/Connection_Interface_Addressing.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'extensions') diff --git a/extensions/Connection_Interface_Addressing.xml b/extensions/Connection_Interface_Addressing.xml index b22910328..db8155f23 100644 --- a/extensions/Connection_Interface_Addressing.xml +++ b/extensions/Connection_Interface_Addressing.xml @@ -39,7 +39,7 @@

The vCard field of the addresses we are requesting. The field name SHOULD be in lower case. Supported fields can be found in - AddressableVCardFields.

+ AddressableVCardFields.

The url vCard field MUST NOT appear here; see GetContactsByURI instead.

@@ -130,7 +130,7 @@ The URI addresses to get contact handles for. Supported schemes can be found in - AddressableURISchemes. + AddressableURISchemes.