2 * @file purple-groupchat.c
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
29 #include "sipe-common.h"
31 #include "conversation.h"
35 #include "sipe-backend.h"
36 #include "sipe-core.h"
39 #include "purple-private.h"
41 GList
*sipe_purple_chat_info(SIPE_UNUSED_PARAMETER PurpleConnection
*gc
)
44 struct proto_chat_entry
*pce
;
46 pce
= g_new0(struct proto_chat_entry
, 1);
47 pce
->label
= _("_URI:");
48 pce
->identifier
= "uri";
50 m
= g_list_append(m
, pce
);
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
) :
75 PurpleConversation
*conv
= purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT
,
77 purple_private
->account
);
78 /* Group Chat rooms have a valid URI */
80 g_hash_table_insert(defaults
, "uri", (gpointer
)uri
);
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....
91 g_hash_table_insert(defaults
,
92 SIPE_PURPLE_COMPONENT_KEY_CONVERSATION
,
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");
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
,
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
,
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
);
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
);
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
,
187 const gchar
*description
,
191 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
192 PurpleRoomlist
*roomlist
= purple_private
->roomlist
;
194 PurpleRoomlistRoom
*room
= purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM
,
197 /* The order needs to be kept in-sync with sipe_roomlist_get_list() */
198 purple_roomlist_room_add_field(roomlist
, room
,
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
,
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
;
224 purple_roomlist_set_in_progress(roomlist
, FALSE
);
225 purple_roomlist_unref(roomlist
);
226 purple_private
->roomlist
= NULL
;