29 | 29 |
GList *providers;
|
30 | 30 |
guint dbus_owner_id;
|
31 | 31 |
GDBusNodeInfo *dbus_node_info;
|
|
32 |
CloudProviderManager1 *skeleton;
|
32 | 33 |
} CloudProviderManagerPrivate;
|
33 | 34 |
|
34 | 35 |
G_DEFINE_TYPE_WITH_PRIVATE (CloudProviderManager, cloud_provider_manager, G_TYPE_OBJECT)
|
|
41 | 42 |
|
42 | 43 |
static guint gSignals [LAST_SIGNAL];
|
43 | 44 |
|
44 | |
static const gchar manager_xml[] =
|
45 | |
"<node>"
|
46 | |
" <interface name='org.freedesktop.CloudProviderManager1'>"
|
47 | |
" <method name='CloudProviderChanged'>"
|
48 | |
" </method>"
|
49 | |
" </interface>"
|
50 | |
"</node>";
|
51 | |
|
52 | |
static void
|
53 | |
handle_method_call (GDBusConnection *connection,
|
54 | |
const gchar *sender,
|
55 | |
const gchar *object_path,
|
56 | |
const gchar *interface_name,
|
57 | |
const gchar *method_name,
|
58 | |
GVariant *parameters,
|
59 | |
GDBusMethodInvocation *invocation,
|
60 | |
gpointer user_data)
|
61 | |
{
|
62 | |
if (g_strcmp0 (method_name, "CloudProviderChanged") == 0)
|
63 | |
{
|
64 | |
cloud_provider_manager_update (CLOUD_PROVIDER_MANAGER (user_data));
|
65 | |
}
|
66 | |
}
|
67 | |
|
68 | |
static const GDBusInterfaceVTable interface_vtable =
|
69 | |
{
|
70 | |
handle_method_call,
|
71 | |
};
|
|
45 |
static void
|
|
46 |
on_cloud_provider_changed (CloudProvider *cloud_provider,
|
|
47 |
CloudProviderManager *self)
|
|
48 |
{
|
|
49 |
GIcon *icon;
|
|
50 |
gchar *name;
|
|
51 |
guint status;
|
|
52 |
|
|
53 |
name = cloud_provider_get_name (cloud_provider);
|
|
54 |
icon = cloud_provider_get_icon (cloud_provider);
|
|
55 |
status = cloud_provider_get_status (cloud_provider);
|
|
56 |
if (name == NULL || icon == NULL || status == CLOUD_PROVIDER_STATUS_INVALID)
|
|
57 |
return;
|
|
58 |
|
|
59 |
g_signal_emit_by_name (self, "changed", NULL);
|
|
60 |
}
|
72 | 61 |
|
73 | 62 |
static void
|
74 | 63 |
on_bus_acquired (GDBusConnection *connection,
|
75 | 64 |
const gchar *name,
|
76 | 65 |
gpointer user_data)
|
77 | 66 |
{
|
78 | |
CloudProviderManager *self = user_data;
|
79 | |
CloudProviderManagerPrivate *priv = cloud_provider_manager_get_instance_private (self);
|
80 | |
guint registration_id;
|
81 | |
|
82 | |
g_debug ("Registering cloud provider server 'MyCloud'\n");
|
83 | |
registration_id = g_dbus_connection_register_object (connection,
|
84 | |
CLOUD_PROVIDER_MANAGER_DBUS_PATH,
|
85 | |
priv->dbus_node_info->interfaces[0],
|
86 | |
&interface_vtable,
|
87 | |
self,
|
88 | |
NULL, /* user_data_free_func */
|
89 | |
NULL); /* GError** */
|
90 | |
g_assert (registration_id > 0);
|
91 | |
|
92 | |
/* In case some provider updated before adquiring the bus */
|
93 | |
cloud_provider_manager_update (CLOUD_PROVIDER_MANAGER (user_data));
|
94 | 67 |
}
|
95 | 68 |
|
96 | 69 |
static void
|
|
98 | 71 |
const gchar *name,
|
99 | 72 |
gpointer user_data)
|
100 | 73 |
{
|
|
74 |
CloudProviderManager *self = user_data;
|
|
75 |
CloudProviderManagerPrivate *priv = cloud_provider_manager_get_instance_private (CLOUD_PROVIDER_MANAGER (user_data));
|
|
76 |
g_signal_connect_swapped (priv->skeleton,
|
|
77 |
"handle-cloud-provider-changed",
|
|
78 |
G_CALLBACK(cloud_provider_manager_update),
|
|
79 |
self);
|
|
80 |
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (priv->skeleton),
|
|
81 |
connection,
|
|
82 |
CLOUD_PROVIDER_MANAGER_DBUS_PATH,
|
|
83 |
NULL);
|
101 | 84 |
}
|
102 | 85 |
|
103 | 86 |
static void
|
|
105 | 88 |
const gchar *name,
|
106 | 89 |
gpointer user_data)
|
107 | 90 |
{
|
|
91 |
CloudProviderManagerPrivate *priv = cloud_provider_manager_get_instance_private (CLOUD_PROVIDER_MANAGER (user_data));
|
|
92 |
g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(priv->skeleton));
|
108 | 93 |
}
|
109 | 94 |
|
110 | 95 |
/**
|
|
119 | 104 |
if (self == NULL)
|
120 | 105 |
{
|
121 | 106 |
CloudProviderManagerPrivate *priv;
|
122 | |
|
123 | 107 |
self = g_object_new (TYPE_CLOUD_PROVIDER_MANAGER, NULL);
|
124 | |
priv = cloud_provider_manager_get_instance_private (CLOUD_PROVIDER_MANAGER (self));
|
125 | |
|
126 | |
/* Export the interface we listen to, so clients can request properties of
|
127 | |
* the cloud provider such as name, status or icon */
|
128 | |
priv->dbus_node_info = g_dbus_node_info_new_for_xml (manager_xml, NULL);
|
129 | |
g_assert (priv->dbus_node_info != NULL);
|
130 | |
|
|
108 |
priv = cloud_provider_manager_get_instance_private (CLOUD_PROVIDER_MANAGER(self));
|
131 | 109 |
priv->dbus_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
|
132 | 110 |
CLOUD_PROVIDER_MANAGER_DBUS_NAME,
|
133 | 111 |
G_BUS_NAME_OWNER_FLAGS_NONE,
|
|
136 | 114 |
on_name_lost,
|
137 | 115 |
self,
|
138 | 116 |
NULL);
|
|
117 |
priv->skeleton = cloud_provider_manager1_skeleton_new ();
|
139 | 118 |
return CLOUD_PROVIDER_MANAGER (self);
|
140 | 119 |
}
|
141 | 120 |
else
|
|
192 | 171 |
CloudProviderManagerPrivate *priv = cloud_provider_manager_get_instance_private (manager);
|
193 | 172 |
|
194 | 173 |
return priv->providers;
|
195 | |
}
|
196 | |
|
197 | |
static void
|
198 | |
on_cloud_provider_changed (CloudProvider *cloud_provider,
|
199 | |
CloudProviderManager *self)
|
200 | |
{
|
201 | |
GIcon *icon;
|
202 | |
gchar *name;
|
203 | |
guint status;
|
204 | |
|
205 | |
name = cloud_provider_get_name (cloud_provider);
|
206 | |
icon = cloud_provider_get_icon (cloud_provider);
|
207 | |
status = cloud_provider_get_status (cloud_provider);
|
208 | |
if (name == NULL || icon == NULL || status == CLOUD_PROVIDER_STATUS_INVALID)
|
209 | |
return;
|
210 | |
|
211 | |
g_signal_emit_by_name (self, "changed", NULL);
|
212 | 174 |
}
|
213 | 175 |
|
214 | 176 |
static void
|