annotate src/session.c @ 10738:55af3fa46329

[gaim-migrate @ 12340] Lots of changes here. A lot of it stems from chaning gaim_account_connect() so that it DOES NOT have the GaimStatus parameter. It will attempt to use the GaimStatus of your account from the last time it was connected (which doesn't work quite right yet). My goal here was to save and load each account's GaimStatuses to accounts.xml, so if you were "away" when you signed off then you'll be "away" when you sign back on. Not quite there yet. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sat, 26 Mar 2005 20:08:43 +0000
parents cfb11d9a46fd
children 50224ac8184d
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
29 #ifdef USE_SM
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 #include <X11/ICE/ICElib.h>
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
32 #include <X11/SM/SMlib.h>
6485
70d5122bc3ff [gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents: 6245
diff changeset
33 #include <gdk/gdkx.h>
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
34 #include <unistd.h>
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
35 #include <fcntl.h>
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5593
diff changeset
36
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
37 #define ERROR_LENGTH 512
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
38
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
39 static IceIOErrorHandler ice_installed_io_error_handler;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
40 static SmcConn session = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
41 static gchar *myself = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
42 static gboolean had_first_save = FALSE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
43 gboolean session_managed = FALSE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
44
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
45 /* ICE belt'n'braces stuff */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
46
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
47 struct ice_connection_info {
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
48 IceConn connection;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
49 guint input_id;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
50 };
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
51
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8046
diff changeset
52 static void ice_process_messages(gpointer data, gint fd,
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8046
diff changeset
53 GaimInputCondition condition) {
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
54 struct ice_connection_info *conninfo = (struct ice_connection_info*) data;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
55 IceProcessMessagesStatus status;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
56
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
57 /* please don't block... please! */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
58 status = IceProcessMessages(conninfo->connection, NULL, NULL);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
59
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
60 if (status == IceProcessMessagesIOError) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
61 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
62 "ICE IO error, closing connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
63
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
64 /* IO error, please disconnect */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
65 IceSetShutdownNegotiation(conninfo->connection, False);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
66 IceCloseConnection(conninfo->connection);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
67
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
68 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
69
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
70 /* cancel the handler */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
71 gaim_input_remove(conninfo->input_id);
4158
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 }
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 static void ice_connection_watch(IceConn connection, IcePointer client_data,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
76 Bool opening, IcePointer *watch_data) {
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
77 struct ice_connection_info *conninfo = NULL;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
78
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
79 if (opening) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
80 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
81 "Handling new ICE connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
82
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
83 /* ensure ICE connection is not passed to child processes */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
84 fcntl(IceConnectionNumber(connection), F_SETFD, FD_CLOEXEC);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
85
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
86 conninfo = g_new(struct ice_connection_info, 1);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
87 conninfo->connection = connection;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
88
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8046
diff changeset
89 /* watch the connection */
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
90 conninfo->input_id = gaim_input_add(IceConnectionNumber(connection), GAIM_INPUT_READ,
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
91 ice_process_messages, conninfo);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
92 *watch_data = conninfo;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
93 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
94 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
95 "Handling closed ICE connection... ");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
96
8280
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
97 /* get the input ID back and stop watching it */
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
98 conninfo = (struct ice_connection_info*) *watch_data;
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
99 gaim_input_remove(conninfo->input_id);
084ed9f7ac19 [gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents: 8273
diff changeset
100 g_free(conninfo);
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
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
103 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
104 }
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 /* We call any handler installed before (or after) ice_init but
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
107 * avoid calling the default libICE handler which does an exit().
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 * This means we do nothing by default, which is probably correct,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
110 * the connection will get closed by libICE
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
111 */
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 static void ice_io_error_handler(IceConn connection) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
114 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
115 "Handling ICE IO error... ");
4158
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 if (ice_installed_io_error_handler)
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
118 (*ice_installed_io_error_handler)(connection);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
119
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
120 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
121 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
122
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
123 static void ice_init() {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
124 IceIOErrorHandler default_handler;
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 ice_installed_io_error_handler = IceSetIOErrorHandler(NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
127 default_handler = IceSetIOErrorHandler(ice_io_error_handler);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
128
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
129 if (ice_installed_io_error_handler == default_handler)
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
130 ice_installed_io_error_handler = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
131
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
132 IceAddConnectionWatch(ice_connection_watch, NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
133
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
134 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
135 "ICE initialized.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
136 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
137
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
138 /* my magic utility function */
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
139
8601
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
140 static gchar **session_make_command(gchar *client_id, gchar *config_dir) {
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
141 gint i = 2;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
142 gint j = 0;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
143 gchar **ret;
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
144
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
145 if (client_id) i += 2;
8601
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
146 if (config_dir) i += 2; /* we will specify gaim's user dir */
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
147
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
148 ret = g_new(gchar *, i);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
149 ret[j++] = g_strdup(myself);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
150
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
151 if (client_id) {
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
152 ret[j++] = g_strdup("--session");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
153 ret[j++] = g_strdup(client_id);
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
8601
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
156 if (config_dir) {
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
157 ret[j++] = g_strdup("--config");
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
158 ret[j++] = g_strdup(config_dir);
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
159 }
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
160
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
161 ret[j++] = NULL;
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 return ret;
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
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
166 /* SM callback handlers */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
167
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
168 void session_save_yourself(SmcConn conn, SmPointer data, int save_type,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
169 Bool shutdown, int interact_style, Bool fast) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
170 if (had_first_save == FALSE && save_type == SmSaveLocal &&
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
171 interact_style == SmInteractStyleNone && !shutdown &&
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
172 !fast) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
173 /* this is just a dry run, spit it back */
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
174 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
175 "Received first save_yourself\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
176 SmcSaveYourselfDone(conn, True);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
177 had_first_save = TRUE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
178 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
179 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
180
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
181 /* tum ti tum... don't add anything else here without *
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
182 * reading SMlib.PS from an X.org ftp server near you */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
183
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
184 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
185 "Received save_yourself\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
186
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
187 if (save_type == SmSaveGlobal || save_type == SmSaveBoth) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
188 /* may as well do something ... */
5593
b07aa997ddd8 [gaim-migrate @ 5997]
Christian Hammond <chipx86@chipx86.com>
parents: 5211
diff changeset
189 /* or not -- save_prefs(); */
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
192 SmcSaveYourselfDone(conn, True);
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
195 void session_die(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
196 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
197 "Received die\n");
6179
16e384bb7fbf [gaim-migrate @ 6664]
Christian Hammond <chipx86@chipx86.com>
parents: 5872
diff changeset
198 gaim_core_quit();
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
199 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
200
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
201 void session_save_complete(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
202 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
203 "Received save_complete\n");
4158
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
206 void session_shutdown_cancelled(SmcConn conn, SmPointer data) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
207 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
208 "Received shutdown_cancelled\n");
4158
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
211 /* utility functions stolen from Gnome-client */
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 static void session_set_value(SmcConn conn, gchar *name, char *type,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
214 int num_vals, SmPropValue *vals) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
215 SmProp *proplist[1];
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
216 SmProp prop;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
217
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
218 g_return_if_fail(conn);
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 prop.name = name;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
221 prop.type = type;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
222 prop.num_vals = num_vals;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
223 prop.vals = vals;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
224
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
225 proplist[0] = &prop;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
226 SmcSetProperties(conn, 1, proplist);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
227 }
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 static void session_set_string(SmcConn conn, gchar *name, gchar *value) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
230 SmPropValue val;
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 g_return_if_fail(name);
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 val.length = strlen (value)+1;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
235 val.value = value;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
236
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
237 session_set_value(conn, name, SmARRAY8, 1, &val);
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
240 static void session_set_gchar(SmcConn conn, gchar *name, gchar value) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
241 SmPropValue 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 g_return_if_fail(name);
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 val.length = 1;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
246 val.value = &value;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
247
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
248 session_set_value(conn, name, SmCARD8, 1, &val);
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
251 static void session_set_array(SmcConn conn, gchar *name, gchar *array[]) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
252 gint argc;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
253 gchar **ptr;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
254 gint i;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
255
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
256 SmPropValue *vals;
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 g_return_if_fail (name);
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 /* We count the number of elements in our array. */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
261 for (ptr = array, argc = 0; *ptr ; ptr++, argc++) /* LOOP */;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
262
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
263 /* Now initialize the 'vals' array. */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
264 vals = g_new (SmPropValue, argc);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
265 for (ptr = array, i = 0 ; i < argc ; ptr++, i++) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
266 vals[i].length = strlen (*ptr);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
267 vals[i].value = *ptr;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
268 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
269
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
270 session_set_value(conn, name, SmLISTofARRAY8, argc, vals);
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 g_free (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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
275 #endif /* USE_SM */
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 /* setup functions */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
278
8601
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
279 void session_init(gchar *argv0, gchar *previous_id, gchar *config_dir) {
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
280 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
281 SmcCallbacks callbacks;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
282 gchar *client_id = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
283 gchar error[ERROR_LENGTH] = "";
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
284 gchar *tmp = NULL;
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
285 gchar **cmd = NULL;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
286
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
287 if (session != NULL) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
288 /* session is already established, what the hell is going on? */
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
289 gaim_debug(GAIM_DEBUG_WARNING, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
290 "Duplicated call to session_init!\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
291 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
292 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
293
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
294 if (g_getenv("SESSION_MANAGER") == NULL) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
295 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
296 "No SESSION_MANAGER found, aborting.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
297 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
298 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
299
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
300 ice_init();
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 callbacks.save_yourself.callback = session_save_yourself;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
303 callbacks.die.callback = session_die;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
304 callbacks.save_complete.callback = session_save_complete;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
305 callbacks.shutdown_cancelled.callback = session_shutdown_cancelled;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
306
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
307 callbacks.save_yourself.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
308 callbacks.die.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
309 callbacks.save_complete.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
310 callbacks.shutdown_cancelled.client_data = NULL;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
311
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
312 if (previous_id) {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
313 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
314 "Connecting with previous ID %s\n", previous_id);
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
315 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
316 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
317 "Connecting with no previous ID\n");
4544
96a2a6c9affc [gaim-migrate @ 4823]
Luke Schierer <lschiere@pidgin.im>
parents: 4281
diff changeset
318 }
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
319
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
320 session = SmcOpenConnection(NULL, "session", SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask |
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
321 SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask,
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
322 &callbacks, previous_id, &client_id, ERROR_LENGTH, error);
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 if (session == NULL) {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
325 if (error[0] != '\0') {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
326 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
327 "Connection failed with error: %s\n", error);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
328 } else {
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
329 gaim_debug(GAIM_DEBUG_ERROR, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
330 "Connetion failed with unknown error.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
331 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
332 return;
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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
335 tmp = SmcVendor(session);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
336 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
337 "Connected to manager (%s) with client ID %s\n",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
338 tmp, client_id);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
339 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
340
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
341 session_managed = TRUE;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
342 gdk_set_sm_client_id(client_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
343
4265
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
344 tmp = g_get_current_dir();
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
345 session_set_string(session, SmCurrentDirectory, tmp);
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
346 g_free(tmp);
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
347
4210
e11393a176d5 [gaim-migrate @ 4447]
Luke Schierer <lschiere@pidgin.im>
parents: 4158
diff changeset
348 tmp = g_strdup_printf("%d", (int) getpid());
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
349 session_set_string(session, SmProcessID, tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
350 g_free(tmp);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
351
4210
e11393a176d5 [gaim-migrate @ 4447]
Luke Schierer <lschiere@pidgin.im>
parents: 4158
diff changeset
352 tmp = g_strdup(g_get_user_name());
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
353 session_set_string(session, SmUserID, 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
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
356 session_set_gchar(session, SmRestartStyleHint, (gchar) SmRestartIfRunning);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
357 session_set_string(session, SmProgram, g_get_prgname());
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
358
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
359 myself = g_strdup(argv0);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
360 gaim_debug(GAIM_DEBUG_MISC, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
361 "Using %s as command\n", myself);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
362
8601
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
363 cmd = session_make_command(NULL, config_dir);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
364 session_set_array(session, SmCloneCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
365 g_strfreev(cmd);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
366
4265
65a859488240 [gaim-migrate @ 4516]
Sean Egan <seanegan@gmail.com>
parents: 4210
diff changeset
367 /* 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
368 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
369 when they log out */
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
370 cmd = g_new(gchar *, 2);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
371 cmd[0] = g_strdup("/bin/true");
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
372 cmd[1] = NULL;
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
373 session_set_array(session, SmDiscardCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
374 g_strfreev(cmd);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
375
8601
cfb11d9a46fd [gaim-migrate @ 9352]
Luke Schierer <lschiere@pidgin.im>
parents: 8596
diff changeset
376 cmd = session_make_command(client_id, config_dir);
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
377 session_set_array(session, SmRestartCommand, cmd);
4281
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
378 g_strfreev(cmd);
d956ac6157cd [gaim-migrate @ 4532]
Luke Schierer <lschiere@pidgin.im>
parents: 4265
diff changeset
379
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
380 g_free(client_id);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
381 #endif /* USE_SM */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
382 }
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
383
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
384 void session_end() {
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
385 #ifdef USE_SM
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
386 if (session == NULL) /* no session to close */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
387 return;
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
388
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
389 SmcCloseConnection(session, 0, NULL);
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
390
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
391 gaim_debug(GAIM_DEBUG_INFO, "Session Management",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4544
diff changeset
392 "Connection closed.\n");
4158
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
393 #endif /* USE_SM */
a638bc9454a6 [gaim-migrate @ 4386]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
394 }