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