From eeec6f8f7d03cdcb870db21961479f64f535c161 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 1 Nov 2013 11:19:47 +0000 Subject: [PATCH 5/5] Use telepathy-glib for Sidecars1 --- extensions/Connection_Future.xml | 110 -------------------------------------- extensions/Makefile.am | 1 - extensions/all.xml | 1 - src/conn-sidecars.c | 14 +++-- src/conn-sidecars.h | 2 +- src/connection.c | 6 +-- tests/twisted/constants.py | 3 ++ tests/twisted/gateways.py | 2 +- tests/twisted/servicetest.py | 3 +- tests/twisted/sidecar-own-caps.py | 2 +- tests/twisted/sidecars.py | 20 +++---- 11 files changed, 27 insertions(+), 137 deletions(-) delete mode 100644 extensions/Connection_Future.xml diff --git a/extensions/Connection_Future.xml b/extensions/Connection_Future.xml deleted file mode 100644 index 1104798..0000000 --- a/extensions/Connection_Future.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - Copyright © 2009 Collabora Limited - Copyright © 2009 Nokia Corporation - -

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.

-
- - - - - - - - - The "primary" interface implemented by an object attached - to a connection. For example, a Gabble plugin implementing - fine-grained control of XEP-0016 privacy lists might expose an object - implementing com.example.PrivacyLists. - - - - - The object path of the sidecar, exported by the same bus - name as the Connection to which it is attached. - - - Immutable properties of the sidecar. - - - -

Request an object with a particular interface providing additional - connection-specific functionality, together with its immutable - properties. These will often be implemented by plug-ins to the - connection managers; for example, support for an XMPP XEP for which - no generic Telepathy interface exists might be implemented by a - Gabble plugin exposing a sidecar with a particular interface.

- -

This method may be called at any point during the lifetime of a - connection, even before its Connection_Status - changes to Connected. It MAY take a long time to - return—perhaps it needs to wait for a connection to be established - and for all the services supported by the server to be discovered - before determining whether necessary server-side support is - available—so callers SHOULD override the default method timeout (25 - seconds) with a much higher value (perhaps even MAX_INT32, meaning - “no timeout” in recent versions of libdbus).

- - -

There is an implicit assumption that any connection - manager plugin will only want to export one “primary” object per - feature it implements, since there is a one-to-one mapping between - interface and object. This is reasonable since Sidecars are - (intended to be) analogous to extra interfaces on the connection, - providing once-per-connection shared functionality; it also makes - client code straightforward (look up the interface you care about - in a dictionary, build a proxy object from the value). More - “plural” plugins are likely to want to implement new types of - Channel - instead.

-
-
- - - - The requested sidecar is not implemented by this connection manager, - or a necessary server-side component does not exist. (FIXME: split - these two errors out? Then again, once we list the guaranteed and - possible sidecars on a Protocol object, clients can tell the - difference themselves, because they shouldn't be calling this in the - first case.) - - - - - - A server-side component needed by the requested sidecar reported it - is currently too busy, or did not respond for some - implementation-defined time. The caller may wish to try again later. - - - - - - The connection was disconnected while the sidecar was being set up. - - -
- -
-
diff --git a/extensions/Makefile.am b/extensions/Makefile.am index 6207d8c..70210ad 100644 --- a/extensions/Makefile.am +++ b/extensions/Makefile.am @@ -2,7 +2,6 @@ tools_dir = $(top_srcdir)/tools EXTRA_DIST = \ all.xml \ - Connection_Future.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 5218855..b7c3174 100644 --- a/extensions/all.xml +++ b/extensions/all.xml @@ -37,7 +37,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

- diff --git a/src/conn-sidecars.c b/src/conn-sidecars.c index d2dd57e..87407a4 100644 --- a/src/conn-sidecars.c +++ b/src/conn-sidecars.c @@ -178,7 +178,7 @@ create_sidecar_cb ( GList *l; for (l = contexts; l != NULL; l = l->next) - gabble_svc_connection_future_return_from_ensure_sidecar (l->data, + tp_svc_connection_interface_sidecars1_return_from_ensure_sidecar (l->data, path, props); g_hash_table_unref (props); @@ -200,7 +200,7 @@ out: static void gabble_connection_ensure_sidecar ( - GabbleSvcConnectionFUTURE *iface, + TpSvcConnectionInterfaceSidecars1 *iface, const gchar *sidecar_iface, DBusGMethodInvocation *context) { @@ -238,7 +238,7 @@ gabble_connection_ensure_sidecar ( GHashTable *props = gabble_sidecar_get_immutable_properties (sidecar); DEBUG ("sidecar %s already exists at %s", sidecar_iface, path); - gabble_svc_connection_future_return_from_ensure_sidecar (context, path, + tp_svc_connection_interface_sidecars1_return_from_ensure_sidecar (context, path, props); g_free (path); @@ -340,14 +340,12 @@ sidecars_conn_status_changed_cb ( } void -conn_future_iface_init ( - gpointer g_iface, - gpointer iface_data) +conn_sidecars_iface_init (gpointer g_iface) { - GabbleSvcConnectionFUTUREClass *klass = g_iface; + TpSvcConnectionInterfaceSidecars1Class *klass = g_iface; #define IMPLEMENT(x) \ - gabble_svc_connection_future_implement_##x (\ + tp_svc_connection_interface_sidecars1_implement_##x (\ klass, gabble_connection_##x) IMPLEMENT (ensure_sidecar); #undef IMPLEMENT diff --git a/src/conn-sidecars.h b/src/conn-sidecars.h index 46e076c..a2459a8 100644 --- a/src/conn-sidecars.h +++ b/src/conn-sidecars.h @@ -27,7 +27,7 @@ G_BEGIN_DECLS void conn_sidecars_init (GabbleConnection *conn); void conn_sidecars_dispose (GabbleConnection *conn); -void conn_future_iface_init (gpointer g_iface, gpointer iface_data); +void conn_sidecars_iface_init (gpointer g_iface); G_END_DECLS diff --git a/src/connection.c b/src/connection.c index 4f1078b..598e571 100644 --- a/src/connection.c +++ b/src/connection.c @@ -125,8 +125,8 @@ G_DEFINE_TYPE_WITH_CODE(GabbleConnection, G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_CAPABILITIES, gabble_conn_contact_caps_iface_init); - G_IMPLEMENT_INTERFACE (GABBLE_TYPE_SVC_CONNECTION_FUTURE, - conn_future_iface_init); + G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_SIDECARS1, + conn_sidecars_iface_init); G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_MAIL_NOTIFICATION, conn_mail_notif_iface_init); G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_CLIENT_TYPES, @@ -883,7 +883,7 @@ static const gchar *implemented_interfaces[] = { TP_IFACE_CONNECTION_INTERFACE_CONTACT_CAPABILITIES, TP_IFACE_CONNECTION_INTERFACE_LOCATION, GABBLE_IFACE_CONNECTION_INTERFACE_GABBLE_DECLOAK, - GABBLE_IFACE_CONNECTION_FUTURE, + TP_IFACE_CONNECTION_INTERFACE_SIDECARS1, TP_IFACE_CONNECTION_INTERFACE_CLIENT_TYPES, TP_IFACE_CONNECTION_INTERFACE_ADDRESSING, NULL diff --git a/tests/twisted/constants.py b/tests/twisted/constants.py index 52f8ba3..e21bc13 100644 --- a/tests/twisted/constants.py +++ b/tests/twisted/constants.py @@ -204,6 +204,8 @@ CONN_IFACE_CONTACTS = CONN + '.Interface.Contacts' CONN_IFACE_CONTACT_CAPS = CONN + '.Interface.ContactCapabilities' CONN_IFACE_CONTACT_INFO = CONN + ".Interface.ContactInfo" CONN_IFACE_PRESENCE = CONN + '.Interface.Presence' +CONN_IFACE_RENAMING = CONN + '.Interface.Renaming' +CONN_IFACE_SIDECARS1 = CONN + '.Interface.Sidecars1' CONN_IFACE_SIMPLE_PRESENCE = CONN + '.Interface.SimplePresence' CONN_IFACE_REQUESTS = CONN + '.Interface.Requests' CONN_IFACE_LOCATION = CONN + '.Interface.Location' @@ -607,6 +609,7 @@ CR = PREFIX + '.ChannelRequest' CDO = PREFIX + '.ChannelDispatchOperation' CD = PREFIX + '.ChannelDispatcher' +CD_IFACE_MESSAGES1 = PREFIX + '.ChannelDispatcher.Interface.Messages1' CD_IFACE_OP_LIST = PREFIX + '.ChannelDispatcher.Interface.OperationList' CD_PATH = PATH_PREFIX + '/ChannelDispatcher' CD_REDISPATCH = CD + '.Interface.Redispatch.DRAFT' diff --git a/tests/twisted/gateways.py b/tests/twisted/gateways.py index 3934971..ebe1b2e 100644 --- a/tests/twisted/gateways.py +++ b/tests/twisted/gateways.py @@ -63,7 +63,7 @@ def test_not_acceptable(q, gateways_iface, stream): def test(q, bus, conn, stream): # Request a sidecar thate we support before we're connected; it should just # wait around until we're connected. - call_async(q, conn.Future, 'EnsureSidecar', PLUGIN_IFACE) + call_async(q, conn.Sidecars1, 'EnsureSidecar', PLUGIN_IFACE) conn.Connect() q.expect('dbus-signal', signal='StatusChanged', diff --git a/tests/twisted/servicetest.py b/tests/twisted/servicetest.py index 885bfe2..5ff61a4 100644 --- a/tests/twisted/servicetest.py +++ b/tests/twisted/servicetest.py @@ -633,7 +633,6 @@ def wrap_connection(conn): ('ContactCapabilities', cs.CONN_IFACE_CONTACT_CAPS), ('ContactInfo', cs.CONN_IFACE_CONTACT_INFO), ('Location', cs.CONN_IFACE_LOCATION), - ('Future', tp_name_prefix + '.Connection.FUTURE'), ('MailNotification', cs.CONN_IFACE_MAIL_NOTIFICATION), ('ContactList', cs.CONN_IFACE_CONTACT_LIST), ('ContactGroups', cs.CONN_IFACE_CONTACT_GROUPS), @@ -641,6 +640,8 @@ def wrap_connection(conn): ('PowerSaving', cs.CONN_IFACE_POWER_SAVING), ('Addressing', cs.CONN_IFACE_ADDRESSING), ('ClientTypes', cs.CONN_IFACE_CLIENT_TYPES), + ('Renaming', cs.CONN_IFACE_RENAMING), + ('Sidecars1', cs.CONN_IFACE_SIDECARS1), ])) class ChannelWrapper(ProxyWrapper): diff --git a/tests/twisted/sidecar-own-caps.py b/tests/twisted/sidecar-own-caps.py index b02510b..9e8b9cd 100644 --- a/tests/twisted/sidecar-own-caps.py +++ b/tests/twisted/sidecar-own-caps.py @@ -23,7 +23,7 @@ def test(q, bus, conn, stream): # created. pattern = EventPattern('stream-iq', to='sidecar.example.com', query_ns='http://example.com/sidecar') - call_async(q, conn.Future, 'EnsureSidecar', TEST_PLUGIN_IFACE + ".IQ") + call_async(q, conn.Sidecars1, 'EnsureSidecar', TEST_PLUGIN_IFACE + ".IQ") e = q.expect_many(pattern)[0] # The server said yes, so we should get a sidecar back! diff --git a/tests/twisted/sidecars.py b/tests/twisted/sidecars.py index 61b863d..00b8c56 100644 --- a/tests/twisted/sidecars.py +++ b/tests/twisted/sidecars.py @@ -18,7 +18,7 @@ if not PLUGINS_ENABLED: def test(q, bus, conn, stream): # Request a sidecar thate we support before we're connected; it should just # wait around until we're connected. - call_async(q, conn.Future, 'EnsureSidecar', TEST_PLUGIN_IFACE) + call_async(q, conn.Sidecars1, 'EnsureSidecar', TEST_PLUGIN_IFACE) if PLUGINS_ENABLED: # Now we're connected, the call we made earlier should return. @@ -28,30 +28,30 @@ def test(q, bus, conn, stream): assertEquals({}, props) # We should get the same sidecar if we request it again - path2, props2 = conn.Future.EnsureSidecar(TEST_PLUGIN_IFACE) + path2, props2 = conn.Sidecars1.EnsureSidecar(TEST_PLUGIN_IFACE) assertEquals((path, props), (path2, props2)) else: # Only now does it fail. q.expect('dbus-error', method='EnsureSidecar') # This is not a valid interface name - call_async(q, conn.Future, 'EnsureSidecar', 'not an interface') + call_async(q, conn.Sidecars1, 'EnsureSidecar', 'not an interface') q.expect('dbus-error', name=cs.INVALID_ARGUMENT) # The test plugin makes no reference to this interface. - call_async(q, conn.Future, 'EnsureSidecar', 'unsupported.sidecar') + call_async(q, conn.Sidecars1, 'EnsureSidecar', 'unsupported.sidecar') q.expect('dbus-error', name=cs.NOT_IMPLEMENTED) if PLUGINS_ENABLED: # This sidecar does have some properties: - path, props = conn.Future.EnsureSidecar(TEST_PLUGIN_IFACE + ".Props") + path, props = conn.Sidecars1.EnsureSidecar(TEST_PLUGIN_IFACE + ".Props") assertContains(TEST_PLUGIN_IFACE + ".Props.Greeting", props) # The plugin claims it implements this sidecar, but actually doesn't. # Check that we don't blow up (although this is no different from # Gabble's perspective to creating a sidecar failing because a network # service wasn't there, for instance). - call_async(q, conn.Future, 'EnsureSidecar', + call_async(q, conn.Sidecars1, 'EnsureSidecar', TEST_PLUGIN_IFACE + ".Buggy") q.expect('dbus-error', name=cs.NOT_IMPLEMENTED) @@ -59,7 +59,7 @@ def test(q, bus, conn, stream): # created. pattern = EventPattern('stream-iq', to='sidecar.example.com', query_ns='http://example.com/sidecar') - call_async(q, conn.Future, 'EnsureSidecar', TEST_PLUGIN_IFACE + ".IQ") + call_async(q, conn.Sidecars1, 'EnsureSidecar', TEST_PLUGIN_IFACE + ".IQ") e = q.expect_many(pattern)[0] sync_dbus(bus, q, conn) @@ -70,7 +70,7 @@ def test(q, bus, conn, stream): # Let's try again. The plugin should get a chance to ping the server # again. - call_async(q, conn.Future, 'EnsureSidecar', TEST_PLUGIN_IFACE + ".IQ") + call_async(q, conn.Sidecars1, 'EnsureSidecar', TEST_PLUGIN_IFACE + ".IQ") e = q.expect_many(pattern)[0] # The server said yes, so we should get a sidecar back! @@ -80,7 +80,7 @@ def test(q, bus, conn, stream): # If we ask again once the plugin has been created, it should return at # once without any more network traffic. q.forbid_events([pattern]) - conn.Future.EnsureSidecar(TEST_PLUGIN_IFACE + ".IQ") + conn.Sidecars1.EnsureSidecar(TEST_PLUGIN_IFACE + ".IQ") sync_stream(q, stream) # TODO: test ensuring a sidecar that waits for something from the @@ -96,7 +96,7 @@ def test(q, bus, conn, stream): EventPattern('stream-closed'), ) - call_async(q, conn.Future, 'EnsureSidecar', 'zomg.what') + call_async(q, conn.Sidecars1, 'EnsureSidecar', 'zomg.what') # With older telepathy-glib this would be DISCONNECTED; # with newer telepathy-glib the Connection disappears from the bus # sooner, and you get UnknownMethod or something from dbus-glib. -- 1.8.4.2