ucs: fix Persona key extraction
[siplcs.git] / src / purple / purple-groupchat.c
blobaf59b9df5525ca26bb782e83be2833f083619a5a
1 /**
2 * @file purple-groupchat.c
4 * pidgin-sipe
6 * Copyright (C) 2010 SIPE Project <http://sipe.sourceforge.net/>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
27 #include <glib.h>
29 #include "sipe-common.h"
31 #include "conversation.h"
32 #include "roomlist.h"
33 #include "version.h"
35 #include "sipe-backend.h"
36 #include "sipe-core.h"
37 #include "sipe-nls.h"
39 #include "purple-private.h"
41 GList *sipe_purple_chat_info(SIPE_UNUSED_PARAMETER PurpleConnection *gc)
43 GList *m = NULL;
44 struct proto_chat_entry *pce;
46 pce = g_new0(struct proto_chat_entry, 1);
47 pce->label = _("_URI:");
48 pce->identifier = "uri";
49 pce->required = TRUE;
50 m = g_list_append(m, pce);
52 return m;
55 /**
56 * This callback is called for two reasons:
58 * a) generate the defaults for the "Add chat..." dialog initiated from the
59 * roomlist (applies only to group chat)
60 * b) generate the components for the creation of a PurpleChat object
63 GHashTable *sipe_purple_chat_info_defaults(PurpleConnection *gc,
64 const char *chat_name)
66 GHashTable *defaults = g_hash_table_new(g_str_hash, g_str_equal);
68 if (chat_name != NULL) {
69 struct sipe_core_public *sipe_public = PURPLE_GC_TO_SIPE_CORE_PUBLIC;
70 struct sipe_backend_private *purple_private = sipe_public->backend_private;
71 GHashTable *uri_map = purple_private->roomlist_map;
72 const gchar *uri = uri_map != NULL ?
73 g_hash_table_lookup(uri_map, chat_name) :
74 NULL;
75 PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,
76 chat_name,
77 purple_private->account);
78 /* Group Chat rooms have a valid URI */
79 if (uri) {
80 g_hash_table_insert(defaults, "uri", (gpointer)uri);
83 /**
84 * Remember the PurpleConversation
86 * libpurple API is so brain-dead that we don't receive this
87 * information when it is known and we need it. Make our life
88 * easier by remembering it here for later lookup....
90 if (conv) {
91 g_hash_table_insert(defaults,
92 SIPE_PURPLE_COMPONENT_KEY_CONVERSATION,
93 conv);
97 return defaults;
100 void sipe_purple_chat_join(PurpleConnection *gc, GHashTable *data)
102 struct sipe_core_public *sipe_public = PURPLE_GC_TO_SIPE_CORE_PUBLIC;
103 const gchar *uri = g_hash_table_lookup(data, "uri");
105 if (uri) {
106 SIPE_DEBUG_INFO("sipe_purple_chat_join: uri '%s'", uri);
107 sipe_core_groupchat_join(sipe_public, uri);
111 PurpleRoomlist *sipe_purple_roomlist_get_list(PurpleConnection *gc)
113 struct sipe_core_public *sipe_public = PURPLE_GC_TO_SIPE_CORE_PUBLIC;
114 struct sipe_backend_private *purple_private = sipe_public->backend_private;
115 PurpleAccount *account = purple_private->account;
116 PurpleRoomlist *roomlist;
117 GList *fields = NULL;
118 PurpleRoomlistField *f;
120 SIPE_DEBUG_INFO_NOFORMAT("sipe_purple_roomlist_get_list");
122 if (purple_private->roomlist)
123 purple_roomlist_unref(purple_private->roomlist);
124 if (purple_private->roomlist_map)
125 g_hash_table_destroy(purple_private->roomlist_map);
127 purple_private->roomlist = roomlist = purple_roomlist_new(account);
128 purple_private->roomlist_map = g_hash_table_new_full(g_str_hash,
129 g_str_equal,
130 g_free, g_free);
132 /* The order needs to be kept in-sync with sipe_backend_groupchat_room_add() */
133 f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING,
134 "", "uri", TRUE);
135 fields = g_list_append(fields, f);
136 f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_INT,
137 _("Users"), "users", FALSE);
138 fields = g_list_append(fields, f);
139 f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_BOOL,
140 _("Invite"), "invite", FALSE);
141 fields = g_list_append(fields, f);
142 f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_BOOL,
143 _("Private"), "private", FALSE);
144 fields = g_list_append(fields, f);
145 f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_BOOL,
146 _("Log"), "logged", FALSE);
147 fields = g_list_append(fields, f);
148 f = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING,
149 _("Description"), "description", FALSE);
150 fields = g_list_append(fields, f);
152 purple_roomlist_set_fields(roomlist, fields);
153 purple_roomlist_set_in_progress(roomlist, TRUE);
155 if (!sipe_core_groupchat_query_rooms(sipe_public)) {
156 sipe_purple_roomlist_cancel(roomlist);
157 roomlist = NULL;
160 return roomlist;
163 void sipe_purple_roomlist_cancel(PurpleRoomlist *roomlist)
165 PurpleAccount *account =
166 #if PURPLE_VERSION_CHECK(3,0,0)
167 purple_roomlist_get_account(roomlist);
168 #else
169 roomlist->account;
170 #endif
171 struct sipe_core_public *sipe_public = PURPLE_ACCOUNT_TO_SIPE_CORE_PUBLIC;
172 struct sipe_backend_private *purple_private = sipe_public->backend_private;
174 SIPE_DEBUG_INFO_NOFORMAT("sipe_purple_roomlist_cancel");
176 purple_roomlist_set_in_progress(roomlist, FALSE);
178 if (purple_private->roomlist == roomlist) {
179 purple_roomlist_unref(roomlist);
180 purple_private->roomlist = NULL;
184 void sipe_backend_groupchat_room_add(struct sipe_core_public *sipe_public,
185 const gchar *uri,
186 const gchar *name,
187 const gchar *description,
188 guint users,
189 guint32 flags)
191 struct sipe_backend_private *purple_private = sipe_public->backend_private;
192 PurpleRoomlist *roomlist = purple_private->roomlist;
193 if (roomlist) {
194 PurpleRoomlistRoom *room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM,
195 name, NULL);
197 /* The order needs to be kept in-sync with sipe_roomlist_get_list() */
198 purple_roomlist_room_add_field(roomlist, room,
199 uri);
200 purple_roomlist_room_add_field(roomlist, room,
201 GUINT_TO_POINTER(users));
202 purple_roomlist_room_add_field(roomlist, room,
203 GUINT_TO_POINTER(flags & SIPE_GROUPCHAT_ROOM_INVITE));
204 purple_roomlist_room_add_field(roomlist, room,
205 GUINT_TO_POINTER(flags & SIPE_GROUPCHAT_ROOM_PRIVATE));
206 purple_roomlist_room_add_field(roomlist, room,
207 GUINT_TO_POINTER(flags & SIPE_GROUPCHAT_ROOM_LOGGED));
208 purple_roomlist_room_add_field(roomlist, room,
209 description);
211 /* libpurple API only gives us the channel name */
212 g_hash_table_insert(purple_private->roomlist_map,
213 g_strdup(name), g_strdup(uri));
215 purple_roomlist_room_add(roomlist, room);
219 void sipe_backend_groupchat_room_terminate(struct sipe_core_public *sipe_public)
221 struct sipe_backend_private *purple_private = sipe_public->backend_private;
222 PurpleRoomlist *roomlist = purple_private->roomlist;
223 if (roomlist) {
224 purple_roomlist_set_in_progress(roomlist, FALSE);
225 purple_roomlist_unref(roomlist);
226 purple_private->roomlist = NULL;
231 Local Variables:
232 mode: c
233 c-file-style: "bsd"
234 indent-tabs-mode: t
235 tab-width: 8
236 End: