Mercurial > pidgin
annotate plugins/gaim-remote/remote.c @ 10343:ee4f477fc8cf
[gaim-migrate @ 11553]
Minor tweaks to the blist and status xml reading code. These functions
don't expect the filename to be called "blist.xml" and "status.xml"
anymore. Some guy wanted this because he wants to try to add some
sort of AIM buddy list importing, or something. I think.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Fri, 10 Dec 2004 05:49:01 +0000 |
| parents | b4efa002dad8 |
| children | 5976491e07a7 |
| 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?"); |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
98 |
|
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); |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
111 |
|
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; |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
171 |
|
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 */ |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
174 |
|
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 } |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
197 |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
198 |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
199 return NULL; |
|
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 |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
202 |
| 5859 | 203 |
| 204 #if 0 | |
| 205 static guchar * | |
| 206 UI_build(guint32 *len, guchar type, guchar subtype, va_list args) | |
| 207 { | |
| 208 guchar *buffer; | |
| 209 guint32 pos; | |
| 210 int size; | |
| 211 void *data; | |
| 212 | |
| 213 *len = sizeof(guchar) * 2 + 4; | |
| 214 buffer = g_malloc(*len); | |
| 215 pos = 0; | |
| 216 | |
| 217 memcpy(buffer + pos, &type, sizeof(type)); pos += sizeof(type); | |
| 218 memcpy(buffer + pos, &subtype, sizeof(subtype)); pos += sizeof(subtype); | |
| 219 | |
| 220 /* we come back and do size last */ | |
| 221 pos += 4; | |
| 222 | |
| 223 size = va_arg(args, int); | |
| 224 while (size != -1) { | |
| 225 *len += size; | |
| 226 buffer = g_realloc(buffer, *len); | |
| 227 | |
| 228 data = va_arg(args, void *); | |
| 229 memcpy(buffer + pos, data, size); | |
| 230 pos += size; | |
| 231 | |
| 232 size = va_arg(args, int); | |
| 233 } | |
| 234 | |
| 235 pos -= sizeof(guchar) * 2 + 4; | |
| 236 | |
| 237 /* now we do size */ | |
| 238 memcpy(buffer + sizeof(guchar) * 2, &pos, 4); | |
| 239 | |
| 240 return buffer; | |
| 241 } | |
| 242 | |
| 243 static gint | |
| 244 UI_write(struct UI *ui, guchar *data, gint len) | |
| 245 { | |
| 246 GError *error = NULL; | |
| 247 gint sent; | |
| 248 /* we'll let the write silently fail because the read will pick it up as dead */ | |
| 249 g_io_channel_write_chars(ui->channel, data, len, &sent, &error); | |
| 250 if (error) | |
| 251 g_error_free(error); | |
| 252 return sent; | |
| 253 } | |
| 254 | |
| 255 static void | |
| 256 UI_build_write(struct UI *ui, guchar type, guchar subtype, ...) | |
| 257 { | |
| 258 va_list ap; | |
| 259 gchar *data; | |
| 260 guint32 len; | |
| 261 | |
| 262 va_start(ap, subtype); | |
| 263 data = UI_build(&len, type, subtype, ap); | |
| 264 va_end(ap); | |
| 265 | |
| 266 UI_write(ui, data, len); | |
| 267 | |
| 268 g_free(data); | |
| 269 } | |
| 270 | |
| 271 static void | |
| 272 UI_broadcast(guchar *data, gint len) | |
| 273 { | |
| 274 GSList *u = uis; | |
| 275 while (u) { | |
| 276 struct UI *ui = u->data; | |
| 277 UI_write(ui, data, len); | |
| 278 u = u->next; | |
| 279 } | |
| 280 } | |
| 281 | |
| 282 static void | |
| 283 UI_build_broadcast(guchar type, guchar subtype, ...) | |
| 284 { | |
| 285 va_list ap; | |
| 286 gchar *data; | |
| 287 guint32 len; | |
| 288 | |
| 289 if (!uis) | |
| 290 return; | |
| 291 | |
| 292 va_start(ap, subtype); | |
| 293 data = UI_build(&len, type, subtype, ap); | |
| 294 va_end(ap); | |
| 295 | |
| 296 UI_broadcast(data, len); | |
| 297 | |
| 298 g_free(data); | |
| 299 } | |
| 300 #endif | |
| 301 | |
| 302 #ifndef _WIN32 | |
| 303 static void | |
| 6063 | 304 meta_handler(struct UI *ui, guchar subtype, gchar *data) |
| 5859 | 305 { |
| 306 GaimRemotePacket *p; | |
| 307 GError *error = NULL; | |
| 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) | |
| 6036 | 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 */ |
| 5859 | 419 default: |
| 10003 | 420 gaim_debug_warning("cui", "Unhandled user subtype %d\n", subtype); |
| 5859 | 421 break; |
| 422 } | |
| 423 } | |
| 424 | |
| 425 static void | |
| 6063 | 426 message_handler(struct UI *ui, guchar subtype, gchar *data) |
| 5859 | 427 { |
| 428 switch (subtype) { | |
| 429 case CUI_MESSAGE_LIST: | |
| 430 break; | |
| 431 case CUI_MESSAGE_SEND: | |
| 432 if (!data) | |
| 433 return; | |
| 434 { | |
| 435 guint id; | |
| 436 GaimConnection *gc; | |
| 437 guint len; | |
| 438 char *who, *msg; | |
| 439 gint flags; | |
| 440 int pos = 0; | |
| 441 | |
| 442 memcpy(&id, data + pos, sizeof(id)); | |
| 443 pos += sizeof(id); | |
| 444 gc = g_list_nth_data(gaim_connections_get_all(), id); | |
| 445 if (!gc) | |
| 446 return; | |
| 447 | |
| 448 memcpy(&len, data + pos, sizeof(len)); | |
| 449 pos += sizeof(len); | |
| 450 who = g_strndup(data + pos, len + 1); | |
| 451 pos += len; | |
| 452 | |
| 453 memcpy(&len, data + pos, sizeof(len)); | |
| 454 pos += sizeof(len); | |
| 455 msg = g_strndup(data + pos, len + 1); | |
| 456 pos += len; | |
| 457 | |
| 458 memcpy(&flags, data + pos, sizeof(flags)); | |
| 6982 | 459 serv_send_im(gc, who, msg, flags); |
| 5859 | 460 |
| 461 g_free(who); | |
| 462 g_free(msg); | |
| 463 } | |
| 464 break; | |
| 465 case CUI_MESSAGE_RECV: | |
| 466 break; | |
| 467 default: | |
| 10003 | 468 gaim_debug_warning("cui", "Unhandled message subtype %d\n", subtype); |
| 5859 | 469 break; |
| 470 } | |
| 471 } | |
| 472 | |
| 473 static gint | |
| 6063 | 474 gaim_recv(GIOChannel *source, gchar *buf, gint len) |
| 5859 | 475 { |
| 476 gint total = 0; | |
| 10124 | 477 gsize cur; |
| 5859 | 478 |
| 479 GError *error = NULL; | |
| 480 | |
| 481 while (total < len) { | |
| 10124 | 482 if (g_io_channel_read_chars(source, buf + total, len - total, &cur, &error) != G_IO_STATUS_NORMAL) { |
| 5859 | 483 if (error) |
| 484 g_error_free(error); | |
| 485 return -1; | |
| 486 } | |
| 487 if (cur == 0) | |
| 488 return total; | |
| 489 total += cur; | |
| 490 } | |
| 491 | |
| 492 return total; | |
| 493 } | |
| 494 | |
| 495 static void | |
| 6063 | 496 remote_handler(struct UI *ui, guchar subtype, gchar *data, int len) |
| 5859 | 497 { |
| 498 const char *resp; | |
| 499 char *send; | |
| 10003 | 500 GList *c = gaim_connections_get_all(); |
| 10012 | 501 GaimConnection *gc = NULL; |
| 10003 | 502 GaimAccount *account; |
| 503 | |
| 5859 | 504 switch (subtype) { |
| 505 case CUI_REMOTE_CONNECTIONS: | |
| 506 break; | |
| 10003 | 507 case CUI_REMOTE_SEND: |
| 508 if (!data) | |
| 509 return; | |
| 510 { | |
| 511 GaimConversation *conv; | |
| 10005 | 512 guint tlen, len, len2, quiet; |
| 10003 | 513 char *who, *msg; |
| 514 char *tmp, *from, *proto; | |
| 515 int pos = 0; | |
| 516 | |
| 517 gaim_debug_info("cui", "Got `gaim-remote send` packet\n",data); | |
| 518 gaim_debug_info("cui", "g-r>%s;\n",data); | |
| 519 | |
| 520 tmp = g_strndup(data + pos, 4); | |
| 10005 | 521 tlen = atoi(tmp); |
| 522 pos += 4; | |
| 10003 | 523 |
| 10005 | 524 who = g_strndup(data+pos, tlen); |
| 525 pos += tlen; | |
| 10003 | 526 |
| 527 tmp = g_strndup(data + pos, 4); | |
| 10005 | 528 tlen = atoi(tmp); len=tlen; /* length for 'from' compare */ |
| 529 pos += 4; | |
| 10003 | 530 |
| 10005 | 531 from = g_strndup(data+pos, tlen); |
| 532 pos += tlen; | |
| 10003 | 533 |
| 534 tmp = g_strndup(data + pos, 4); | |
| 10005 | 535 tlen = atoi(tmp); len2=tlen; /* length for 'proto' compare */ |
| 536 pos += 4; | |
| 537 | |
| 538 proto = g_strndup(data+pos, tlen); | |
| 539 pos += tlen; | |
| 10003 | 540 |
| 541 tmp = g_strndup(data + pos, 4); | |
| 10005 | 542 tlen = atoi(tmp); |
| 543 pos += 4; | |
| 10003 | 544 |
| 10005 | 545 msg = g_strndup(data+pos, tlen); |
| 546 pos += tlen; | |
| 10003 | 547 |
| 548 tmp = g_strndup(data + pos, 1); | |
| 10005 | 549 quiet = atoi(tmp); /* quiet flag - not in use yet */ |
| 10003 | 550 |
| 10005 | 551 /* find acct */ |
| 10003 | 552 while (c) { |
| 553 gc = c->data; | |
| 554 account=gaim_connection_get_account(gc); | |
| 555 if ((!gaim_utf8_strcasecmp(from, gaim_account_get_username(account))) && (!g_ascii_strncasecmp(proto, gaim_account_get_protocol_id(account), len2)) ) | |
| 556 break; | |
| 557 c = c->next; | |
| 558 } | |
| 559 if (!gc) | |
| 560 return; | |
| 10005 | 561 /* end acct find */ |
| 10003 | 562 |
| 10005 | 563 /* gaim_debug_info("cui", "g-r>To: %s; From: %s; Protocol: %s; Message: %s; Quiet: %d\n",who,from,proto,msg,quiet); */ |
| 10003 | 564 conv = gaim_conversation_new(GAIM_CONV_IM, gaim_connection_get_account(gc), who); |
| 565 gaim_conv_im_send(GAIM_CONV_IM(conv), msg); | |
| 566 | |
| 10005 | 567 /* likely to be used for quiet: |
| 10003 | 568 serv_send_im(gc, who, msg, -1, 0); |
| 569 */ | |
| 10005 | 570 |
| 10003 | 571 g_free(who); |
| 572 g_free(msg); | |
| 573 g_free(from); | |
| 574 g_free(tmp); | |
| 575 } | |
| 576 break; | |
| 577 | |
| 5859 | 578 case CUI_REMOTE_URI: |
| 579 send = g_malloc(len + 1); | |
| 580 memcpy(send, data, len); | |
| 581 send[len] = 0; | |
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
582 resp = gaim_remote_handle_uri(send); |
| 5859 | 583 g_free(send); |
| 584 /* report error */ | |
| 585 break; | |
| 10005 | 586 |
| 5859 | 587 default: |
| 10003 | 588 gaim_debug_warning("cui", "Unhandled remote subtype %d\n", subtype); |
| 5859 | 589 break; |
| 590 } | |
| 591 } | |
| 592 | |
| 593 static gboolean | |
| 594 UI_readable(GIOChannel *source, GIOCondition cond, gpointer data) | |
| 595 { | |
| 596 struct UI *ui = data; | |
| 6063 | 597 gchar type; |
| 598 gchar subtype; | |
| 7631 | 599 gint len; |
| 5859 | 600 GError *error = NULL; |
| 6063 | 601 gchar *in; |
| 5859 | 602 |
| 603 /* no byte order worries! this'll change if we go to TCP */ | |
| 604 if (gaim_recv(source, &type, sizeof(type)) != sizeof(type)) { | |
| 10003 | 605 gaim_debug_error("cui", "UI has abandoned us!\n"); |
| 5859 | 606 uis = g_slist_remove(uis, ui); |
| 607 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
| 608 if(error) { | |
| 609 g_error_free(error); | |
| 610 error = NULL; | |
| 611 } | |
| 612 g_source_remove(ui->inpa); | |
| 613 g_free(ui); | |
| 614 return FALSE; | |
| 615 } | |
| 616 | |
| 617 if (gaim_recv(source, &subtype, sizeof(subtype)) != sizeof(subtype)) { | |
| 10003 | 618 gaim_debug_error("cui", "UI has abandoned us!\n"); |
| 5859 | 619 uis = g_slist_remove(uis, ui); |
| 620 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
| 621 if(error) { | |
| 622 g_error_free(error); | |
| 623 error = NULL; | |
| 624 } | |
| 625 g_source_remove(ui->inpa); | |
| 626 g_free(ui); | |
| 627 return FALSE; | |
| 628 } | |
| 629 | |
| 6063 | 630 if (gaim_recv(source, (gchar *)&len, sizeof(len)) != sizeof(len)) { |
| 10003 | 631 gaim_debug_error("cui", "UI has abandoned us!\n"); |
| 5859 | 632 uis = g_slist_remove(uis, ui); |
| 633 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
| 634 if(error) { | |
| 635 g_error_free(error); | |
| 636 error = NULL; | |
| 637 } | |
| 638 g_source_remove(ui->inpa); | |
| 639 g_free(ui); | |
| 640 return FALSE; | |
| 641 } | |
| 642 | |
| 643 if (len) { | |
| 6063 | 644 in = g_new0(gchar, len); |
| 5859 | 645 if (gaim_recv(source, in, len) != len) { |
| 10003 | 646 gaim_debug_error("cui", "UI has abandoned us!\n"); |
| 5859 | 647 uis = g_slist_remove(uis, ui); |
| 648 g_io_channel_shutdown(ui->channel, TRUE, &error); | |
| 649 if(error) { | |
| 650 g_error_free(error); | |
| 651 error = NULL; | |
| 652 } | |
| 653 g_source_remove(ui->inpa); | |
| 654 g_free(ui); | |
| 655 return FALSE; | |
| 656 } | |
| 657 } else | |
| 658 in = NULL; | |
| 659 | |
| 660 switch (type) { | |
| 661 case CUI_TYPE_META: | |
| 662 meta_handler(ui, subtype, in); | |
| 663 break; | |
| 664 case CUI_TYPE_PLUGIN: | |
| 665 plugin_handler(ui, subtype, in); | |
| 666 break; | |
| 667 case CUI_TYPE_USER: | |
| 668 user_handler(ui, subtype, in); | |
| 669 break; | |
| 670 /* | |
| 671 case CUI_TYPE_CONN: | |
| 672 conn_handler(ui, subtype, in); | |
| 673 break; | |
| 674 case CUI_TYPE_BUDDY: | |
| 675 buddy_handler(ui, subtype, in); | |
| 676 break; | |
| 677 */ | |
| 678 case CUI_TYPE_MESSAGE: | |
| 679 message_handler(ui, subtype, in); | |
| 680 break; | |
| 681 /* | |
| 682 case CUI_TYPE_CHAT: | |
| 683 chat_handler(ui, subtype, in); | |
| 684 break; | |
| 685 */ | |
| 10005 | 686 case CUI_TYPE_REMOTE: |
| 5859 | 687 remote_handler(ui, subtype, in, len); |
| 688 break; | |
| 10005 | 689 default: |
| 10003 | 690 gaim_debug_warning("cui", "Unhandled type %d\n", type); |
| 5859 | 691 break; |
| 692 } | |
| 693 | |
| 694 if (in) | |
| 695 g_free(in); | |
| 696 return TRUE; | |
| 697 } | |
| 698 | |
| 699 static gboolean | |
| 700 socket_readable(GIOChannel *source, GIOCondition cond, gpointer data) | |
| 701 { | |
| 702 struct sockaddr_un saddr; | |
| 6063 | 703 guint len = sizeof(saddr); |
| 5859 | 704 gint fd; |
| 705 | |
| 706 struct UI *ui; | |
| 707 | |
| 708 if ((fd = accept(UI_fd, (struct sockaddr *)&saddr, &len)) == -1) | |
| 709 return FALSE; | |
| 710 | |
| 711 ui = g_new0(struct UI, 1); | |
| 712 uis = g_slist_append(uis, ui); | |
| 713 | |
| 714 ui->channel = g_io_channel_unix_new(fd); | |
| 715 ui->inpa = g_io_add_watch(ui->channel, G_IO_IN | G_IO_HUP | G_IO_ERR, UI_readable, ui); | |
| 716 g_io_channel_unref(ui->channel); | |
| 717 | |
| 10003 | 718 gaim_debug_misc("cui", "Got one\n"); |
| 5859 | 719 return TRUE; |
| 720 } | |
| 721 | |
| 722 static gint | |
| 8704 | 723 open_socket(char **error) |
| 5859 | 724 { |
| 725 struct sockaddr_un saddr; | |
| 726 gint fd; | |
| 727 | |
| 728 while (gaim_remote_session_exists(gaim_session)) | |
| 729 gaim_session++; | |
| 730 | |
| 10003 | 731 gaim_debug_misc("cui", "Session: %d\n", gaim_session); |
| 5859 | 732 |
| 733 if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) != -1) { | |
| 734 mode_t m = umask(0177); | |
| 735 saddr.sun_family = AF_UNIX; | |
| 736 | |
| 737 g_snprintf(saddr.sun_path, sizeof(saddr.sun_path), "%s" G_DIR_SEPARATOR_S "gaim_%s.%d", | |
| 738 g_get_tmp_dir(), g_get_user_name(), gaim_session); | |
| 739 if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) != -1) | |
| 740 listen(fd, 100); | |
| 741 else { | |
| 8704 | 742 *error = g_strdup_printf(_("Failed to assign %s to a socket:\n%s"), |
| 743 saddr.sun_path, strerror(errno)); | |
| 5859 | 744 g_log(NULL, G_LOG_LEVEL_CRITICAL, |
| 745 "Failed to assign %s to a socket (Error: %s)", | |
| 746 saddr.sun_path, strerror(errno)); | |
| 7617 | 747 umask(m); |
| 5859 | 748 return -1; |
| 749 } | |
| 750 umask(m); | |
| 751 } else | |
| 752 g_log(NULL, G_LOG_LEVEL_CRITICAL, "Unable to open socket: %s", strerror(errno)); | |
| 753 return fd; | |
| 754 } | |
| 755 #endif /*! _WIN32*/ | |
| 756 | |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
757 static gboolean |
|
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
758 plugin_load(GaimPlugin *plugin) |
| 5859 | 759 { |
| 760 #ifndef _WIN32 | |
| 761 GIOChannel *channel; | |
| 8704 | 762 char *buf; |
| 5859 | 763 |
| 8704 | 764 if ((UI_fd = open_socket(&buf)) < 0) { |
| 765 gaim_notify_error(NULL, NULL, _("Unable to open socket"), buf); | |
| 766 g_free(buf); | |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
767 return FALSE; |
| 8704 | 768 } |
| 5859 | 769 |
| 770 channel = g_io_channel_unix_new(UI_fd); | |
| 6107 | 771 watcher = g_io_add_watch(channel, G_IO_IN, socket_readable, NULL); |
| 5859 | 772 g_io_channel_unref(channel); |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
773 |
|
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
774 return TRUE; |
|
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
775 #else |
|
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
776 return FALSE; |
| 5859 | 777 #endif |
| 778 } | |
| 779 | |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
780 static gboolean |
|
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
781 plugin_unload(GaimPlugin *plugin) |
| 5859 | 782 { |
| 783 /* don't save prefs after plugins are gone... */ | |
| 784 #ifndef _WIN32 | |
| 785 char buf[1024]; | |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
786 |
| 6107 | 787 g_source_remove(watcher); |
| 5859 | 788 close(UI_fd); |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
789 |
| 6063 | 790 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S "gaim_%s.%d", |
| 5859 | 791 g_get_tmp_dir(), g_get_user_name(), gaim_session); |
| 792 | |
| 793 unlink(buf); | |
| 794 | |
| 10003 | 795 gaim_debug_misc("core", "Removed core\n"); |
| 5954 | 796 |
| 797 return TRUE; | |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
798 #else |
|
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
799 return FALSE; |
|
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
800 #endif |
| 5859 | 801 } |
| 802 | |
| 803 static GaimPluginInfo info = | |
| 804 { | |
| 9943 | 805 GAIM_PLUGIN_MAGIC, |
| 806 GAIM_MAJOR_VERSION, | |
| 807 GAIM_MINOR_VERSION, | |
| 5859 | 808 GAIM_PLUGIN_STANDARD, /**< type */ |
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5859
diff
changeset
|
809 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ |
| 5859 | 810 0, /**< flags */ |
| 811 NULL, /**< dependencies */ | |
| 812 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
| 813 | |
| 814 REMOTE_PLUGIN_ID, /**< id */ | |
| 815 N_("Remote Control"), /**< name */ | |
| 816 VERSION, /**< version */ | |
| 817 /** summary */ | |
| 818 N_("Provides remote control for gaim applications."), | |
| 819 /** description */ | |
| 820 N_("Gives Gaim the ability to be remote-controlled through third-party " | |
| 821 "applications or through the gaim-remote tool."), | |
|
7782
795b71216887
[gaim-migrate @ 8427]
Christian Hammond <chipx86@chipx86.com>
parents:
7646
diff
changeset
|
822 "Sean Egan <sean.egan@binghamton.edu>", |
|
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6179
diff
changeset
|
823 GAIM_WEBSITE, /**< homepage */ |
| 5859 | 824 |
| 825 plugin_load, /**< load */ | |
| 826 plugin_unload, /**< unload */ | |
| 827 NULL, /**< destroy */ | |
| 828 | |
| 829 NULL, /**< ui_info */ | |
| 8993 | 830 NULL, /**< extra_info */ |
| 831 NULL, | |
| 832 NULL | |
| 5859 | 833 }; |
| 834 | |
| 835 static void | |
| 10005 | 836 _init_plugin(GaimPlugin *plugin) |
| 5859 | 837 { |
| 838 } | |
| 839 | |
|
6177
73f8f5c0e348
[gaim-migrate @ 6662]
Christian Hammond <chipx86@chipx86.com>
parents:
6107
diff
changeset
|
840 /* This may be horribly wrong. Oh the mayhem! */ |
| 10005 | 841 GAIM_INIT_PLUGIN(remote, _init_plugin, info) |
