2 * Purple's oscar protocol plugin
3 * This file is the legal property of its developers.
4 * Please see the AUTHORS file distributed alongside this file.
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 of the License, or (at your option) any later version.
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.
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 Street, Fifth Floor, Boston, MA 02111-1301 USA
23 typedef struct _SnacHandler SnacHandler
;
29 aim_rxcallback_t handler
;
34 * Allocates a new OscarData and initializes it with default values.
43 od
= g_new0(OscarData
, 1);
46 od
->snacid_next
= 0x00000001;
47 od
->buddyinfo
= g_hash_table_new_full(g_str_hash
, g_str_equal
, g_free
, g_free
);
48 od
->handlerlist
= g_hash_table_new_full(g_direct_hash
, g_direct_equal
, NULL
, g_free
);
50 od
->ssi
.local
.idx_gid_bid
= g_hash_table_new(g_direct_hash
, g_direct_equal
);
51 od
->ssi
.local
.idx_all_named_items
= g_hash_table_new_full(g_str_hash
, g_str_equal
, g_free
, NULL
);
53 od
->ssi
.official
.idx_gid_bid
= g_hash_table_new(g_direct_hash
, g_direct_equal
);
54 od
->ssi
.official
.idx_all_named_items
= g_hash_table_new_full(g_str_hash
, g_str_equal
, g_free
, NULL
);
57 * Register all the modules for this session...
59 aim__registermodule(od
, misc_modfirst
); /* load the catch-all first */
60 aim__registermodule(od
, service_modfirst
);
61 aim__registermodule(od
, locate_modfirst
);
62 aim__registermodule(od
, buddylist_modfirst
);
63 aim__registermodule(od
, msg_modfirst
);
64 aim__registermodule(od
, admin_modfirst
);
65 aim__registermodule(od
, popups_modfirst
);
66 aim__registermodule(od
, bos_modfirst
);
67 aim__registermodule(od
, search_modfirst
);
68 aim__registermodule(od
, stats_modfirst
);
69 aim__registermodule(od
, chatnav_modfirst
);
70 aim__registermodule(od
, chat_modfirst
);
71 aim__registermodule(od
, bart_modfirst
);
72 /* missing 0x11 - 0x12 */
73 aim__registermodule(od
, ssi_modfirst
);
75 aim__registermodule(od
, icq_modfirst
);
77 /* auth_modfirst is only needed if we're connecting with the old-style BUCP login */
78 aim__registermodule(od
, auth_modfirst
);
79 aim__registermodule(od
, email_modfirst
);
81 msg
= g_string_new("Registered modules: ");
82 for (cur
= od
->modlistv
; cur
; cur
= cur
->next
) {
83 g_string_append_printf(
85 "%s (family=0x%04x, version=0x%04x, toolid=0x%04x, toolversion=0x%04x), ",
92 purple_debug_misc("oscar", "%s\n", msg
->str
);
93 g_string_free(msg
, TRUE
);
99 * Logoff and deallocate a session.
101 * @param od Session to kill
104 oscar_data_destroy(OscarData
*od
)
106 aim_cleansnacs(od
, -1);
108 /* Only used when connecting with clientLogin */
109 purple_http_conn_cancel(od
->hc
);
111 while (od
->requesticon
)
113 g_free(od
->requesticon
->data
);
114 od
->requesticon
= g_slist_delete_link(od
->requesticon
, od
->requesticon
);
119 if (od
->getblisttimer
> 0)
120 g_source_remove(od
->getblisttimer
);
121 while (od
->oscar_connections
!= NULL
)
122 flap_connection_destroy(od
->oscar_connections
->data
,
123 OSCAR_DISCONNECT_DONE
, NULL
);
125 while (od
->peer_connections
!= NULL
)
126 peer_connection_destroy(od
->peer_connections
->data
,
127 OSCAR_DISCONNECT_LOCAL_CLOSED
, NULL
);
129 aim__shutdownmodules(od
);
131 g_hash_table_destroy(od
->buddyinfo
);
132 g_hash_table_destroy(od
->handlerlist
);
134 g_hash_table_destroy(od
->ssi
.local
.idx_gid_bid
);
135 g_hash_table_destroy(od
->ssi
.local
.idx_all_named_items
);
137 g_hash_table_destroy(od
->ssi
.official
.idx_gid_bid
);
138 g_hash_table_destroy(od
->ssi
.official
.idx_all_named_items
);
144 oscar_data_addhandler(OscarData
*od
, guint16 family
, guint16 subtype
, aim_rxcallback_t newhandler
, guint16 flags
)
146 SnacHandler
*snac_handler
;
148 snac_handler
= g_new0(SnacHandler
, 1);
150 snac_handler
->family
= family
;
151 snac_handler
->subtype
= subtype
;
152 snac_handler
->flags
= flags
;
153 snac_handler
->handler
= newhandler
;
155 g_hash_table_insert(od
->handlerlist
,
156 GUINT_TO_POINTER((family
<< 16) + subtype
),
161 aim_callhandler(OscarData
*od
, guint16 family
, guint16 subtype
)
163 SnacHandler
*snac_handler
;
165 snac_handler
= g_hash_table_lookup(od
->handlerlist
, GUINT_TO_POINTER((family
<< 16) + subtype
));
167 return snac_handler
? snac_handler
->handler
: NULL
;