Thu, 22 May 2003 01:31:56 +0000
[gaim-migrate @ 5871]
Fixed our support for the standard. I misread the discussion and used an
alternative proposal. So now we use the new, correct one.
Basically, what this means to the users is that 0.64 users will still see
0.63 MSN buddy icons, but 0.63 won't see 0.64's. No big deal.
| 5309 | 1 | /** |
| 2 | * @file session.c MSN session functions | |
| 3 | * | |
| 4 | * gaim | |
| 5 | * | |
| 6 | * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> | |
| 7 | * | |
| 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. | |
| 12 | * | |
| 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. | |
| 17 | * | |
| 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 | |
| 21 | */ | |
| 22 | #include "msn.h" | |
| 23 | #include "session.h" | |
| 24 | #include "dispatch.h" | |
| 25 | ||
| 26 | MsnSession * | |
| 27 | msn_session_new(struct gaim_account *account, const char *server, int port) | |
| 28 | { | |
| 29 | MsnSession *session; | |
| 30 | ||
| 31 | g_return_val_if_fail(account != NULL, NULL); | |
| 32 | ||
| 33 | session = g_new0(MsnSession, 1); | |
| 34 | ||
| 35 | session->account = account; | |
| 36 | session->dispatch_server = g_strdup(server); | |
| 37 | session->dispatch_port = port; | |
| 38 | ||
| 39 | session->users = msn_users_new(); | |
| 40 | ||
| 41 | return session; | |
| 42 | } | |
| 43 | ||
| 44 | void | |
| 45 | msn_session_destroy(MsnSession *session) | |
| 46 | { | |
| 47 | g_return_if_fail(session != NULL); | |
| 48 | ||
| 49 | if (session->connected) | |
| 50 | msn_session_disconnect(session); | |
| 51 | ||
| 52 | if (session->dispatch_server != NULL) | |
| 53 | g_free(session->dispatch_server); | |
| 54 | ||
| 55 | while (session->switches != NULL) | |
| 56 | msn_switchboard_destroy(session->switches->data); | |
| 57 | ||
| 58 | while (session->lists.forward) | |
| 59 | msn_user_destroy(session->lists.forward->data); | |
| 60 | ||
|
5318
2073a19f4217
[gaim-migrate @ 5690]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
61 | if (session->group_ids) g_hash_table_destroy(session->group_ids); |
|
2073a19f4217
[gaim-migrate @ 5690]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
62 | if (session->group_names) g_hash_table_destroy(session->group_names); |
|
2073a19f4217
[gaim-migrate @ 5690]
Christian Hammond <chipx86@chipx86.com>
parents:
5309
diff
changeset
|
63 | |
| 5309 | 64 | g_slist_free(session->lists.allow); |
| 65 | g_slist_free(session->lists.block); | |
| 66 | ||
| 67 | msn_users_destroy(session->users); | |
| 68 | ||
|
5427
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5354
diff
changeset
|
69 | g_free(session->passport_info.kv); |
|
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5354
diff
changeset
|
70 | g_free(session->passport_info.sid); |
|
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5354
diff
changeset
|
71 | g_free(session->passport_info.mspauth); |
|
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5354
diff
changeset
|
72 | g_free(session->passport_info.file); |
|
a45fa07ef20d
[gaim-migrate @ 5806]
Mark Doliner <markdoliner@pidgin.im>
parents:
5354
diff
changeset
|
73 | |
| 5309 | 74 | g_free(session); |
| 75 | } | |
| 76 | ||
| 77 | gboolean | |
| 78 | msn_session_connect(MsnSession *session) | |
| 79 | { | |
| 80 | g_return_val_if_fail(session != NULL, FALSE); | |
| 81 | g_return_val_if_fail(!session->connected, TRUE); | |
| 82 | ||
| 83 | session->connected = TRUE; | |
| 84 | ||
| 85 | session->dispatch_conn = msn_dispatch_new(session, | |
| 86 | session->dispatch_server, | |
| 87 | session->dispatch_port); | |
| 88 | ||
| 89 | if (msn_servconn_connect(session->dispatch_conn)) | |
| 90 | return TRUE; | |
| 91 | ||
| 92 | return FALSE; | |
| 93 | } | |
| 94 | ||
| 95 | void | |
| 96 | msn_session_disconnect(MsnSession *session) | |
| 97 | { | |
| 98 | g_return_if_fail(session != NULL); | |
| 99 | g_return_if_fail(session->connected); | |
| 100 | ||
| 101 | if (session->dispatch_conn != NULL) { | |
| 102 | msn_servconn_destroy(session->dispatch_conn); | |
| 103 | session->dispatch_conn = NULL; | |
| 104 | } | |
| 105 | ||
| 106 | while (session->switches != NULL) { | |
| 107 | MsnSwitchBoard *board = (MsnSwitchBoard *)session->switches->data; | |
| 108 | ||
| 109 | msn_switchboard_destroy(board); | |
| 110 | } | |
| 111 | ||
| 112 | if (session->notification_conn != NULL) { | |
| 113 | msn_servconn_destroy(session->notification_conn); | |
| 114 | session->notification_conn = NULL; | |
| 115 | } | |
| 116 | } | |
| 117 | ||
| 118 | MsnSwitchBoard * | |
| 119 | msn_session_open_switchboard(MsnSession *session) | |
| 120 | { | |
| 121 | MsnSwitchBoard *swboard; | |
| 122 | ||
| 123 | g_return_val_if_fail(session != NULL, NULL); | |
| 124 | ||
| 125 | if (msn_servconn_send_command(session->notification_conn, | |
| 126 | "XFR", "SB") < 0) { | |
| 127 | return NULL; | |
| 128 | } | |
| 129 | ||
| 130 | swboard = msn_switchboard_new(session); | |
| 131 | ||
| 132 | return swboard; | |
| 133 | } | |
| 134 | ||
| 135 | MsnSwitchBoard * | |
| 136 | msn_session_find_switch_with_passport(const MsnSession *session, | |
| 137 | const char *passport) | |
| 138 | { | |
| 139 | GList *l; | |
| 140 | MsnSwitchBoard *swboard; | |
| 141 | ||
| 142 | g_return_val_if_fail(session != NULL, NULL); | |
| 143 | g_return_val_if_fail(passport != NULL, NULL); | |
| 144 | ||
| 145 | for (l = session->switches; l != NULL; l = l->next) { | |
| 146 | swboard = (MsnSwitchBoard *)l->data; | |
| 147 | ||
|
5351
cb12105b532b
[gaim-migrate @ 5727]
Christian Hammond <chipx86@chipx86.com>
parents:
5318
diff
changeset
|
148 | if (!swboard->hidden && |
|
cb12105b532b
[gaim-migrate @ 5727]
Christian Hammond <chipx86@chipx86.com>
parents:
5318
diff
changeset
|
149 | !g_ascii_strcasecmp(passport, |
| 5309 | 150 | msn_user_get_passport(swboard->user))) { |
| 151 | return swboard; | |
| 152 | } | |
| 153 | } | |
| 154 | ||
| 155 | return NULL; | |
| 156 | } | |
| 157 | ||
| 158 | MsnSwitchBoard * | |
| 159 | msn_session_find_switch_with_id(const MsnSession *session, int chat_id) | |
| 160 | { | |
| 161 | GList *l; | |
| 162 | MsnSwitchBoard *swboard; | |
| 163 | ||
| 164 | g_return_val_if_fail(session != NULL, NULL); | |
| 165 | g_return_val_if_fail(chat_id > 0, NULL); | |
| 166 | ||
| 167 | for (l = session->switches; l != NULL; l = l->next) { | |
| 168 | swboard = (MsnSwitchBoard *)l->data; | |
| 169 | ||
| 170 | if (swboard->chat_id == chat_id) | |
| 171 | return swboard; | |
| 172 | } | |
| 173 | ||
| 174 | return NULL; | |
| 175 | } | |
| 176 | ||
| 177 | MsnSwitchBoard * | |
| 178 | msn_session_find_unused_switch(const MsnSession *session) | |
| 179 | { | |
| 180 | GList *l; | |
| 181 | MsnSwitchBoard *swboard; | |
| 182 | ||
| 183 | g_return_val_if_fail(session != NULL, NULL); | |
| 184 | ||
| 185 | for (l = session->switches; l != NULL; l = l->next) { | |
| 186 | swboard = (MsnSwitchBoard *)l->data; | |
| 187 | ||
|
5354
c44faf286b70
[gaim-migrate @ 5730]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
188 | if (!swboard->in_use) |
| 5309 | 189 | return swboard; |
| 190 | } | |
| 191 | ||
| 192 | return NULL; | |
| 193 | } | |
| 194 |