annotate src/session.c @ 6064:ed3c3c38e182

[gaim-migrate @ 6514] clee|work (who I suppose is at work right now) points out that we allow the Idle Maker plugin to set idle times of sizes up to an int, whereas OSCAR only accepts them up to a short int. Actually, he just complained that it wasn't working and I explained that it was overflowing. I'm not quite sure he understands, but this is a nice fix, regardless. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Tue, 08 Jul 2003 23:07:13 +0000
parents 059d95c67cda
children 16e384bb7fbf
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 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
4 * Copyright (C) 2002, Robert McQueen <robot101@debian.org> but
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
5 * much code shamelessly cribbed from GsmClient (C) 2001 Havoc
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
6 * Pennington, which is in turn inspired by various other pieces
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
7 * of code including GnomeClient (C) 1998 Carsten Schaar, Tom
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
8 * Tromey, and twm session code (C) 1998 The Open Group.
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
9 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
10 * This program is free software; you can redistribute it and/or modify
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
11 * 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
12 * the Free Software Foundation; either version 2 of the License, or
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 * (at your option) any later version.
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 * GNU General Public License for more details.
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 * along with this program; if not, write to the Free Software
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
23 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
24 */
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
25 #include "internal.h"
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
26
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
27 #include "debug.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 /* XXX */
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
30 extern void do_quit();
4210
e11393a176d5 [gaim-migrate @ 4447]
Luke Schierer <lschiere@pidgin.im>
parents: 4158
diff changeset
31
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
32 extern char *opt_rcfile_arg;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
33
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
34 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
35
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
36 #include <X11/ICE/ICElib.h>
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
37 #include <X11/SM/SMlib.h>
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
38 #include <unistd.h>
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
39 #include <fcntl.h>
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
40
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
41 #define ERROR_LENGTH 512
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
42
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
43 static IceIOErrorHandler ice_installed_io_error_handler;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
44 static SmcConn session = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
45 static gchar *myself = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
46 static gboolean had_first_save = FALSE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
47 gboolean session_managed = FALSE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
48
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
49 /* ICE belt'n'braces stuff */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
50
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
51 static gboolean ice_process_messages(GIOChannel *channel, GIOCondition condition,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
52 gpointer data) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
53 IceConn connection = (IceConn)data;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
54 IceProcessMessagesStatus status;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
55
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
56 /* please don't block... please! */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
57 status = IceProcessMessages(connection, NULL, NULL);
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 if (status == IceProcessMessagesIOError) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
60 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
61 "ICE IO error, closing connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
62
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
63 /* IO error, please disconnect */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
64 IceSetShutdownNegotiation(connection, False);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
65 IceCloseConnection(connection);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
66
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
67 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
68
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
69 /* cancel the handler */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
70 return FALSE;
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
73 /* live to see another day */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
74 return TRUE;
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) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
79 guint input_id;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
80
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
81 if (opening) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
82 GIOChannel *channel;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
83
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
84 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
85 "Handling new ICE connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
86
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
87 /* ensure ICE connection is not passed to child processes */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
88 fcntl(IceConnectionNumber(connection), F_SETFD, FD_CLOEXEC);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
89
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
90 /* get glib to watch the connection for us */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
91 channel = g_io_channel_unix_new(IceConnectionNumber(connection));
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
92 input_id = g_io_add_watch(channel, G_IO_IN | G_IO_ERR,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
93 ice_process_messages, connection);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
94 g_io_channel_unref(channel);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
95
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
96 /* store the input ID as a pointer for when it closes */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
97 *watch_data = (IcePointer)GUINT_TO_POINTER(input_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
98 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
99 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
100 "Handling closed ICE connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
101
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
102 /* get the input ID back and stop watching it */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
103 input_id = GPOINTER_TO_UINT((gpointer) *watch_data);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
104 g_source_remove(input_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
105 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
106
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
107 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
108 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
109
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
110 /* We call any handler installed before (or after) ice_init but
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
111 * avoid calling the default libICE handler which does an exit().
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
112 *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
113 * This means we do nothing by default, which is probably correct,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
114 * the connection will get closed by libICE
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
115 */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
116
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
117 static void ice_io_error_handler(IceConn connection) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
118 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
119 "Handling ICE IO error... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
120
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
121 if (ice_installed_io_error_handler)
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
122 (*ice_installed_io_error_handler)(connection);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
123
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
124 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
125 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
126
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
127 static void ice_init() {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
128 IceIOErrorHandler default_handler;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
129
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
130 ice_installed_io_error_handler = IceSetIOErrorHandler(NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
131 default_handler = IceSetIOErrorHandler(ice_io_error_handler);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
132
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
133 if (ice_installed_io_error_handler == default_handler)
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
134 ice_installed_io_error_handler = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
135
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
136 IceAddConnectionWatch(ice_connection_watch, NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
137
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
138 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
139 "ICE initialized.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
140 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
141
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
142 /* my magic utility function */
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
143
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
144 static gchar **session_make_command(gchar *client_id) {
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
145 gint i = 2;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
146 gint j = 0;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
147 gchar **ret;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
148
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
149 if (client_id) i += 2;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
150 if (opt_rcfile_arg) i += 2;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
151
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
152 ret = g_new(gchar *, i);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
153 ret[j++] = g_strdup(myself);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
154
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
155 if (client_id) {
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
156 ret[j++] = g_strdup("--session");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
157 ret[j++] = g_strdup(client_id);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
158 }
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
159
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
160 if (opt_rcfile_arg) {
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
161 ret[j++] = g_strdup("--file");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
162 ret[j++] = g_strdup(opt_rcfile_arg);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
163 }
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 ret[j++] = NULL;
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 return ret;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
168 }
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
169
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
170 /* SM callback handlers */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
171
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
172 void session_save_yourself(SmcConn conn, SmPointer data, int save_type,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
173 Bool shutdown, int interact_style, Bool fast) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
174 if (had_first_save == FALSE && save_type == SmSaveLocal &&
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
175 interact_style == SmInteractStyleNone && !shutdown &&
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
176 !fast) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
177 /* this is just a dry run, spit it back */
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
178 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
179 "Received first save_yourself\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
180 SmcSaveYourselfDone(conn, True);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
181 had_first_save = TRUE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
182 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
183 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
184
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
185 /* tum ti tum... don't add anything else here without *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
186 * reading SMlib.PS from an X.org ftp server near you */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
187
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
188 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
189 "Received save_yourself\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
190
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
191 if (save_type == SmSaveGlobal || save_type == SmSaveBoth) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
192 /* may as well do something ... */
5593
b07aa997ddd8 [gaim-migrate @ 5997]
Christian Hammond <chipx86@chipx86.com>
parents: 5211
diff changeset
193 /* or not -- save_prefs(); */
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
194 }
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 SmcSaveYourselfDone(conn, True);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
197 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
198
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
199 void session_die(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
200 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
201 "Received die\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
202 do_quit();
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
203 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
204
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
205 void session_save_complete(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
206 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
207 "Received save_complete\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
208 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
209
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
210 void session_shutdown_cancelled(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
211 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
212 "Received shutdown_cancelled\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
213 }
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 /* utility functions stolen from Gnome-client */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
216
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
217 static void session_set_value(SmcConn conn, gchar *name, char *type,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
218 int num_vals, SmPropValue *vals) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
219 SmProp *proplist[1];
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
220 SmProp prop;
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 g_return_if_fail(conn);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
223
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
224 prop.name = name;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
225 prop.type = type;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
226 prop.num_vals = num_vals;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
227 prop.vals = vals;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
228
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
229 proplist[0] = &prop;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
230 SmcSetProperties(conn, 1, proplist);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
231 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
232
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
233 static void session_set_string(SmcConn conn, gchar *name, gchar *value) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
234 SmPropValue val;
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 g_return_if_fail(name);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
237
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
238 val.length = strlen (value)+1;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
239 val.value = value;
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 session_set_value(conn, name, SmARRAY8, 1, &val);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
242 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
243
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
244 static void session_set_gchar(SmcConn conn, gchar *name, gchar value) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
245 SmPropValue val;
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 g_return_if_fail(name);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
248
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
249 val.length = 1;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
250 val.value = &value;
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 session_set_value(conn, name, SmCARD8, 1, &val);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
253 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
254
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
255 static void session_set_array(SmcConn conn, gchar *name, gchar *array[]) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
256 gint argc;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
257 gchar **ptr;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
258 gint i;
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 SmPropValue *vals;
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 g_return_if_fail (name);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
263
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
264 /* We count the number of elements in our array. */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
265 for (ptr = array, argc = 0; *ptr ; ptr++, argc++) /* LOOP */;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
266
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
267 /* Now initialize the 'vals' array. */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
268 vals = g_new (SmPropValue, argc);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
269 for (ptr = array, i = 0 ; i < argc ; ptr++, i++) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
270 vals[i].length = strlen (*ptr);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
271 vals[i].value = *ptr;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
272 }
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 session_set_value(conn, name, SmLISTofARRAY8, argc, 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 g_free (vals);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
277 }
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 #endif /* USE_SM */
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 /* setup functions */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
282
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
283 void session_init(gchar *argv0, gchar *previous_id) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
284 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
285 SmcCallbacks callbacks;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
286 gchar *client_id = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
287 gchar error[ERROR_LENGTH] = "";
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
288 gchar *tmp = NULL;
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
289 gchar **cmd = NULL;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
290
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
291 if (session != NULL) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
292 /* session is already established, what the hell is going on? */
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
293 gaim_debug(GAIM_DEBUG_WARNING, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
294 "Duplicated call to session_init!\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
295 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
296 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
297
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
298 if (g_getenv("SESSION_MANAGER") == NULL) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
299 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
300 "No SESSION_MANAGER found, aborting.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
301 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
302 }
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 ice_init();
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
305
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
306 callbacks.save_yourself.callback = session_save_yourself;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
307 callbacks.die.callback = session_die;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
308 callbacks.save_complete.callback = session_save_complete;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
309 callbacks.shutdown_cancelled.callback = session_shutdown_cancelled;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
310
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
311 callbacks.save_yourself.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
312 callbacks.die.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
313 callbacks.save_complete.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
314 callbacks.shutdown_cancelled.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
315
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
316 if (previous_id) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
317 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
318 "Connecting with previous ID %s\n", previous_id);
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
319 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
320 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
321 "Connecting with no previous ID\n");
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
322 }
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
323
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
324 session = SmcOpenConnection(NULL, "session", SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask |
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
325 SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
326 &callbacks, previous_id, &client_id, ERROR_LENGTH, error);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
327
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
328 if (session == NULL) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
329 if (error[0] != '\0') {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
330 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
331 "Connection failed with error: %s\n", error);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
332 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
333 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
334 "Connetion failed with unknown error.\n");
4158
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 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
337 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
338
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
339 tmp = SmcVendor(session);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
340 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
341 "Connected to manager (%s) with client ID %s\n",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
342 tmp, client_id);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
343 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
344
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
345 session_managed = TRUE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
346 gdk_set_sm_client_id(client_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
347
4265
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
348 tmp = g_get_current_dir();
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
349 session_set_string(session, SmCurrentDirectory, tmp);
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
350 g_free(tmp);
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
351
4210
e11393a176d5 [gaim-migrate @ 4447]
Luke Schierer <lschiere@pidgin.im>
parents: 4158
diff changeset
352 tmp = g_strdup_printf("%d", (int) getpid());
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
353 session_set_string(session, SmProcessID, tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
354 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
355
4210
e11393a176d5 [gaim-migrate @ 4447]
Luke Schierer <lschiere@pidgin.im>
parents: 4158
diff changeset
356 tmp = g_strdup(g_get_user_name());
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
357 session_set_string(session, SmUserID, tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
358 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
359
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
360 session_set_gchar(session, SmRestartStyleHint, (gchar) SmRestartIfRunning);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
361 session_set_string(session, SmProgram, g_get_prgname());
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
362
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
363 myself = g_strdup(argv0);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
364 gaim_debug(GAIM_DEBUG_MISC, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
365 "Using %s as command\n", myself);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
366
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
367 cmd = session_make_command(NULL);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
368 session_set_array(session, SmCloneCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
369 g_strfreev(cmd);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
370
4265
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
371 /* 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
372 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
373 when they log out */
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
374 cmd = g_new(gchar *, 2);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
375 cmd[0] = g_strdup("/bin/true");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
376 cmd[1] = NULL;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
377 session_set_array(session, SmDiscardCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
378 g_strfreev(cmd);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
379
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
380 cmd = session_make_command(client_id);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
381 session_set_array(session, SmRestartCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
382 g_strfreev(cmd);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
383
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
384 g_free(client_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
385 #endif /* USE_SM */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
386 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
387
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
388 void session_end() {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
389 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
390 if (session == NULL) /* no session to close */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
391 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
392
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
393 SmcCloseConnection(session, 0, NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
394
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
395 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
396 "Connection closed.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
397 #endif /* USE_SM */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
398 }