Mercurial > pidgin.yaz
annotate plugins/gaim-remote/remote.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 | e874feeb91e3 |
children | 50224ac8184d |
rev | line source |
---|---|
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6179
diff
changeset
|
1 /** |
5859 | 2 * Remote control plugin for Gaim |
3 * | |
4 * Copyright (C) 2003 Christian Hammond. | |
5 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
6 * | |
7 * This program is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU General Public License as | |
9 * published by the Free Software Foundation; either version 2 of the | |
10 * License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program; if not, write to the Free Software | |
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
20 * 02111-1307, USA. | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
21 * |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
22 * @todo Make this a core plugin! |
5859 | 23 */ |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
24 #include "internal.h" |
9791 | 25 #include "gtkgaim.h" |
5859 | 26 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
27 #ifndef _WIN32 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
28 # include <sys/un.h> |
5859 | 29 #endif |
30 | |
31 #include <signal.h> | |
32 #include <getopt.h> | |
33 | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
34 #include "conversation.h" |
6179
16e384bb7fbf
[gaim-migrate @ 6664]
Christian Hammond <chipx86@chipx86.com>
parents:
6177
diff
changeset
|
35 #include "core.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
36 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
37 #include "prpl.h" |
8704 | 38 #include "notify.h" |
10005 | 39 #include "util.h" |
9943 | 40 #include "version.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
41 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
42 /* XXX */ |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
43 #include "gtkconv.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
44 #include "gtkplugin.h" |
5859 | 45 #include "gaim.h" |
9608 | 46 #include "prefs.h" |
5859 | 47 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
48 #include <gaim-remote/remote.h> |
5859 | 49 |
5873
a18e88c4dace
[gaim-migrate @ 6305]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
50 #define REMOTE_PLUGIN_ID "gtk-remote" |
5859 | 51 |
52 struct UI { | |
53 GIOChannel *channel; | |
54 guint inpa; | |
55 }; | |
56 | |
57 #ifndef _WIN32 | |
58 static gint UI_fd = -1; | |
6107 | 59 static guint watcher = 0; |
5859 | 60 #endif |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
61 static int gaim_session = 0; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
62 static GSList *uis = NULL; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
63 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
64 /* AIM URI's ARE FUN :-D */ |
5884
d188b000e892
[gaim-migrate @ 6316]
Christian Hammond <chipx86@chipx86.com>
parents:
5873
diff
changeset
|
65 static const char * |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
66 gaim_remote_handle_uri(const char *uri) |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
67 { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
68 const char *username; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
69 GString *str; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
70 GList *conn; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
71 GaimConnection *gc = NULL; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
72 GaimAccount *account; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
73 |
10003 | 74 gaim_debug_info("gaim_remote_handle_uri", "Handling URI: %s\n", uri); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
75 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
76 /* Well, we'd better check to make sure we have at least one |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
77 AIM account connected. */ |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
78 for (conn = gaim_connections_get_all(); conn != NULL; conn = conn->next) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
79 gc = conn->data; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
80 account = gaim_connection_get_account(gc); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
81 username = gaim_account_get_username(account); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
82 |
9460 | 83 if (strcmp(gaim_account_get_protocol_id(account), "prpl-oscar") == 0 && |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
84 username != NULL && isalpha(*username)) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
85 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
86 break; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
87 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
88 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
89 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
90 if (gc == NULL) |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
91 return _("Not connected to AIM"); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
92 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
93 /* aim:goim?screenname=screenname&message=message */ |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
94 if (!g_ascii_strncasecmp(uri, "aim:goim?", strlen("aim:goim?"))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
95 char *who, *what; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
96 GaimConversation *c; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
97 uri = uri + strlen("aim:goim?"); |
10395 | 98 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
99 if (!(who = strstr(uri, "screenname="))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
100 return _("No screenname given."); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
101 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
102 /* spaces are encoded as +'s */ |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
103 who = who + strlen("screenname="); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
104 str = g_string_new(NULL); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
105 while (*who && (*who != '&')) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
106 g_string_append_c(str, *who == '+' ? ' ' : *who); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
107 who++; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
108 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
109 who = g_strdup(str->str); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
110 g_string_free(str, TRUE); |
10395 | 111 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
112 what = strstr(uri, "message="); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
113 if (what) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
114 what = what + strlen("message="); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
115 str = g_string_new(NULL); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
116 while (*what && (*what != '&' || !g_ascii_strncasecmp(what, "&", 5))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
117 g_string_append_c(str, *what == '+' ? ' ' : *what); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
118 what++; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
119 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
120 what = g_strdup(str->str); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
121 g_string_free(str, TRUE); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
122 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
123 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
124 c = gaim_conversation_new(GAIM_CONV_IM, gc->account, who); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
125 g_free(who); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
126 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
127 if (what) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
128 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(c); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
129 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
130 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, what, -1); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
131 g_free(what); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
132 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
133 } else if (!g_ascii_strncasecmp(uri, "aim:addbuddy?", strlen("aim:addbuddy?"))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
134 char *who, *group; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
135 uri = uri + strlen("aim:addbuddy?"); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
136 /* spaces are encoded as +'s */ |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
137 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
138 if (!(who = strstr(uri, "screenname="))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
139 return _("No screenname given."); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
140 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
141 who = who + strlen("screenname="); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
142 str = g_string_new(NULL); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
143 while (*who && (*who != '&')) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
144 g_string_append_c(str, *who == '+' ? ' ' : *who); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
145 who++; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
146 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
147 who = g_strdup(str->str); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
148 g_string_free(str, TRUE); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
149 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
150 group = strstr(uri, "group="); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
151 if (group) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
152 group = group + strlen("group="); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
153 str = g_string_new(NULL); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
154 while (*group && (*group != '&' || !g_ascii_strncasecmp(group, "&", 5))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
155 g_string_append_c(str, *group == '+' ? ' ' : *group); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
156 group++; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
157 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
158 group = g_strdup(str->str); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
159 g_string_free(str, TRUE); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
160 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
161 |
10003 | 162 gaim_debug_misc("gaim_remote_handle_uri", "who: %s\n", who); |
7100
abdc55ffadba
[gaim-migrate @ 7665]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
163 gaim_blist_request_add_buddy(gc->account, who, group, NULL); |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
164 g_free(who); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
165 if (group) |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
166 g_free(group); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
167 } else if (!g_ascii_strncasecmp(uri, "aim:gochat?", strlen("aim:gochat?"))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
168 char *room; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
169 GHashTable *components; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
170 int exch = 5; |
10395 | 171 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
172 uri = uri + strlen("aim:gochat?"); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
173 /* spaces are encoded as +'s */ |
10395 | 174 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
175 if (!(room = strstr(uri, "roomname="))) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
176 return _("No roomname given."); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
177 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
178 room = room + strlen("roomname="); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
179 str = g_string_new(NULL); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
180 while (*room && (*room != '&')) { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
181 g_string_append_c(str, *room == '+' ? ' ' : *room); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
182 room++; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
183 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
184 room = g_strdup(str->str); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
185 g_string_free(str, TRUE); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
186 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
187 g_free); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
188 g_hash_table_replace(components, g_strdup("room"), room); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
189 g_hash_table_replace(components, g_strdup("exchange"), |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
190 g_strdup_printf("%d", exch)); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
191 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
192 serv_join_chat(gc, components); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
193 g_hash_table_destroy(components); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
194 } else { |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
195 return _("Invalid AIM URI"); |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
196 } |
10395 | 197 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
198 return NULL; |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
199 } |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
200 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
201 |
5859 | 202 |
203 #if 0 | |
204 static guchar * | |
205 UI_build(guint32 *len, guchar type, guchar subtype, va_list args) | |
206 { | |
207 guchar *buffer; | |
208 guint32 pos; | |
209 int size; | |
210 void *data; | |
211 | |
212 *len = sizeof(guchar) * 2 + 4; | |
213 buffer = g_malloc(*len); | |
214 pos = 0; | |
215 | |
216 memcpy(buffer + pos, &type, sizeof(type)); pos += sizeof(type); | |
217 memcpy(buffer + pos, &subtype, sizeof(subtype)); pos += sizeof(subtype); | |
218 | |
219 /* we come back and do size last */ | |
220 pos += 4; | |
221 | |
222 size = va_arg(args, int); | |
223 while (size != -1) { | |
224 *len += size; | |
225 buffer = g_realloc(buffer, *len); | |
226 | |
227 data = va_arg(args, void *); | |
228 memcpy(buffer + pos, data, size); | |
229 pos += size; | |
230 | |
231 size = va_arg(args, int); | |
232 } | |
233 | |
234 pos -= sizeof(guchar) * 2 + 4; | |
235 | |
236 /* now we do size */ | |
237 memcpy(buffer + sizeof(guchar) * 2, &pos, 4); | |
238 | |
239 return buffer; | |
240 } | |
241 | |
242 static gint | |
243 UI_write(struct UI *ui, guchar *data, gint len) | |
244 { | |
245 GError *error = NULL; | |
246 gint sent; | |
247 /* we'll let the write silently fail because the read will pick it up as dead */ | |
248 g_io_channel_write_chars(ui->channel, data, len, &sent, &error); | |
249 if (error) | |
250 g_error_free(error); | |
251 return sent; | |
252 } | |
253 | |
254 static void | |
255 UI_build_write(struct UI *ui, guchar type, guchar subtype, ...) | |
256 { | |
257 va_list ap; | |
258 gchar *data; | |
259 guint32 len; | |
260 | |
261 va_start(ap, subtype); | |
262 data = UI_build(&len, type, subtype, ap); | |
263 va_end(ap); | |
264 | |
265 UI_write(ui, data, len); | |
266 | |
267 g_free(data); | |
268 } | |
269 | |
270 static void | |
271 UI_broadcast(guchar *data, gint len) | |
272 { | |
273 GSList *u = uis; | |
274 while (u) { | |
275 struct UI *ui = u->data; | |
276 UI_write(ui, data, len); | |
277 u = u->next; | |
278 } | |
279 } | |
280 | |
281 static void | |
282 UI_build_broadcast(guchar type, guchar subtype, ...) | |
283 { | |
284 va_list ap; | |
285 gchar *data; | |
286 guint32 len; | |
287 | |
288 if (!uis) | |
289 return; | |
290 | |
291 va_start(ap, subtype); | |
292 data = UI_build(&len, type, subtype, ap); | |
293 va_end(ap); | |
294 | |
295 UI_broadcast(data, len); | |
296 | |
297 g_free(data); | |
298 } | |
299 #endif | |
300 | |
301 #ifndef _WIN32 | |
302 static void | |
6063 | 303 meta_handler(struct UI *ui, guchar subtype, gchar *data) |
5859 | 304 { |
305 GaimRemotePacket *p; | |
306 GError *error = NULL; | |
10395 | 307 |
5859 | 308 switch (subtype) { |
309 case CUI_META_LIST: | |
310 break; | |
311 case CUI_META_QUIT: | |
312 while (uis) { | |
313 ui = uis->data; | |
314 uis = g_slist_remove(uis, ui); | |
315 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
316 g_source_remove(ui->inpa); | |
317 g_free(ui); | |
318 } | |
7646 | 319 g_timeout_add(0, gaim_core_quit_cb, NULL); |
5859 | 320 break; |
321 case CUI_META_DETACH: | |
322 uis = g_slist_remove(uis, ui); | |
323 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
324 g_source_remove(ui->inpa); | |
325 g_free(ui); | |
326 break; | |
327 case CUI_META_PING: | |
328 p = gaim_remote_packet_new(CUI_TYPE_META, CUI_META_ACK); | |
329 gaim_remote_session_send_packet(g_io_channel_unix_get_fd(ui->channel), | |
330 p); | |
331 gaim_remote_packet_free(p); | |
332 break; | |
333 default: | |
10003 | 334 gaim_debug_warning("cui", "Unhandled meta subtype %d\n", subtype); |
5859 | 335 break; |
336 } | |
337 | |
338 if(error) | |
339 g_error_free(error); | |
340 } | |
341 | |
342 static void | |
6063 | 343 plugin_handler(struct UI *ui, guchar subtype, gpointer data) |
5859 | 344 { |
345 #ifdef GAIM_PLUGINS | |
346 guint id; | |
347 GaimPlugin *p; | |
348 | |
349 switch (subtype) { | |
350 /* | |
351 case CUI_PLUGIN_LIST: | |
352 break; | |
353 */ | |
354 case CUI_PLUGIN_LOAD: | |
355 gaim_plugin_load(gaim_plugin_probe(data)); | |
356 break; | |
357 case CUI_PLUGIN_UNLOAD: | |
358 memcpy(&id, data, sizeof(id)); | |
359 p = g_list_nth_data(gaim_plugins_get_loaded(), id); | |
360 if (p) { | |
361 gaim_plugin_unload(p); | |
362 } | |
363 break; | |
364 default: | |
10003 | 365 gaim_debug_warning("cui", "Unhandled plugin subtype %d\n", subtype); |
5859 | 366 break; |
367 } | |
368 #endif | |
369 } | |
370 | |
371 static void | |
6063 | 372 user_handler(struct UI *ui, guchar subtype, gchar *data) |
5859 | 373 { |
374 guint id; | |
375 GaimAccount *account; | |
376 | |
377 switch (subtype) { | |
10005 | 378 /* |
5859 | 379 case CUI_USER_LIST: |
380 break; | |
381 case CUI_USER_ADD: | |
382 break; | |
383 case CUI_USER_REMOVE: | |
384 break; | |
385 case CUI_USER_MODIFY: | |
386 break; | |
10005 | 387 */ |
388 | |
5859 | 389 case CUI_USER_SIGNON: |
390 if (!data) | |
391 return; | |
392 memcpy(&id, data, sizeof(id)); | |
393 account = g_list_nth_data(gaim_accounts_get_all(), id); | |
394 if (account) | |
10738 | 395 gaim_account_connect(account); |
5859 | 396 /* don't need to do anything here because the UI will get updates from other handlers */ |
397 break; | |
10005 | 398 |
9962 | 399 #if 0 /* STATUS */ |
10005 | 400 case CUI_USER_AWAY: |
401 { | |
402 GSList* l; | |
403 const char* default_away_name = gaim_prefs_get_string("/core/away/default_message"); | |
9608 | 404 |
10005 | 405 for (l = away_messages; l; l = l->next) { |
406 if (!strcmp(default_away_name, ((struct away_message *)l->data)->name)) { | |
407 do_away_message(NULL, l->data); | |
408 break; | |
409 } | |
410 } | |
411 } | |
412 break; | |
413 | |
414 case CUI_USER_BACK: | |
415 do_im_back(NULL, NULL); | |
416 break; | |
417 | |
9962 | 418 #endif /* STATUS */ |
10395 | 419 |
420 case CUI_USER_LOGOUT: | |
421 gaim_connections_disconnect_all(); | |
422 break; | |
423 | |
5859 | 424 default: |
10003 | 425 gaim_debug_warning("cui", "Unhandled user subtype %d\n", subtype); |
5859 | 426 break; |
427 } | |
428 } | |
429 | |
430 static void | |
6063 | 431 message_handler(struct UI *ui, guchar subtype, gchar *data) |
5859 | 432 { |
433 switch (subtype) { | |
434 case CUI_MESSAGE_LIST: | |
435 break; | |
436 case CUI_MESSAGE_SEND: | |
437 if (!data) | |
438 return; | |
439 { | |
440 guint id; | |
441 GaimConnection *gc; | |
442 guint len; | |
443 char *who, *msg; | |
444 gint flags; | |
445 int pos = 0; | |
446 | |
447 memcpy(&id, data + pos, sizeof(id)); | |
448 pos += sizeof(id); | |
449 gc = g_list_nth_data(gaim_connections_get_all(), id); | |
450 if (!gc) | |
451 return; | |
452 | |
453 memcpy(&len, data + pos, sizeof(len)); | |
454 pos += sizeof(len); | |
455 who = g_strndup(data + pos, len + 1); | |
456 pos += len; | |
457 | |
458 memcpy(&len, data + pos, sizeof(len)); | |
459 pos += sizeof(len); | |
460 msg = g_strndup(data + pos, len + 1); | |
461 pos += len; | |
462 | |
463 memcpy(&flags, data + pos, sizeof(flags)); | |
6982 | 464 serv_send_im(gc, who, msg, flags); |
5859 | 465 |
466 g_free(who); | |
467 g_free(msg); | |
468 } | |
469 break; | |
470 case CUI_MESSAGE_RECV: | |
471 break; | |
472 default: | |
10003 | 473 gaim_debug_warning("cui", "Unhandled message subtype %d\n", subtype); |
5859 | 474 break; |
475 } | |
476 } | |
477 | |
478 static gint | |
6063 | 479 gaim_recv(GIOChannel *source, gchar *buf, gint len) |
5859 | 480 { |
481 gint total = 0; | |
10124 | 482 gsize cur; |
5859 | 483 |
484 GError *error = NULL; | |
485 | |
486 while (total < len) { | |
10124 | 487 if (g_io_channel_read_chars(source, buf + total, len - total, &cur, &error) != G_IO_STATUS_NORMAL) { |
5859 | 488 if (error) |
489 g_error_free(error); | |
490 return -1; | |
491 } | |
492 if (cur == 0) | |
493 return total; | |
494 total += cur; | |
495 } | |
496 | |
497 return total; | |
498 } | |
499 | |
500 static void | |
6063 | 501 remote_handler(struct UI *ui, guchar subtype, gchar *data, int len) |
5859 | 502 { |
503 const char *resp; | |
504 char *send; | |
10003 | 505 GList *c = gaim_connections_get_all(); |
10012 | 506 GaimConnection *gc = NULL; |
10003 | 507 GaimAccount *account; |
508 | |
5859 | 509 switch (subtype) { |
510 case CUI_REMOTE_CONNECTIONS: | |
511 break; | |
10003 | 512 case CUI_REMOTE_SEND: |
513 if (!data) | |
514 return; | |
515 { | |
516 GaimConversation *conv; | |
10005 | 517 guint tlen, len, len2, quiet; |
10003 | 518 char *who, *msg; |
519 char *tmp, *from, *proto; | |
520 int pos = 0; | |
521 | |
522 gaim_debug_info("cui", "Got `gaim-remote send` packet\n",data); | |
523 gaim_debug_info("cui", "g-r>%s;\n",data); | |
524 | |
525 tmp = g_strndup(data + pos, 4); | |
10005 | 526 tlen = atoi(tmp); |
527 pos += 4; | |
10003 | 528 |
10005 | 529 who = g_strndup(data+pos, tlen); |
530 pos += tlen; | |
10003 | 531 |
532 tmp = g_strndup(data + pos, 4); | |
10005 | 533 tlen = atoi(tmp); len=tlen; /* length for 'from' compare */ |
534 pos += 4; | |
10003 | 535 |
10005 | 536 from = g_strndup(data+pos, tlen); |
537 pos += tlen; | |
10003 | 538 |
539 tmp = g_strndup(data + pos, 4); | |
10005 | 540 tlen = atoi(tmp); len2=tlen; /* length for 'proto' compare */ |
541 pos += 4; | |
542 | |
543 proto = g_strndup(data+pos, tlen); | |
544 pos += tlen; | |
10003 | 545 |
546 tmp = g_strndup(data + pos, 4); | |
10005 | 547 tlen = atoi(tmp); |
548 pos += 4; | |
10003 | 549 |
10005 | 550 msg = g_strndup(data+pos, tlen); |
551 pos += tlen; | |
10003 | 552 |
553 tmp = g_strndup(data + pos, 1); | |
10005 | 554 quiet = atoi(tmp); /* quiet flag - not in use yet */ |
10003 | 555 |
10005 | 556 /* find acct */ |
10003 | 557 while (c) { |
558 gc = c->data; | |
559 account=gaim_connection_get_account(gc); | |
560 if ((!gaim_utf8_strcasecmp(from, gaim_account_get_username(account))) && (!g_ascii_strncasecmp(proto, gaim_account_get_protocol_id(account), len2)) ) | |
561 break; | |
562 c = c->next; | |
563 } | |
564 if (!gc) | |
565 return; | |
10005 | 566 /* end acct find */ |
10003 | 567 |
10005 | 568 /* gaim_debug_info("cui", "g-r>To: %s; From: %s; Protocol: %s; Message: %s; Quiet: %d\n",who,from,proto,msg,quiet); */ |
10003 | 569 conv = gaim_conversation_new(GAIM_CONV_IM, gaim_connection_get_account(gc), who); |
570 gaim_conv_im_send(GAIM_CONV_IM(conv), msg); | |
571 | |
10005 | 572 /* likely to be used for quiet: |
10003 | 573 serv_send_im(gc, who, msg, -1, 0); |
574 */ | |
10005 | 575 |
10003 | 576 g_free(who); |
577 g_free(msg); | |
578 g_free(from); | |
579 g_free(tmp); | |
580 } | |
581 break; | |
582 | |
5859 | 583 case CUI_REMOTE_URI: |
584 send = g_malloc(len + 1); | |
585 memcpy(send, data, len); | |
586 send[len] = 0; | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
587 resp = gaim_remote_handle_uri(send); |
5859 | 588 g_free(send); |
589 /* report error */ | |
590 break; | |
10005 | 591 |
5859 | 592 default: |
10003 | 593 gaim_debug_warning("cui", "Unhandled remote subtype %d\n", subtype); |
5859 | 594 break; |
595 } | |
596 } | |
597 | |
598 static gboolean | |
599 UI_readable(GIOChannel *source, GIOCondition cond, gpointer data) | |
600 { | |
601 struct UI *ui = data; | |
6063 | 602 gchar type; |
603 gchar subtype; | |
7631 | 604 gint len; |
5859 | 605 GError *error = NULL; |
6063 | 606 gchar *in; |
5859 | 607 |
608 /* no byte order worries! this'll change if we go to TCP */ | |
609 if (gaim_recv(source, &type, sizeof(type)) != sizeof(type)) { | |
10003 | 610 gaim_debug_error("cui", "UI has abandoned us!\n"); |
5859 | 611 uis = g_slist_remove(uis, ui); |
612 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
613 if(error) { | |
614 g_error_free(error); | |
615 error = NULL; | |
616 } | |
617 g_source_remove(ui->inpa); | |
618 g_free(ui); | |
619 return FALSE; | |
620 } | |
621 | |
622 if (gaim_recv(source, &subtype, sizeof(subtype)) != sizeof(subtype)) { | |
10003 | 623 gaim_debug_error("cui", "UI has abandoned us!\n"); |
5859 | 624 uis = g_slist_remove(uis, ui); |
625 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
626 if(error) { | |
627 g_error_free(error); | |
628 error = NULL; | |
629 } | |
630 g_source_remove(ui->inpa); | |
631 g_free(ui); | |
632 return FALSE; | |
633 } | |
634 | |
6063 | 635 if (gaim_recv(source, (gchar *)&len, sizeof(len)) != sizeof(len)) { |
10003 | 636 gaim_debug_error("cui", "UI has abandoned us!\n"); |
5859 | 637 uis = g_slist_remove(uis, ui); |
638 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
639 if(error) { | |
640 g_error_free(error); | |
641 error = NULL; | |
642 } | |
643 g_source_remove(ui->inpa); | |
644 g_free(ui); | |
645 return FALSE; | |
646 } | |
647 | |
648 if (len) { | |
6063 | 649 in = g_new0(gchar, len); |
5859 | 650 if (gaim_recv(source, in, len) != len) { |
10003 | 651 gaim_debug_error("cui", "UI has abandoned us!\n"); |
5859 | 652 uis = g_slist_remove(uis, ui); |
653 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
654 if(error) { | |
655 g_error_free(error); | |
656 error = NULL; | |
657 } | |
658 g_source_remove(ui->inpa); | |
659 g_free(ui); | |
660 return FALSE; | |
661 } | |
662 } else | |
663 in = NULL; | |
664 | |
665 switch (type) { | |
666 case CUI_TYPE_META: | |
667 meta_handler(ui, subtype, in); | |
668 break; | |
669 case CUI_TYPE_PLUGIN: | |
670 plugin_handler(ui, subtype, in); | |
671 break; | |
672 case CUI_TYPE_USER: | |
673 user_handler(ui, subtype, in); | |
674 break; | |
675 /* | |
676 case CUI_TYPE_CONN: | |
677 conn_handler(ui, subtype, in); | |
678 break; | |
679 case CUI_TYPE_BUDDY: | |
680 buddy_handler(ui, subtype, in); | |
681 break; | |
682 */ | |
683 case CUI_TYPE_MESSAGE: | |
684 message_handler(ui, subtype, in); | |
685 break; | |
686 /* | |
687 case CUI_TYPE_CHAT: | |
688 chat_handler(ui, subtype, in); | |
689 break; | |
10395 | 690 */ |
10005 | 691 case CUI_TYPE_REMOTE: |
5859 | 692 remote_handler(ui, subtype, in, len); |
10395 | 693 break; |
10005 | 694 default: |
10003 | 695 gaim_debug_warning("cui", "Unhandled type %d\n", type); |
5859 | 696 break; |
697 } | |
698 | |
699 if (in) | |
700 g_free(in); | |
701 return TRUE; | |
702 } | |
703 | |
704 static gboolean | |
705 socket_readable(GIOChannel *source, GIOCondition cond, gpointer data) | |
706 { | |
707 struct sockaddr_un saddr; | |
6063 | 708 guint len = sizeof(saddr); |
5859 | 709 gint fd; |
710 | |
711 struct UI *ui; | |
712 | |
713 if ((fd = accept(UI_fd, (struct sockaddr *)&saddr, &len)) == -1) | |
714 return FALSE; | |
715 | |
716 ui = g_new0(struct UI, 1); | |
717 uis = g_slist_append(uis, ui); | |
718 | |
719 ui->channel = g_io_channel_unix_new(fd); | |
720 ui->inpa = g_io_add_watch(ui->channel, G_IO_IN | G_IO_HUP | G_IO_ERR, UI_readable, ui); | |
721 g_io_channel_unref(ui->channel); | |
722 | |
10003 | 723 gaim_debug_misc("cui", "Got one\n"); |
5859 | 724 return TRUE; |
725 } | |
726 | |
727 static gint | |
8704 | 728 open_socket(char **error) |
5859 | 729 { |
730 struct sockaddr_un saddr; | |
731 gint fd; | |
10395 | 732 |
5859 | 733 while (gaim_remote_session_exists(gaim_session)) |
734 gaim_session++; | |
10395 | 735 |
10003 | 736 gaim_debug_misc("cui", "Session: %d\n", gaim_session); |
10395 | 737 |
5859 | 738 if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) != -1) { |
739 mode_t m = umask(0177); | |
740 saddr.sun_family = AF_UNIX; | |
741 | |
742 g_snprintf(saddr.sun_path, sizeof(saddr.sun_path), "%s" G_DIR_SEPARATOR_S "gaim_%s.%d", | |
743 g_get_tmp_dir(), g_get_user_name(), gaim_session); | |
10616 | 744 /* Remove any stale socket on this session */ |
745 unlink(saddr.sun_path); | |
5859 | 746 if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) != -1) |
747 listen(fd, 100); | |
748 else { | |
10462 | 749 char *tmp = g_locale_to_utf8(strerror(errno), -1, NULL, NULL, NULL); |
8704 | 750 *error = g_strdup_printf(_("Failed to assign %s to a socket:\n%s"), |
10462 | 751 saddr.sun_path, tmp); |
5859 | 752 g_log(NULL, G_LOG_LEVEL_CRITICAL, |
10395 | 753 "Failed to assign %s to a socket (Error: %s)", |
5859 | 754 saddr.sun_path, strerror(errno)); |
7617 | 755 umask(m); |
10462 | 756 g_free(tmp); |
5859 | 757 return -1; |
758 } | |
759 umask(m); | |
760 } else | |
761 g_log(NULL, G_LOG_LEVEL_CRITICAL, "Unable to open socket: %s", strerror(errno)); | |
762 return fd; | |
763 } | |
764 #endif /*! _WIN32*/ | |
765 | |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
766 static gboolean |
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
767 plugin_load(GaimPlugin *plugin) |
5859 | 768 { |
769 #ifndef _WIN32 | |
770 GIOChannel *channel; | |
10344 | 771 char *buf = NULL; |
5859 | 772 |
8704 | 773 if ((UI_fd = open_socket(&buf)) < 0) { |
774 gaim_notify_error(NULL, NULL, _("Unable to open socket"), buf); | |
775 g_free(buf); | |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
776 return FALSE; |
8704 | 777 } |
5859 | 778 |
779 channel = g_io_channel_unix_new(UI_fd); | |
6107 | 780 watcher = g_io_add_watch(channel, G_IO_IN, socket_readable, NULL); |
5859 | 781 g_io_channel_unref(channel); |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
782 |
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
783 return TRUE; |
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
784 #else |
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
785 return FALSE; |
5859 | 786 #endif |
787 } | |
788 | |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
789 static gboolean |
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
790 plugin_unload(GaimPlugin *plugin) |
5859 | 791 { |
792 /* don't save prefs after plugins are gone... */ | |
793 #ifndef _WIN32 | |
794 char buf[1024]; | |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
795 |
6107 | 796 g_source_remove(watcher); |
5859 | 797 close(UI_fd); |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
798 |
6063 | 799 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S "gaim_%s.%d", |
5859 | 800 g_get_tmp_dir(), g_get_user_name(), gaim_session); |
801 | |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10462
diff
changeset
|
802 g_unlink(buf); |
5859 | 803 |
10003 | 804 gaim_debug_misc("core", "Removed core\n"); |
5954 | 805 |
806 return TRUE; | |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
807 #else |
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
808 return FALSE; |
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
809 #endif |
5859 | 810 } |
811 | |
812 static GaimPluginInfo info = | |
813 { | |
9943 | 814 GAIM_PLUGIN_MAGIC, |
815 GAIM_MAJOR_VERSION, | |
816 GAIM_MINOR_VERSION, | |
5859 | 817 GAIM_PLUGIN_STANDARD, /**< type */ |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
818 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ |
5859 | 819 0, /**< flags */ |
820 NULL, /**< dependencies */ | |
821 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
822 | |
823 REMOTE_PLUGIN_ID, /**< id */ | |
824 N_("Remote Control"), /**< name */ | |
825 VERSION, /**< version */ | |
826 /** summary */ | |
827 N_("Provides remote control for gaim applications."), | |
828 /** description */ | |
829 N_("Gives Gaim the ability to be remote-controlled through third-party " | |
830 "applications or through the gaim-remote tool."), | |
7782
795b71216887
[gaim-migrate @ 8427]
Christian Hammond <chipx86@chipx86.com>
parents:
7646
diff
changeset
|
831 "Sean Egan <sean.egan@binghamton.edu>", |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6179
diff
changeset
|
832 GAIM_WEBSITE, /**< homepage */ |
5859 | 833 |
834 plugin_load, /**< load */ | |
835 plugin_unload, /**< unload */ | |
836 NULL, /**< destroy */ | |
837 | |
838 NULL, /**< ui_info */ | |
8993 | 839 NULL, /**< extra_info */ |
840 NULL, | |
841 NULL | |
5859 | 842 }; |
843 | |
844 static void | |
10005 | 845 _init_plugin(GaimPlugin *plugin) |
5859 | 846 { |
847 } | |
848 | |
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
849 /* This may be horribly wrong. Oh the mayhem! */ |
10005 | 850 GAIM_INIT_PLUGIN(remote, _init_plugin, info) |