1 /*
2 * wocky-session.c - Source for WockySession
3 * Copyright (C) 2009 Collabora Ltd.
4 * @author Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * SECTION: wocky-session
23 * @title: WockySession
24 * @short_description:
25 * @include: wocky/wocky-session.h
26 *
27 */
28
29 #ifdef HAVE_CONFIG_H
30 #include "config.h"
31 #endif
32
33 #include "wocky-session.h"
34
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <string.h>
38
39 #ifdef HAVE_UNISTD_H
40 # include <unistd.h>
41 #endif
42
43 #include "wocky-signals-marshal.h"
44 #include "wocky-utils.h"
45 #include "wocky-c2s-porter.h"
46 #include "wocky-meta-porter.h"
47
48 G_DEFINE_TYPE (WockySession, wocky_session, G_TYPE_OBJECT)
49
50 /* properties */
51 enum
52 {
53 PROP_CONNECTION = 1,
54 PROP_PORTER,
55 PROP_CONTACT_FACTORY,
56 PROP_FULL_JID,
57 };
58
59 /* signal enum */
60 enum
61 {
62 LAST_SIGNAL,
63 };
64
65 /*
66 static guint signals[LAST_SIGNAL] = {0};
67 */
68
69 /* private structure */
70 struct _WockySessionPrivate
71 {
72 gboolean dispose_has_run;
73
74 gchar *full_jid;
75 WockyXmppConnection *connection;
76 WockyPorter *porter;
77 WockyContactFactory *contact_factory;
78 };
79
80 static void
wocky_session_init(WockySession * self)81 wocky_session_init (WockySession *self)
82 {
83 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, WOCKY_TYPE_SESSION,
84 WockySessionPrivate);
85
86 self->priv->contact_factory = wocky_contact_factory_new ();
87 }
88
89 static void
wocky_session_set_property(GObject * object,guint property_id,const GValue * value,GParamSpec * pspec)90 wocky_session_set_property (GObject *object,
91 guint property_id,
92 const GValue *value,
93 GParamSpec *pspec)
94 {
95 WockySession *self = WOCKY_SESSION (object);
96 WockySessionPrivate *priv = self->priv;
97
98 switch (property_id)
99 {
100 case PROP_CONNECTION:
101 priv->connection = g_value_dup_object (value);
102 break;
103
104 case PROP_FULL_JID:
105 priv->full_jid = g_value_dup_string (value);
106 break;
107
108 default:
109 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
110 break;
111 }
112 }
113
114 static void
wocky_session_get_property(GObject * object,guint property_id,GValue * value,GParamSpec * pspec)115 wocky_session_get_property (GObject *object,
116 guint property_id,
117 GValue *value,
118 GParamSpec *pspec)
119 {
120 WockySession *self = WOCKY_SESSION (object);
121 WockySessionPrivate *priv = self->priv;
122
123 switch (property_id)
124 {
125 case PROP_CONNECTION:
126 g_value_set_object (value, priv->connection);
127 break;
128
129 case PROP_PORTER:
130 g_value_set_object (value, priv->porter);
131 break;
132
133 case PROP_CONTACT_FACTORY:
134 g_value_set_object (value, priv->contact_factory);
135 break;
136
137 case PROP_FULL_JID:
138 g_value_set_string (value, priv->full_jid);
139 break;
140
141 default:
142 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
143 break;
144 }
145 }
146
147 static void
wocky_session_constructed(GObject * object)148 wocky_session_constructed (GObject *object)
149 {
150 WockySession *self = WOCKY_SESSION (object);
151 WockySessionPrivate *priv = self->priv;
152
153 if (priv->connection != NULL)
154 priv->porter = wocky_c2s_porter_new (priv->connection, priv->full_jid);
155 else
156 priv->porter = wocky_meta_porter_new (priv->full_jid, priv->contact_factory);
157 }
158
159 static void
wocky_session_dispose(GObject * object)160 wocky_session_dispose (GObject *object)
161 {
162 WockySession *self = WOCKY_SESSION (object);
163 WockySessionPrivate *priv = self->priv;
164
165 if (priv->dispose_has_run)
166 return;
167
168 priv->dispose_has_run = TRUE;
169
170 if (priv->connection != NULL)
171 {
172 g_object_unref (priv->connection);
173 priv->connection = NULL;
174 }
175
176 g_object_unref (priv->porter);
177 g_object_unref (priv->contact_factory);
178
179 if (G_OBJECT_CLASS (wocky_session_parent_class)->dispose)
180 G_OBJECT_CLASS (wocky_session_parent_class)->dispose (object);
181 }
182
183 static void
wocky_session_finalize(GObject * object)184 wocky_session_finalize (GObject *object)
185 {
186 WockySession *self = WOCKY_SESSION (object);
187
188 g_free (self->priv->full_jid);
189
190 G_OBJECT_CLASS (wocky_session_parent_class)->finalize (object);
191 }
192
193 static void
wocky_session_class_init(WockySessionClass * wocky_session_class)194 wocky_session_class_init (WockySessionClass *wocky_session_class)
195 {
196 GObjectClass *object_class = G_OBJECT_CLASS (wocky_session_class);
197 GParamSpec *spec;
198
199 g_type_class_add_private (wocky_session_class,
200 sizeof (WockySessionPrivate));
201
202 object_class->constructed = wocky_session_constructed;
203 object_class->set_property = wocky_session_set_property;
204 object_class->get_property = wocky_session_get_property;
205 object_class->dispose = wocky_session_dispose;
206 object_class->finalize = wocky_session_finalize;
207
208 spec = g_param_spec_object ("connection", "Connection",
209 "The WockyXmppConnection associated with this session",
210 WOCKY_TYPE_XMPP_CONNECTION,
211 G_PARAM_READWRITE |
212 G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
213 g_object_class_install_property (object_class, PROP_CONNECTION, spec);
214
215 spec = g_param_spec_object ("porter", "Porter",
216 "The WockyPorter associated with this session",
217 WOCKY_TYPE_PORTER,
218 G_PARAM_READABLE |
219 G_PARAM_STATIC_STRINGS);
220 g_object_class_install_property (object_class, PROP_PORTER, spec);
221
222 spec = g_param_spec_object ("contact-factory", "Contact factory",
223 "The WockyContactFactory associated with this session",
224 WOCKY_TYPE_CONTACT_FACTORY,
225 G_PARAM_READABLE |
226 G_PARAM_STATIC_STRINGS);
227 g_object_class_install_property (object_class, PROP_CONTACT_FACTORY, spec);
228
229 spec = g_param_spec_string ("full-jid", "Full JID",
230 "The user's JID in this session", NULL,
231 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
232 g_object_class_install_property (object_class, PROP_FULL_JID, spec);
233 }
234
235 WockySession *
wocky_session_new_with_connection(WockyXmppConnection * conn,const gchar * full_jid)236 wocky_session_new_with_connection (WockyXmppConnection *conn,
237 const gchar *full_jid)
238 {
239 g_return_val_if_fail (WOCKY_IS_XMPP_CONNECTION (conn), NULL);
240 g_return_val_if_fail (full_jid != NULL, NULL);
241
242 return g_object_new (WOCKY_TYPE_SESSION,
243 "connection", conn,
244 "full-jid", full_jid,
245 NULL);
246 }
247
248 WockySession *
wocky_session_new_ll(const gchar * full_jid)249 wocky_session_new_ll (const gchar *full_jid)
250 {
251 return g_object_new (WOCKY_TYPE_SESSION,
252 "full-jid", full_jid,
253 NULL);
254 }
255
wocky_session_start(WockySession * self)256 void wocky_session_start (WockySession *self)
257 {
258 WockySessionPrivate *priv = self->priv;
259
260 wocky_porter_start (priv->porter);
261 }
262
263 WockyPorter *
wocky_session_get_porter(WockySession * self)264 wocky_session_get_porter (WockySession *self)
265 {
266 WockySessionPrivate *priv = self->priv;
267
268 return priv->porter;
269 }
270
271 WockyContactFactory *
wocky_session_get_contact_factory(WockySession * self)272 wocky_session_get_contact_factory (WockySession *self)
273 {
274 WockySessionPrivate *priv = self->priv;
275
276 return priv->contact_factory;
277 }
278
279 void
wocky_session_set_jid(WockySession * self,const gchar * jid)280 wocky_session_set_jid (WockySession *self,
281 const gchar *jid)
282 {
283 WockySessionPrivate *priv = self->priv;
284
285 g_free (priv->full_jid);
286 priv->full_jid = g_strdup (jid);
287
288 if (WOCKY_IS_META_PORTER (priv->porter))
289 {
290 wocky_meta_porter_set_jid (WOCKY_META_PORTER (priv->porter),
291 priv->full_jid);
292 }
293 }
294
295 const gchar *
wocky_session_get_jid(WockySession * self)296 wocky_session_get_jid (WockySession *self)
297 {
298 WockySessionPrivate *priv = self->priv;
299
300 return priv->full_jid;
301 }
302