Sat, 04 Feb 2006 20:55:52 +0000
[gaim-migrate @ 15481]
This adds support for displaying log timestamps in their original timezone. If your OS's definition of struct tm sucks, then the log timestamps will show up in your local timezone, but converted, so the time is accurate. Yay! Anyway, this all works, as I've renamed lots of my log files locally, but currently, there's no code to save new logs in this name format. That's held up on a portability issue and backwards compatibility issue.
| 8675 | 1 | /* |
| 2 | * nmevent.c | |
| 3 | * | |
|
8933
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
4 | * Copyright (c) 2004 Novell, Inc. All Rights Reserved. |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
5 | * |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
6 | * This program is free software; you can redistribute it and/or modify |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
7 | * it under the terms of the GNU General Public License as published by |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
8 | * the Free Software Foundation; version 2 of the License. |
| 8675 | 9 | * |
|
8933
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
10 | * This program is distributed in the hope that it will be useful, |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
13 | * GNU General Public License for more details. |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
14 | * |
|
8933
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
15 | * You should have received a copy of the GNU General Public License |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
16 | * along with this program; if not, write to the Free Software |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 8675 | 18 | * |
| 19 | */ | |
| 20 | ||
| 21 | #include <glib.h> | |
| 22 | #include <string.h> | |
| 23 | #include <time.h> | |
| 24 | #include "nmevent.h" | |
| 25 | #include "nmfield.h" | |
| 26 | #include "nmconn.h" | |
| 27 | #include "nmuserrecord.h" | |
|
9268
196cbf2cae4c
[gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
8933
diff
changeset
|
28 | #include "nmrtf.h" |
| 8675 | 29 | |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
30 | #define MAX_UINT32 0xFFFFFFFF |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
31 | |
| 8675 | 32 | struct _NMEvent |
| 33 | { | |
| 34 | ||
| 35 | /* Event type */ | |
| 36 | int type; | |
| 37 | ||
| 38 | /* The DN of the event source */ | |
| 39 | char *source; | |
| 40 | ||
| 41 | /* Timestamp of the event */ | |
| 42 | guint32 gmt; | |
| 43 | ||
| 44 | /* Conference to associate with the event */ | |
| 45 | NMConference *conference; | |
| 46 | ||
| 47 | /* User record to associate with the event */ | |
| 48 | NMUserRecord *user_record; | |
| 49 | ||
| 50 | /* Text associated with the event */ | |
| 51 | char *text; | |
| 52 | ||
| 53 | /* Reference count for event structure */ | |
| 54 | int ref_count; | |
| 55 | ||
| 56 | }; | |
| 57 | ||
| 58 | /* Handle getdetails response and set the new user record into the event */ | |
| 59 | static void | |
| 60 | _got_user_for_event(NMUser * user, NMERR_T ret_val, | |
| 61 | gpointer resp_data, gpointer user_data) | |
| 62 | { | |
| 63 | NMUserRecord *user_record; | |
| 64 | NMEvent *event; | |
| 65 | nm_event_cb cb; | |
| 66 | ||
| 67 | if (user == NULL) | |
| 68 | return; | |
| 69 | ||
| 70 | user_record = resp_data; | |
| 71 | event = user_data; | |
| 72 | ||
| 73 | if (ret_val == NM_OK) { | |
| 74 | if (event && user_record) { | |
| 75 | ||
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
76 | /* Add the user record to the event structure |
| 8675 | 77 | * and make the callback. |
| 78 | */ | |
| 79 | nm_event_set_user_record(event, user_record); | |
| 80 | if ((cb = nm_user_get_event_callback(user))) { | |
| 81 | cb(user, event); | |
| 82 | } | |
| 83 | } | |
| 84 | ||
| 85 | } else { | |
| 86 | /* Cleanup resp_data */ | |
| 87 | ||
| 88 | } | |
| 89 | ||
| 90 | /* Clean up */ | |
| 91 | if (event) | |
| 92 | nm_release_event(event); | |
| 93 | ||
| 94 | } | |
| 95 | ||
| 96 | /* Handle getdetails response, set the new user record into the event | |
| 97 | * and add the user record as a participant in the conference | |
| 98 | */ | |
| 99 | static void | |
| 100 | _got_user_for_conference(NMUser * user, NMERR_T ret_val, | |
| 101 | gpointer resp_data, gpointer user_data) | |
| 102 | { | |
| 103 | NMUserRecord *user_record = resp_data; | |
| 104 | NMEvent *event = user_data; | |
| 105 | NMConference *conference; | |
| 106 | nm_event_cb cb; | |
| 107 | ||
| 108 | if (user == NULL) | |
| 109 | return; | |
| 110 | ||
| 111 | if (event && user_record) { | |
| 112 | ||
| 113 | conference = nm_event_get_conference(event); | |
| 114 | if (conference) { | |
| 115 | ||
| 116 | /* Add source of event as recip of the conference */ | |
| 117 | nm_conference_add_participant(conference, user_record); | |
| 118 | ||
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
119 | /* Add the user record to the event structure |
| 8675 | 120 | * and make the callback. |
| 121 | */ | |
| 122 | nm_event_set_user_record(event, user_record); | |
| 123 | if ((cb = nm_user_get_event_callback(user))) { | |
| 124 | cb(user, event); | |
| 125 | } | |
| 126 | } | |
| 127 | } | |
| 128 | ||
| 129 | if (event) | |
| 130 | nm_release_event(event); | |
| 131 | } | |
| 132 | ||
| 133 | /* Read the receive message event, set up the event object, and | |
| 134 | * get details for the event source if we don't have them yet. | |
| 135 | */ | |
| 136 | static NMERR_T | |
| 137 | handle_receive_message(NMUser * user, NMEvent * event, gboolean autoreply) | |
| 138 | { | |
| 139 | NMConference *conference; | |
| 140 | NMUserRecord *user_record; | |
| 141 | NMConn *conn; | |
| 142 | NMERR_T rc = NM_OK; | |
| 143 | guint32 size = 0, flags = 0; | |
| 144 | char *msg = NULL; | |
| 145 | char *nortf = NULL; | |
| 146 | char *guid = NULL; | |
| 147 | ||
| 148 | conn = nm_user_get_conn(user); | |
| 149 | ||
| 150 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
151 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
152 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
153 | |
| 8675 | 154 | if (rc == NM_OK) { |
| 155 | guid = g_new0(char, size + 1); | |
| 156 | rc = nm_read_all(conn, guid, size); | |
| 157 | } | |
| 158 | ||
| 159 | /* Read the conference flags */ | |
| 160 | if (rc == NM_OK) { | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
161 | rc = nm_read_uint32(conn, &flags); |
| 8675 | 162 | } |
| 163 | ||
| 164 | /* Read the message text */ | |
| 165 | if (rc == NM_OK) { | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
166 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
167 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
168 | |
| 8675 | 169 | if (rc == NM_OK) { |
| 170 | msg = g_new0(char, size + 1); | |
| 171 | rc = nm_read_all(conn, msg, size); | |
| 172 | ||
| 173 | gaim_debug(GAIM_DEBUG_INFO, "novell", "Message is %s\n", msg); | |
| 174 | ||
| 175 | /* Auto replies are not in RTF format! */ | |
| 176 | if (!autoreply) { | |
|
9268
196cbf2cae4c
[gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
8933
diff
changeset
|
177 | NMRtfContext *ctx; |
| 8675 | 178 | |
|
9268
196cbf2cae4c
[gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
8933
diff
changeset
|
179 | ctx = nm_rtf_init(); |
|
196cbf2cae4c
[gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
8933
diff
changeset
|
180 | nortf = nm_rtf_strip_formatting(ctx, msg); |
|
196cbf2cae4c
[gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
8933
diff
changeset
|
181 | nm_rtf_deinit(ctx); |
| 8675 | 182 | |
| 183 | gaim_debug(GAIM_DEBUG_INFO, "novell", | |
| 184 | "Message without RTF is %s\n", nortf); | |
| 185 | ||
| 186 | /* Store the event data */ | |
| 187 | nm_event_set_text(event, nortf); | |
| 188 | ||
| 189 | } else { | |
| 190 | ||
| 191 | /* Store the event data */ | |
| 192 | nm_event_set_text(event, msg); | |
| 193 | } | |
| 194 | } | |
| 195 | } | |
| 196 | ||
| 197 | /* Check to see if we already know about the conference */ | |
| 198 | conference = nm_conference_list_find(user, guid); | |
| 199 | if (conference) { | |
| 200 | ||
| 201 | nm_conference_set_flags(conference, flags); | |
| 202 | nm_event_set_conference(event, conference); | |
| 203 | ||
| 204 | /* Add a reference to the user record in our event object */ | |
| 205 | user_record = nm_find_user_record(user, nm_event_get_source(event)); | |
| 206 | if (user_record) { | |
| 207 | nm_event_set_user_record(event, user_record); | |
| 208 | } | |
| 209 | ||
| 210 | } else { | |
| 211 | ||
| 212 | /* This is a new conference, so create one and add it to our list */ | |
| 213 | conference = nm_create_conference(guid); | |
| 214 | nm_conference_set_flags(conference, flags); | |
| 215 | ||
| 216 | /* Add a reference to the conference in the event */ | |
| 217 | nm_event_set_conference(event, conference); | |
| 218 | ||
| 219 | /* Add new conference to the conference list */ | |
| 220 | nm_conference_list_add(user, conference); | |
| 221 | ||
| 222 | /* Check to see if we have details for the event source yet */ | |
| 223 | user_record = nm_find_user_record(user, nm_event_get_source(event)); | |
| 224 | if (user_record) { | |
| 225 | ||
| 226 | /* We do so add the user record as a recipient of the conference */ | |
| 227 | nm_conference_add_participant(conference, user_record); | |
| 228 | ||
| 229 | /* Add a reference to the user record in our event object */ | |
| 230 | nm_event_set_user_record(event, user_record); | |
| 231 | ||
| 232 | } else { | |
| 233 | ||
| 234 | /* Need to go to the server to get details for the user */ | |
| 235 | rc = nm_send_get_details(user, nm_event_get_source(event), | |
| 236 | _got_user_for_conference, event); | |
| 237 | if (rc == NM_OK) | |
| 238 | rc = -1; /* Not done processing the event yet! */ | |
| 239 | } | |
| 240 | ||
| 241 | nm_release_conference(conference); | |
| 242 | } | |
| 243 | ||
| 244 | if (msg) | |
| 245 | g_free(msg); | |
| 246 | ||
| 247 | if (nortf) | |
| 248 | g_free(nortf); | |
| 249 | ||
| 250 | if (guid) | |
| 251 | g_free(guid); | |
| 252 | ||
| 253 | return rc; | |
| 254 | } | |
| 255 | ||
| 256 | /* Read the invite event, set up the event object, and | |
| 257 | * get details for the event source if we don't have them yet. | |
| 258 | */ | |
| 259 | static NMERR_T | |
| 260 | handle_conference_invite(NMUser * user, NMEvent * event) | |
| 261 | { | |
| 262 | NMERR_T rc = NM_OK; | |
| 263 | guint32 size = 0; | |
| 264 | char *guid = NULL; | |
| 265 | char *msg = NULL; | |
| 266 | NMConn *conn; | |
| 267 | NMUserRecord *user_record; | |
| 268 | ||
| 269 | conn = nm_user_get_conn(user); | |
| 270 | ||
| 271 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
272 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
273 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
274 | |
| 8675 | 275 | if (rc == NM_OK) { |
| 276 | guid = g_new0(char, size + 1); | |
| 277 | rc = nm_read_all(conn, guid, size); | |
| 278 | } | |
| 279 | ||
| 280 | /* Read the the message */ | |
| 281 | if (rc == NM_OK) { | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
282 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
283 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
284 | |
| 8675 | 285 | if (rc == NM_OK) { |
| 286 | msg = g_new0(char, size + 1); | |
| 287 | rc = nm_read_all(conn, msg, size); | |
| 288 | } | |
| 289 | } | |
| 290 | ||
| 291 | /* Store the event data */ | |
| 292 | if (rc == NM_OK) { | |
| 293 | NMConference *conference; | |
| 294 | ||
| 295 | nm_event_set_text(event, msg); | |
| 296 | ||
| 297 | conference = nm_conference_list_find(user, guid); | |
| 298 | if (conference == NULL) { | |
| 299 | conference = nm_create_conference(guid); | |
| 300 | ||
| 301 | /* Add new conference to the list and the event */ | |
| 302 | nm_conference_list_add(user, conference); | |
| 303 | nm_event_set_conference(event, conference); | |
| 304 | ||
| 305 | /* Check to see if we have details for the event source yet */ | |
| 306 | user_record = nm_find_user_record(user, nm_event_get_source(event)); | |
| 307 | if (user_record) { | |
| 308 | ||
| 309 | /* Add a reference to the user record in our event object */ | |
| 310 | nm_event_set_user_record(event, user_record); | |
| 311 | ||
| 312 | } else { | |
| 313 | ||
| 314 | /* Need to go to the server to get details for the user */ | |
| 315 | rc = nm_send_get_details(user, nm_event_get_source(event), | |
| 316 | _got_user_for_event, event); | |
| 317 | if (rc == NM_OK) | |
| 318 | rc = -1; /* Not done processing the event yet! */ | |
| 319 | } | |
| 320 | ||
| 321 | nm_release_conference(conference); | |
| 322 | ||
| 323 | } | |
| 324 | } | |
| 325 | ||
| 326 | if (msg) | |
| 327 | g_free(msg); | |
| 328 | ||
| 329 | if (guid) | |
| 330 | g_free(guid); | |
| 331 | ||
| 332 | return rc; | |
| 333 | } | |
| 334 | ||
| 335 | /* Read the invite notify event, set up the event object, and | |
| 336 | * get details for the event source if we don't have them yet. | |
| 337 | */ | |
| 338 | static NMERR_T | |
| 339 | handle_conference_invite_notify(NMUser * user, NMEvent * event) | |
| 340 | { | |
| 341 | NMERR_T rc = NM_OK; | |
| 342 | guint32 size = 0; | |
| 343 | char *guid = NULL; | |
| 344 | NMConn *conn; | |
| 345 | NMConference *conference; | |
| 346 | NMUserRecord *user_record; | |
| 347 | ||
| 348 | conn = nm_user_get_conn(user); | |
| 349 | ||
| 350 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
351 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
352 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
353 | |
| 8675 | 354 | if (rc == NM_OK) { |
| 355 | guid = g_new0(char, size + 1); | |
| 356 | rc = nm_read_all(conn, guid, size); | |
| 357 | } | |
| 358 | ||
| 359 | conference = nm_conference_list_find(user, guid); | |
| 360 | if (conference) { | |
| 361 | nm_event_set_conference(event, conference); | |
| 362 | ||
| 363 | /* Check to see if we have details for the event source yet */ | |
| 364 | user_record = nm_find_user_record(user, nm_event_get_source(event)); | |
| 365 | if (user_record) { | |
| 366 | ||
| 367 | /* Add a reference to the user record in our event object */ | |
| 368 | nm_event_set_user_record(event, user_record); | |
| 369 | ||
| 370 | } else { | |
| 371 | ||
| 372 | /* Need to go to the server to get details for the user */ | |
| 373 | rc = nm_send_get_details(user, nm_event_get_source(event), | |
| 374 | _got_user_for_event, event); | |
| 375 | if (rc == NM_OK) | |
| 376 | rc = -1; /* Not done processing the event yet! */ | |
| 377 | } | |
| 378 | ||
| 379 | } else { | |
| 380 | rc = NMERR_CONFERENCE_NOT_FOUND; | |
| 381 | } | |
| 382 | ||
| 383 | ||
| 384 | if (guid) | |
| 385 | g_free(guid); | |
| 386 | ||
| 387 | return rc; | |
| 388 | } | |
| 389 | ||
| 390 | /* Read the conference reject event and set up the event object */ | |
| 391 | static NMERR_T | |
| 392 | handle_conference_reject(NMUser * user, NMEvent * event) | |
| 393 | { | |
| 394 | NMERR_T rc = NM_OK; | |
| 395 | guint32 size = 0; | |
| 396 | char *guid = NULL; | |
| 397 | NMConn *conn; | |
| 398 | NMConference *conference; | |
| 399 | ||
| 400 | conn = nm_user_get_conn(user); | |
| 401 | ||
| 402 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
403 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
404 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
405 | |
| 8675 | 406 | if (rc == NM_OK) { |
| 407 | guid = g_new0(char, size + 1); | |
| 408 | rc = nm_read_all(conn, guid, size); | |
| 409 | } | |
| 410 | ||
| 411 | if (rc == NM_OK) { | |
| 412 | conference = nm_conference_list_find(user, guid); | |
| 413 | if (conference) { | |
| 414 | nm_event_set_conference(event, conference); | |
| 415 | } else { | |
| 416 | rc = NMERR_CONFERENCE_NOT_FOUND; | |
| 417 | } | |
| 418 | } | |
| 419 | ||
| 420 | if (guid) | |
| 421 | g_free(guid); | |
| 422 | ||
| 423 | return rc; | |
| 424 | } | |
| 425 | ||
| 426 | /* Read the conference left event, set up the event object, and | |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
427 | * remove the conference from the list if there are no more |
| 8675 | 428 | * participants |
| 429 | */ | |
| 430 | static NMERR_T | |
| 431 | handle_conference_left(NMUser * user, NMEvent * event) | |
| 432 | { | |
| 433 | NMERR_T rc = NM_OK; | |
| 434 | guint32 size = 0, flags = 0; | |
| 435 | char *guid = NULL; | |
| 436 | NMConference *conference; | |
| 437 | NMConn *conn; | |
| 438 | ||
| 439 | conn = nm_user_get_conn(user); | |
| 440 | ||
| 441 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
442 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
443 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
444 | |
| 8675 | 445 | if (rc == NM_OK) { |
| 446 | guid = g_new0(char, size + 1); | |
| 447 | rc = nm_read_all(conn, guid, size); | |
| 448 | } | |
| 449 | ||
| 450 | /* Read the conference flags */ | |
| 451 | if (rc == NM_OK) { | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
452 | rc = nm_read_uint32(conn, &flags); |
| 8675 | 453 | } |
| 454 | ||
| 455 | if (rc == NM_OK) { | |
| 456 | conference = nm_conference_list_find(user, guid); | |
| 457 | if (conference) { | |
| 458 | nm_event_set_conference(event, conference); | |
| 459 | nm_conference_set_flags(conference, flags); | |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
460 | |
| 8675 | 461 | nm_conference_remove_participant(conference, nm_event_get_source(event)); |
| 462 | if (nm_conference_get_participant_count(conference) == 0) { | |
| 463 | nm_conference_list_remove(user, conference); | |
| 464 | } | |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
465 | |
| 8675 | 466 | } else { |
| 467 | rc = NMERR_CONFERENCE_NOT_FOUND; | |
| 468 | } | |
| 469 | } | |
| 470 | ||
| 471 | if (guid) | |
| 472 | g_free(guid); | |
| 473 | ||
| 474 | return rc; | |
| 475 | } | |
| 476 | ||
| 477 | /* Read the conference closed, set up the event object, and | |
| 478 | * remove the conference from the list | |
| 479 | */ | |
| 480 | static NMERR_T | |
| 481 | handle_conference_closed(NMUser * user, NMEvent * event) | |
| 482 | { | |
| 483 | NMERR_T rc = NM_OK; | |
| 484 | guint32 size = 0; | |
| 485 | char *guid = NULL; | |
| 486 | NMConference *conference; | |
| 487 | NMConn *conn; | |
| 488 | ||
| 489 | conn = nm_user_get_conn(user); | |
| 490 | ||
| 491 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
492 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
493 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
494 | |
| 8675 | 495 | if (rc == NM_OK) { |
| 496 | guid = g_new0(char, size + 1); | |
| 497 | rc = nm_read_all(conn, guid, size); | |
| 498 | } | |
| 499 | ||
| 500 | if (rc == NM_OK) { | |
| 501 | conference = nm_conference_list_find(user, guid); | |
| 502 | if (conference) { | |
| 503 | nm_event_set_conference(event, conference); | |
| 504 | nm_conference_list_remove(user, conference); | |
| 505 | } else { | |
| 506 | rc = NMERR_CONFERENCE_NOT_FOUND; | |
| 507 | } | |
| 508 | } | |
| 509 | ||
| 510 | if (guid) | |
| 511 | g_free(guid); | |
| 512 | ||
| 513 | return rc; | |
| 514 | } | |
| 515 | ||
| 516 | /* Read the conference joined event, set up the event object, and | |
| 517 | * get details for the event source if we don't have them yet. | |
| 518 | */ | |
| 519 | static NMERR_T | |
| 520 | handle_conference_joined(NMUser * user, NMEvent * event) | |
| 521 | { | |
| 522 | NMERR_T rc = NM_OK; | |
| 523 | guint32 size = 0, flags = 0; | |
| 524 | char *guid = NULL; | |
| 525 | NMConn *conn; | |
| 526 | NMConference *conference; | |
| 527 | NMUserRecord *user_record; | |
| 528 | ||
| 529 | conn = nm_user_get_conn(user); | |
| 530 | ||
| 531 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
532 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
533 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
534 | |
| 8675 | 535 | if (rc == NM_OK) { |
| 536 | guid = g_new0(char, size + 1); | |
| 537 | rc = nm_read_all(conn, guid, size); | |
| 538 | } | |
| 539 | ||
| 540 | /* Read the conference flags */ | |
| 541 | if (rc == NM_OK) { | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
542 | rc = nm_read_uint32(conn, &flags); |
| 8675 | 543 | } |
| 544 | ||
| 545 | if (rc == NM_OK) { | |
| 546 | conference = nm_conference_list_find(user, guid); | |
| 547 | if (conference) { | |
| 548 | nm_conference_set_flags(conference, flags); | |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
549 | |
| 8675 | 550 | nm_event_set_conference(event, conference); |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
551 | |
| 8675 | 552 | /* Add the new user to the participants list */ |
| 553 | user_record = nm_find_user_record(user, nm_event_get_source(event)); | |
| 554 | if (user_record) { | |
|
8933
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
555 | nm_conference_remove_participant(conference, |
|
0f1e8160581d
[gaim-migrate @ 9703]
Mike Stoddard <mistoddard@novell.com>
parents:
8874
diff
changeset
|
556 | nm_user_record_get_dn(user_record)); |
| 8675 | 557 | nm_conference_add_participant(conference, user_record); |
| 558 | } else { | |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
559 | |
| 8675 | 560 | /* Need to go to the server to get details for the user */ |
| 561 | rc = nm_send_get_details(user, nm_event_get_source(event), | |
| 562 | _got_user_for_conference, event); | |
| 563 | if (rc == NM_OK) | |
| 564 | rc = -1; /* Not done processing the event yet! */ | |
| 565 | } | |
|
8684
7ec649752daa
[gaim-migrate @ 9437]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
566 | |
| 8675 | 567 | } else { |
| 568 | rc = NMERR_CONFERENCE_NOT_FOUND; | |
| 569 | } | |
| 570 | } | |
| 571 | ||
| 572 | if (guid) | |
| 573 | g_free(guid); | |
| 574 | ||
| 575 | return rc; | |
| 576 | } | |
| 577 | ||
| 578 | /* Read the typing event and set up the event object */ | |
| 579 | static NMERR_T | |
| 580 | handle_typing(NMUser * user, NMEvent * event) | |
| 581 | { | |
| 582 | NMERR_T rc = NM_OK; | |
| 583 | guint32 size = 0; | |
| 584 | char *guid = NULL; | |
| 585 | NMConference *conference; | |
| 586 | NMConn *conn; | |
| 587 | ||
| 588 | conn = nm_user_get_conn(user); | |
| 589 | ||
| 590 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
591 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
592 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
593 | |
| 8675 | 594 | if (rc == NM_OK) { |
| 595 | guid = g_new0(char, size + 1); | |
| 596 | rc = nm_read_all(conn, guid, size); | |
| 597 | } | |
| 598 | ||
| 599 | if (rc == NM_OK) { | |
| 600 | conference = nm_conference_list_find(user, guid); | |
| 601 | if (conference) { | |
| 602 | nm_event_set_conference(event, conference); | |
| 603 | } else { | |
| 604 | rc = NMERR_CONFERENCE_NOT_FOUND; | |
| 605 | } | |
| 606 | } | |
| 607 | ||
| 608 | if (guid) | |
| 609 | g_free(guid); | |
| 610 | ||
| 611 | return rc; | |
| 612 | } | |
| 613 | ||
| 614 | /* Read the event, set up the event object, and update | |
| 615 | * the status in the user record (for the event source) | |
| 616 | */ | |
| 617 | static NMERR_T | |
| 618 | handle_status_change(NMUser * user, NMEvent * event) | |
| 619 | { | |
| 620 | NMERR_T rc = NM_OK; | |
| 621 | guint16 status; | |
| 622 | guint32 size; | |
| 623 | char *text = NULL; | |
| 624 | NMUserRecord *user_record; | |
| 625 | NMConn *conn; | |
| 626 | ||
| 627 | conn = nm_user_get_conn(user); | |
| 628 | ||
| 629 | /* Read new status */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
630 | rc = nm_read_uint16(conn, &status); |
| 8675 | 631 | if (rc == NM_OK) { |
| 632 | ||
| 633 | /* Read the status text */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
634 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
635 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
636 | |
| 8675 | 637 | if (rc == NM_OK) { |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
638 | text = g_new0(char, size + 1); |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
639 | rc = nm_read_all(conn, text, size); |
| 8675 | 640 | } |
| 641 | } | |
| 642 | ||
| 643 | if (rc == NM_OK) { | |
| 644 | nm_event_set_text(event, text); | |
| 645 | ||
| 646 | /* Get a reference to the user record and store the new status */ | |
| 647 | user_record = nm_find_user_record(user, nm_event_get_source(event)); | |
| 648 | if (user_record) { | |
| 649 | nm_event_set_user_record(event, user_record); | |
| 650 | nm_user_record_set_status(user_record, status, text); | |
| 651 | } | |
| 652 | } | |
| 653 | ||
| 654 | if (text) | |
| 655 | g_free(text); | |
| 656 | ||
| 657 | return rc; | |
| 658 | } | |
| 659 | ||
| 660 | /* Read the undeliverable event */ | |
| 661 | static NMERR_T | |
| 662 | handle_undeliverable_status(NMUser * user, NMEvent * event) | |
| 663 | { | |
| 664 | NMERR_T rc = NM_OK; | |
| 665 | guint32 size = 0; | |
| 666 | char *guid = NULL; | |
| 667 | NMConn *conn; | |
| 668 | ||
| 669 | conn = nm_user_get_conn(user); | |
| 670 | ||
| 671 | /* Read the conference guid */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
672 | rc = nm_read_uint32(conn, &size); |
|
9839
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
673 | if (size == MAX_UINT32) return NMERR_PROTOCOL; |
|
6eb627432e0c
[gaim-migrate @ 10716]
Mike Stoddard <mistoddard@novell.com>
parents:
9268
diff
changeset
|
674 | |
| 8675 | 675 | if (rc == NM_OK) { |
| 676 | guid = g_new0(char, size + 1); | |
| 677 | rc = nm_read_all(conn, guid, size); | |
| 678 | } | |
| 679 | ||
| 680 | if (guid) | |
| 681 | g_free(guid); | |
| 682 | ||
| 683 | return rc; | |
| 684 | } | |
| 685 | ||
| 686 | /******************************************************************************* | |
| 687 | * Event API -- see header file for comments | |
| 688 | ******************************************************************************/ | |
| 689 | ||
| 690 | NMEvent * | |
| 691 | nm_create_event(int type, const char *source, guint32 gmt) | |
| 692 | { | |
| 693 | NMEvent *event = g_new0(NMEvent, 1); | |
| 694 | ||
| 695 | event->type = type; | |
| 696 | event->gmt = gmt; | |
| 697 | ||
| 698 | if (source) | |
| 699 | event->source = g_strdup(source); | |
| 700 | ||
| 701 | event->ref_count = 1; | |
| 702 | ||
| 703 | return event; | |
| 704 | } | |
| 705 | ||
| 706 | void | |
| 707 | nm_release_event(NMEvent * event) | |
| 708 | { | |
| 709 | if (event == NULL) { | |
| 710 | return; | |
| 711 | } | |
| 712 | ||
| 713 | if (--(event->ref_count) == 0) { | |
| 714 | ||
| 715 | if (event->source) | |
| 716 | g_free(event->source); | |
| 717 | ||
| 718 | if (event->conference) | |
| 719 | nm_release_conference(event->conference); | |
| 720 | ||
| 721 | if (event->user_record) | |
| 722 | nm_release_user_record(event->user_record); | |
| 723 | ||
| 724 | if (event->text) | |
| 725 | g_free(event->text); | |
| 726 | ||
| 727 | g_free(event); | |
| 728 | } | |
| 729 | } | |
| 730 | ||
| 731 | ||
| 732 | NMConference * | |
| 733 | nm_event_get_conference(NMEvent * event) | |
| 734 | { | |
| 735 | if (event) | |
| 736 | return event->conference; | |
| 737 | else | |
| 738 | return NULL; | |
| 739 | } | |
| 740 | ||
| 741 | void | |
| 742 | nm_event_set_conference(NMEvent * event, NMConference * conference) | |
| 743 | { | |
| 744 | if (event && conference) { | |
| 745 | nm_conference_add_ref(conference); | |
| 746 | event->conference = conference; | |
| 747 | } | |
| 748 | } | |
| 749 | ||
| 750 | NMUserRecord * | |
| 751 | nm_event_get_user_record(NMEvent * event) | |
| 752 | { | |
| 753 | if (event) | |
| 754 | return event->user_record; | |
| 755 | else | |
| 756 | return NULL; | |
| 757 | } | |
| 758 | ||
| 759 | void | |
| 760 | nm_event_set_user_record(NMEvent * event, NMUserRecord * user_record) | |
| 761 | { | |
| 762 | if (event && user_record) { | |
| 763 | nm_user_record_add_ref(user_record); | |
| 764 | event->user_record = user_record; | |
| 765 | } | |
| 766 | } | |
| 767 | ||
| 768 | const char * | |
| 769 | nm_event_get_text(NMEvent * event) | |
| 770 | { | |
| 771 | if (event) | |
| 772 | return event->text; | |
| 773 | else | |
| 774 | return NULL; | |
| 775 | } | |
| 776 | ||
| 777 | void | |
| 778 | nm_event_set_text(NMEvent * event, const char *text) | |
| 779 | { | |
| 780 | if (event) { | |
| 781 | if (text) | |
| 782 | event->text = g_strdup(text); | |
| 783 | else | |
| 784 | event->text = NULL; | |
| 785 | } | |
| 786 | } | |
| 787 | ||
| 788 | const char * | |
| 789 | nm_event_get_source(NMEvent * event) | |
| 790 | { | |
| 791 | if (event) | |
| 792 | return event->source; | |
| 793 | else | |
| 794 | return NULL; | |
| 795 | } | |
| 796 | ||
| 797 | int | |
| 798 | nm_event_get_type(NMEvent * event) | |
| 799 | { | |
| 800 | if (event) | |
| 801 | return event->type; | |
| 802 | else | |
| 803 | return -1; | |
| 804 | } | |
| 805 | ||
| 13120 | 806 | time_t |
| 8675 | 807 | nm_event_get_gmt(NMEvent * event) |
| 808 | { | |
| 809 | if (event) | |
| 810 | return event->gmt; | |
| 811 | else | |
| 13120 | 812 | return (time_t)-1; |
| 8675 | 813 | } |
| 814 | ||
| 815 | NMERR_T | |
| 816 | nm_process_event(NMUser * user, int type) | |
| 817 | { | |
| 818 | NMERR_T rc = NM_OK; | |
| 819 | guint32 size = 0; | |
| 820 | NMEvent *event = NULL; | |
| 821 | char *source = NULL; | |
| 822 | nm_event_cb cb; | |
| 823 | NMConn *conn; | |
| 824 | ||
| 825 | if (user == NULL) | |
| 826 | return NMERR_BAD_PARM; | |
| 827 | ||
| 828 | if (type < NMEVT_START || type > NMEVT_STOP) | |
| 829 | return NMERR_PROTOCOL; | |
| 830 | ||
| 831 | conn = nm_user_get_conn(user); | |
| 832 | ||
| 833 | /* Read the event source */ | |
|
8874
6dda85680808
[gaim-migrate @ 9643]
Mike Stoddard <mistoddard@novell.com>
parents:
8684
diff
changeset
|
834 | rc = nm_read_uint32(conn, &size); |
| 8675 | 835 | if (rc == NM_OK) { |
| 836 | if (size > 0) { | |
| 837 | source = g_new0(char, size); | |
| 838 | ||
| 839 | rc = nm_read_all(conn, source, size); | |
| 840 | } | |
| 841 | } | |
| 842 | ||
| 843 | /* Read the event data */ | |
| 844 | if (rc == NM_OK) { | |
| 845 | event = nm_create_event(type, source, time(0)); | |
| 846 | ||
| 847 | if (event) { | |
| 848 | ||
| 849 | switch (type) { | |
| 850 | case NMEVT_STATUS_CHANGE: | |
| 851 | rc = handle_status_change(user, event); | |
| 852 | break; | |
| 853 | ||
| 854 | case NMEVT_RECEIVE_MESSAGE: | |
| 855 | rc = handle_receive_message(user, event, FALSE); | |
| 856 | break; | |
| 857 | ||
| 858 | case NMEVT_RECEIVE_AUTOREPLY: | |
| 859 | rc = handle_receive_message(user, event, TRUE); | |
| 860 | break; | |
| 861 | ||
| 862 | case NMEVT_USER_TYPING: | |
| 863 | case NMEVT_USER_NOT_TYPING: | |
| 864 | rc = handle_typing(user, event); | |
| 865 | break; | |
| 866 | ||
| 867 | case NMEVT_CONFERENCE_LEFT: | |
| 868 | rc = handle_conference_left(user, event); | |
| 869 | break; | |
| 870 | ||
| 871 | case NMEVT_CONFERENCE_CLOSED: | |
| 872 | rc = handle_conference_closed(user, event); | |
| 873 | break; | |
| 874 | ||
| 875 | case NMEVT_CONFERENCE_JOINED: | |
| 876 | rc = handle_conference_joined(user, event); | |
| 877 | break; | |
| 878 | ||
| 879 | case NMEVT_CONFERENCE_INVITE: | |
| 880 | rc = handle_conference_invite(user, event); | |
| 881 | break; | |
| 882 | ||
| 883 | case NMEVT_CONFERENCE_REJECT: | |
| 884 | rc = handle_conference_reject(user, event); | |
| 885 | break; | |
| 886 | ||
| 887 | case NMEVT_CONFERENCE_INVITE_NOTIFY: | |
| 888 | rc = handle_conference_invite_notify(user, event); | |
| 889 | break; | |
| 890 | ||
| 891 | case NMEVT_UNDELIVERABLE_STATUS: | |
| 892 | rc = handle_undeliverable_status(user, event); | |
| 893 | break; | |
| 894 | ||
| 895 | case NMEVT_INVALID_RECIPIENT: | |
| 896 | /* Nothing else to read, just callback */ | |
| 897 | break; | |
| 898 | ||
| 899 | case NMEVT_USER_DISCONNECT: | |
| 900 | /* Nothing else to read, just callback */ | |
| 901 | break; | |
| 902 | ||
| 903 | case NMEVT_SERVER_DISCONNECT: | |
| 904 | /* Nothing else to read, just callback */ | |
| 905 | break; | |
| 906 | ||
| 907 | case NMEVT_RECEIVE_FILE: | |
| 908 | case NMEVT_CONTACT_ADD: | |
| 909 | /* Safely ignored for now */ | |
| 910 | break; | |
| 911 | ||
| 912 | default: | |
| 913 | gaim_debug(GAIM_DEBUG_INFO, "novell", | |
| 914 | "Unknown event %d received.\n", type); | |
| 915 | rc = NMERR_PROTOCOL; | |
| 916 | break; | |
| 917 | } | |
| 918 | } | |
| 919 | } | |
| 920 | ||
| 921 | if (rc == (NMERR_T)-1) { | |
| 922 | /* -1 means that we are not ready to callback yet. */ | |
| 923 | rc = NM_OK; | |
| 924 | } else if (rc == NM_OK && (cb = nm_user_get_event_callback(user))) { | |
| 925 | ||
| 926 | cb(user, event); | |
| 927 | ||
| 928 | if (event) | |
| 929 | nm_release_event(event); | |
| 930 | } else { | |
| 931 | if (event) | |
| 932 | nm_release_event(event); | |
| 933 | } | |
| 934 | ||
| 935 | /* Cleanup */ | |
| 936 | if (source) | |
| 937 | g_free(source); | |
| 938 | ||
| 939 | return rc; | |
| 940 | } |