annotate src/session.c @ 8456:5f8d4ab6d375

[gaim-migrate @ 9186] "his patch fixes an issue where the gtkimhtml and the gtkimtoolbar did not know what protocol the conversation was for so they we're either displaying core smileys or white boxes with an x through them. this also make gtkimthml honor the ctrl-{b/u/i} and ctrl-number prefs." --Gary Kramlich who continues: "in the first patch i forgot to adjust the protocol name in the conversation when an item in the send as menu was selected. This fixes that." committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Tue, 16 Mar 2004 19:35:17 +0000
parents 084ed9f7ac19
children 56360561af5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1 /*
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
2 * session management for Gaim
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
3 *
8046
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 6485
diff changeset
4 * Gaim is the legal property of its developers, whose names are too numerous
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 6485
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 6485
diff changeset
6 * source distribution.
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
7 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
11 * (at your option) any later version.
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
12 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 * GNU General Public License for more details.
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 */
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
23 #include "internal.h"
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
24
6245
9083f92e0d58 [gaim-migrate @ 6739]
Nathan Walp <nwalp@pidgin.im>
parents: 6179
diff changeset
25 #include "core.h"
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
26 #include "debug.h"
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8046
diff changeset
27 #include "eventloop.h"
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
28
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
29 extern char *opt_rcfile_arg;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
30
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
31 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
32
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
33 #include <X11/ICE/ICElib.h>
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
34 #include <X11/SM/SMlib.h>
6485
70d5122bc3ff [gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents: 6245
diff changeset
35 #include <gdk/gdkx.h>
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
36 #include <unistd.h>
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
37 #include <fcntl.h>
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
38
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
39 #define ERROR_LENGTH 512
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
40
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
41 static IceIOErrorHandler ice_installed_io_error_handler;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
42 static SmcConn session = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
43 static gchar *myself = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
44 static gboolean had_first_save = FALSE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
45 gboolean session_managed = FALSE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
46
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
47 /* ICE belt'n'braces stuff */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
48
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
49 struct ice_connection_info {
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
50 IceConn connection;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
51 guint input_id;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
52 };
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
53
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8046
diff changeset
54 static void ice_process_messages(gpointer data, gint fd,
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8046
diff changeset
55 GaimInputCondition condition) {
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
56 struct ice_connection_info *conninfo = (struct ice_connection_info*) data;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
57 IceProcessMessagesStatus status;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
58
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
59 /* please don't block... please! */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
60 status = IceProcessMessages(conninfo->connection, NULL, NULL);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
61
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
62 if (status == IceProcessMessagesIOError) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
63 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
64 "ICE IO error, closing connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
65
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
66 /* IO error, please disconnect */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
67 IceSetShutdownNegotiation(conninfo->connection, False);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
68 IceCloseConnection(conninfo->connection);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
69
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
70 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
71
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
72 /* cancel the handler */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
73 gaim_input_remove(conninfo->input_id);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
74 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
75 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
76
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
77 static void ice_connection_watch(IceConn connection, IcePointer client_data,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
78 Bool opening, IcePointer *watch_data) {
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
79 struct ice_connection_info *conninfo = NULL;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
80
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
81 if (opening) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
82 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
83 "Handling new ICE connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
84
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
85 /* ensure ICE connection is not passed to child processes */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
86 fcntl(IceConnectionNumber(connection), F_SETFD, FD_CLOEXEC);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
87
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
88 conninfo = g_new(struct ice_connection_info, 1);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
89 conninfo->connection = connection;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
90
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8046
diff changeset
91 /* watch the connection */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
92 conninfo->input_id = gaim_input_add(IceConnectionNumber(connection), GAIM_INPUT_READ,
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
93 ice_process_messages, conninfo);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
94 *watch_data = conninfo;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
95 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
96 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
97 "Handling closed ICE connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
98
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
99 /* get the input ID back and stop watching it */
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
100 conninfo = (struct ice_connection_info*) *watch_data;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
101 gaim_input_remove(conninfo->input_id);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
102 g_free(conninfo);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
103 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
104
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
105 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
106 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
107
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
108 /* We call any handler installed before (or after) ice_init but
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
109 * avoid calling the default libICE handler which does an exit().
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
110 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
111 * This means we do nothing by default, which is probably correct,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
112 * the connection will get closed by libICE
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
113 */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
114
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
115 static void ice_io_error_handler(IceConn connection) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
116 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
117 "Handling ICE IO error... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
118
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
119 if (ice_installed_io_error_handler)
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
120 (*ice_installed_io_error_handler)(connection);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
121
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
122 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
123 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
124
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
125 static void ice_init() {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
126 IceIOErrorHandler default_handler;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
127
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
128 ice_installed_io_error_handler = IceSetIOErrorHandler(NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
129 default_handler = IceSetIOErrorHandler(ice_io_error_handler);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
130
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
131 if (ice_installed_io_error_handler == default_handler)
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
132 ice_installed_io_error_handler = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
133
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
134 IceAddConnectionWatch(ice_connection_watch, NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
135
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
136 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
137 "ICE initialized.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
138 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
139
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
140 /* my magic utility function */
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
141
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
142 static gchar **session_make_command(gchar *client_id) {
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
143 gint i = 2;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
144 gint j = 0;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
145 gchar **ret;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
146
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
147 if (client_id) i += 2;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
148 if (opt_rcfile_arg) i += 2;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
149
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
150 ret = g_new(gchar *, i);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
151 ret[j++] = g_strdup(myself);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
152
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
153 if (client_id) {
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
154 ret[j++] = g_strdup("--session");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
155 ret[j++] = g_strdup(client_id);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
156 }
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
157
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
158 if (opt_rcfile_arg) {
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
159 ret[j++] = g_strdup("--file");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
160 ret[j++] = g_strdup(opt_rcfile_arg);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
161 }
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
162
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
163 ret[j++] = NULL;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
164
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
165 return ret;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
166 }
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
167
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
168 /* SM callback handlers */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
169
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
170 void session_save_yourself(SmcConn conn, SmPointer data, int save_type,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
171 Bool shutdown, int interact_style, Bool fast) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
172 if (had_first_save == FALSE && save_type == SmSaveLocal &&
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
173 interact_style == SmInteractStyleNone && !shutdown &&
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
174 !fast) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
175 /* this is just a dry run, spit it back */
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
176 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
177 "Received first save_yourself\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
178 SmcSaveYourselfDone(conn, True);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
179 had_first_save = TRUE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
180 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
181 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
182
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
183 /* tum ti tum... don't add anything else here without *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
184 * reading SMlib.PS from an X.org ftp server near you */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
185
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
186 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
187 "Received save_yourself\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
188
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
189 if (save_type == SmSaveGlobal || save_type == SmSaveBoth) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
190 /* may as well do something ... */
5593
b07aa997ddd8 [gaim-migrate @ 5997]
Christian Hammond <chipx86@chipx86.com>
parents: 5211
diff changeset
191 /* or not -- save_prefs(); */
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
192 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
193
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
194 SmcSaveYourselfDone(conn, True);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
195 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
196
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
197 void session_die(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
198 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
199 "Received die\n");
6179
16e384bb7fbf [gaim-migrate @ 6664]
Christian Hammond <chipx86@chipx86.com>
parents: 5872
diff changeset
200 gaim_core_quit();
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
201 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
202
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
203 void session_save_complete(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
204 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
205 "Received save_complete\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
206 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
207
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
208 void session_shutdown_cancelled(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
209 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
210 "Received shutdown_cancelled\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
211 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
212
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
213 /* utility functions stolen from Gnome-client */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
214
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
215 static void session_set_value(SmcConn conn, gchar *name, char *type,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
216 int num_vals, SmPropValue *vals) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
217 SmProp *proplist[1];
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
218 SmProp prop;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
219
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
220 g_return_if_fail(conn);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
221
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
222 prop.name = name;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
223 prop.type = type;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
224 prop.num_vals = num_vals;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
225 prop.vals = vals;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
226
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
227 proplist[0] = &prop;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
228 SmcSetProperties(conn, 1, proplist);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
229 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
230
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
231 static void session_set_string(SmcConn conn, gchar *name, gchar *value) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
232 SmPropValue val;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
233
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
234 g_return_if_fail(name);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
235
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
236 val.length = strlen (value)+1;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
237 val.value = value;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
238
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
239 session_set_value(conn, name, SmARRAY8, 1, &val);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
240 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
241
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
242 static void session_set_gchar(SmcConn conn, gchar *name, gchar value) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
243 SmPropValue val;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
244
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
245 g_return_if_fail(name);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
246
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
247 val.length = 1;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
248 val.value = &value;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
249
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
250 session_set_value(conn, name, SmCARD8, 1, &val);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
251 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
252
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
253 static void session_set_array(SmcConn conn, gchar *name, gchar *array[]) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
254 gint argc;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
255 gchar **ptr;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
256 gint i;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
257
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
258 SmPropValue *vals;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
259
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
260 g_return_if_fail (name);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
261
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
262 /* We count the number of elements in our array. */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
263 for (ptr = array, argc = 0; *ptr ; ptr++, argc++) /* LOOP */;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
264
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
265 /* Now initialize the 'vals' array. */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
266 vals = g_new (SmPropValue, argc);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
267 for (ptr = array, i = 0 ; i < argc ; ptr++, i++) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
268 vals[i].length = strlen (*ptr);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
269 vals[i].value = *ptr;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
270 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
271
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
272 session_set_value(conn, name, SmLISTofARRAY8, argc, vals);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
273
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
274 g_free (vals);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
275 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
276
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
277 #endif /* USE_SM */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
278
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
279 /* setup functions */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
280
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
281 void session_init(gchar *argv0, gchar *previous_id) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
282 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
283 SmcCallbacks callbacks;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
284 gchar *client_id = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
285 gchar error[ERROR_LENGTH] = "";
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
286 gchar *tmp = NULL;
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
287 gchar **cmd = NULL;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
288
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
289 if (session != NULL) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
290 /* session is already established, what the hell is going on? */
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
291 gaim_debug(GAIM_DEBUG_WARNING, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
292 "Duplicated call to session_init!\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
293 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
294 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
295
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
296 if (g_getenv("SESSION_MANAGER") == NULL) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
297 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
298 "No SESSION_MANAGER found, aborting.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
299 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
300 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
301
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
302 ice_init();
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
303
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
304 callbacks.save_yourself.callback = session_save_yourself;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
305 callbacks.die.callback = session_die;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
306 callbacks.save_complete.callback = session_save_complete;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
307 callbacks.shutdown_cancelled.callback = session_shutdown_cancelled;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
308
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
309 callbacks.save_yourself.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
310 callbacks.die.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
311 callbacks.save_complete.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
312 callbacks.shutdown_cancelled.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
313
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
314 if (previous_id) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
315 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
316 "Connecting with previous ID %s\n", previous_id);
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
317 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
318 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
319 "Connecting with no previous ID\n");
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
320 }
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
321
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
322 session = SmcOpenConnection(NULL, "session", SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask |
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
323 SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
324 &callbacks, previous_id, &client_id, ERROR_LENGTH, error);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
325
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
326 if (session == NULL) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
327 if (error[0] != '\0') {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
328 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
329 "Connection failed with error: %s\n", error);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
330 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
331 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
332 "Connetion failed with unknown error.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
333 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
334 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
335 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
336
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
337 tmp = SmcVendor(session);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
338 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
339 "Connected to manager (%s) with client ID %s\n",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
340 tmp, client_id);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
341 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
342
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
343 session_managed = TRUE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
344 gdk_set_sm_client_id(client_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
345
4265
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
346 tmp = g_get_current_dir();
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
347 session_set_string(session, SmCurrentDirectory, tmp);
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
348 g_free(tmp);
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
349
4210
e11393a176d5 [gaim-migrate @ 4447]
Luke Schierer <lschiere@pidgin.im>
parents: 4158
diff changeset
350 tmp = g_strdup_printf("%d", (int) getpid());
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
351 session_set_string(session, SmProcessID, tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
352 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
353
4210
e11393a176d5 [gaim-migrate @ 4447]
Luke Schierer <lschiere@pidgin.im>
parents: 4158
diff changeset
354 tmp = g_strdup(g_get_user_name());
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
355 session_set_string(session, SmUserID, tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
356 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
357
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
358 session_set_gchar(session, SmRestartStyleHint, (gchar) SmRestartIfRunning);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
359 session_set_string(session, SmProgram, g_get_prgname());
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
360
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
361 myself = g_strdup(argv0);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
362 gaim_debug(GAIM_DEBUG_MISC, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
363 "Using %s as command\n", myself);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
364
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
365 cmd = session_make_command(NULL);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
366 session_set_array(session, SmCloneCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
367 g_strfreev(cmd);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
368
4265
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
369 /* this is currently useless, but gnome-session warns 'the following applications will not
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
370 save their current status' bla bla if we don't have it and the user checks 'Save Session'
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
371 when they log out */
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
372 cmd = g_new(gchar *, 2);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
373 cmd[0] = g_strdup("/bin/true");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
374 cmd[1] = NULL;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
375 session_set_array(session, SmDiscardCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
376 g_strfreev(cmd);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
377
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
378 cmd = session_make_command(client_id);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
379 session_set_array(session, SmRestartCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
380 g_strfreev(cmd);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
381
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
382 g_free(client_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
383 #endif /* USE_SM */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
384 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
385
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
386 void session_end() {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
387 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
388 if (session == NULL) /* no session to close */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
389 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
390
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
391 SmcCloseConnection(session, 0, NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
392
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
393 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
394 "Connection closed.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
395 #endif /* USE_SM */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
396 }