Mercurial > pidgin.yaz
annotate plugins/filectl.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 | 0f7452b1f777 |
children | 1b927566fcc4 |
rev | line source |
---|---|
10256 | 1 /** |
2 * Send commands to Gaim via ~/.gaim/control | |
3 * | |
4 * Originally by Eric Warmenhoven <eric@warmenhoven.org> | |
5 * Compile fixes/mini hacks Alex Bennee <alex@bennee.com> | |
6 * and Brian Tarricone <bjt23@users.sourceforge.net> | |
7 */ | |
106 | 8 |
7658 | 9 /* system includes */ |
106 | 10 #include <stdlib.h> |
7658 | 11 #include <stdio.h> |
106 | 12 #include <unistd.h> |
13 #include <sys/types.h> | |
14 #include <sys/stat.h> | |
15 #include <string.h> | |
16 #include <ctype.h> | |
17 | |
10256 | 18 #include "account.h" |
7658 | 19 #include "config.h" |
10256 | 20 #include "core.h" |
21 #include "conversation.h" | |
22 #include "debug.h" | |
23 #include "eventloop.h" | |
24 #include "internal.h" | |
25 #include "util.h" | |
9954 | 26 #include "version.h" |
7658 | 27 |
5255 | 28 #define FILECTL_PLUGIN_ID "core-filectl" |
179
8d8faeab01f6
[gaim-migrate @ 189]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
106
diff
changeset
|
29 static int check; |
8d8faeab01f6
[gaim-migrate @ 189]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
106
diff
changeset
|
30 static time_t mtime; |
106 | 31 |
179
8d8faeab01f6
[gaim-migrate @ 189]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
106
diff
changeset
|
32 static void init_file(); |
7658 | 33 static gboolean check_file(); |
106 | 34 |
35 /* parse char * as if were word array */ | |
36 char *getarg(char *, int, int); | |
37 | |
38 /* go through file and run any commands */ | |
10256 | 39 void |
40 run_commands() | |
41 { | |
106 | 42 struct stat finfo; |
43 char filename[256]; | |
44 char buffer[1024]; | |
45 char *command, *arg1, *arg2; | |
46 FILE *file; | |
47 | |
10256 | 48 sprintf(filename, "%s" G_DIR_SEPARATOR_S "control", gaim_user_dir()); |
106 | 49 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10416
diff
changeset
|
50 file = g_fopen(filename, "r+"); |
10256 | 51 while (fgets(buffer, sizeof(buffer), file)) { |
52 | |
53 /* Read the next command */ | |
106 | 54 if (buffer[strlen(buffer) - 1] == '\n') |
55 buffer[strlen(buffer) - 1] = 0; | |
10256 | 56 gaim_debug_misc("filectl", "read: %s\n", buffer); |
106 | 57 command = getarg(buffer, 0, 0); |
10256 | 58 |
10272 | 59 if (!strncasecmp(command, "login", 6)) { |
10256 | 60 GaimAccount *account; |
61 | |
106 | 62 arg1 = getarg(buffer, 1, 0); |
63 arg2 = getarg(buffer, 2, 1); | |
10256 | 64 |
65 account = gaim_accounts_find(arg1, arg2); | |
66 if (account != NULL) /* username found */ | |
10416 | 67 gaim_account_connect(account, gaim_account_get_status(account, "online")); |
10256 | 68 |
69 free(arg1); | |
70 free(arg2); | |
71 | |
10272 | 72 } else if (!strncasecmp(command, "logout", 7)) { |
10256 | 73 GaimAccount *account; |
74 GaimConnection *gc; | |
75 | |
76 arg1 = getarg(buffer, 1, 1); | |
77 arg2 = getarg(buffer, 2, 1); | |
78 | |
79 account = gaim_accounts_find(arg1, arg2); | |
80 if (account != NULL) | |
7658 | 81 { |
10738 | 82 gaim_account_disconnect(account); |
10256 | 83 } |
84 else if (arg1 == NULL) | |
85 gaim_connections_disconnect_all(); | |
86 | |
87 free(arg1); | |
88 free(arg2); | |
89 | |
90 } else if (!strncasecmp(command, "send", 4)) { | |
91 GaimConversation *conv; | |
92 | |
93 arg1 = getarg(buffer, 1, 0); | |
94 arg2 = getarg(buffer, 2, 1); | |
95 | |
96 conv = gaim_find_conversation(GAIM_CONV_ANY, arg1); | |
97 if (conv != NULL) | |
98 { | |
99 /* | |
100 gaim_conversation_write(conv, arg2, WFLAG_SEND, NULL, time(NULL), -1); | |
101 serv_send_im(conv->gc, arg1, arg2, 0); | |
9863 | 102 */ |
7658 | 103 } |
10256 | 104 |
106 | 105 free(arg1); |
106 free(arg2); | |
10256 | 107 |
106 | 108 } else if (!strncasecmp(command, "away", 4)) { |
109 arg1 = getarg(buffer, 1, 1); | |
10256 | 110 /* serv_set_away_all(arg1); */ |
106 | 111 free(arg1); |
10256 | 112 |
3198 | 113 } else if (!strncasecmp(command, "hide", 4)) { |
10256 | 114 gaim_blist_set_visible(FALSE); |
115 | |
3198 | 116 } else if (!strncasecmp(command, "unhide", 6)) { |
10256 | 117 gaim_blist_set_visible(TRUE); |
118 | |
106 | 119 } else if (!strncasecmp(command, "back", 4)) { |
9863 | 120 /* do_im_back(); */ |
10256 | 121 |
106 | 122 } else if (!strncasecmp(command, "quit", 4)) { |
10256 | 123 gaim_core_quit(); |
124 | |
106 | 125 } |
10256 | 126 |
106 | 127 free(command); |
128 } | |
129 | |
130 fclose(file); | |
131 | |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10416
diff
changeset
|
132 if (g_stat(filename, &finfo) != 0) |
106 | 133 return; |
134 mtime = finfo.st_mtime; | |
135 } | |
136 | |
10256 | 137 /** |
138 * Check to see if the size of the file is > 0. if so, run commands. | |
139 */ | |
140 void | |
141 init_file() | |
142 { | |
106 | 143 /* most of this was taken from Bash v2.04 by the FSF */ |
144 struct stat finfo; | |
10256 | 145 char filename[256]; |
106 | 146 |
10256 | 147 sprintf(filename, "%s" G_DIR_SEPARATOR_S "control", gaim_user_dir()); |
106 | 148 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10416
diff
changeset
|
149 if ((g_stat(filename, &finfo) == 0) && (finfo.st_size > 0)) |
106 | 150 run_commands(); |
151 } | |
152 | |
10256 | 153 /** |
154 * Check to see if we need to run commands from the file. | |
155 */ | |
156 gboolean | |
157 check_file() | |
158 { | |
106 | 159 /* most of this was taken from Bash v2.04 by the FSF */ |
160 struct stat finfo; | |
10256 | 161 char filename[256]; |
106 | 162 |
10256 | 163 sprintf(filename, "%s" G_DIR_SEPARATOR_S "control", gaim_user_dir()); |
106 | 164 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10416
diff
changeset
|
165 if ((g_stat(filename, &finfo) == 0) && (finfo.st_size > 0)) |
7658 | 166 { |
179
8d8faeab01f6
[gaim-migrate @ 189]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
106
diff
changeset
|
167 if (mtime != finfo.st_mtime) { |
10256 | 168 gaim_debug_info("filectl", "control changed, checking\n"); |
106 | 169 run_commands(); |
179
8d8faeab01f6
[gaim-migrate @ 189]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
106
diff
changeset
|
170 } |
7658 | 171 } |
172 | |
173 return TRUE; | |
106 | 174 } |
175 | |
10256 | 176 char * |
177 getarg(char *line, int which, int remain) | |
178 { | |
106 | 179 char *arr; |
180 char *val; | |
181 int count = -1; | |
182 int i; | |
183 int state = 0; | |
184 | |
185 for (i = 0; i < strlen(line) && count < which; i++) { | |
186 switch (state) { | |
187 case 0: /* in whitespace, expecting word */ | |
188 if (isalnum(line[i])) { | |
189 count++; | |
190 state = 1; | |
191 } | |
192 break; | |
193 case 1: /* inside word, waiting for whitespace */ | |
194 if (isspace(line[i])) { | |
195 state = 0; | |
196 } | |
197 break; | |
198 } | |
199 } | |
200 | |
201 arr = strdup(&line[i - 1]); | |
202 if (remain) | |
203 return arr; | |
204 | |
205 for (i = 0; i < strlen(arr) && isalnum(arr[i]); i++); | |
206 arr[i] = 0; | |
207 val = strdup(arr); | |
208 arr[i] = ' '; | |
209 free(arr); | |
210 return val; | |
211 } | |
10256 | 212 |
5255 | 213 /* |
214 * EXPORTED FUNCTIONS | |
215 */ | |
216 | |
217 static gboolean | |
218 plugin_load(GaimPlugin *plugin) | |
219 { | |
220 init_file(); | |
10256 | 221 check = gaim_timeout_add(5000, (GSourceFunc)check_file, NULL); |
5255 | 222 |
223 return TRUE; | |
224 } | |
225 | |
226 static gboolean | |
227 plugin_unload(GaimPlugin *plugin) | |
228 { | |
10256 | 229 gaim_timeout_remove(check); |
5255 | 230 |
231 return TRUE; | |
232 } | |
233 | |
234 static GaimPluginInfo info = | |
235 { | |
9954 | 236 GAIM_PLUGIN_MAGIC, |
237 GAIM_MAJOR_VERSION, | |
238 GAIM_MINOR_VERSION, | |
5255 | 239 GAIM_PLUGIN_STANDARD, /**< type */ |
240 NULL, /**< ui_requirement */ | |
241 0, /**< flags */ | |
242 NULL, /**< dependencies */ | |
243 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
244 | |
245 FILECTL_PLUGIN_ID, /**< id */ | |
246 N_("Gaim File Control"), /**< name */ | |
247 VERSION, /**< version */ | |
248 /** summary */ | |
249 N_("Allows you to control Gaim by entering commands in a file."), | |
250 /** description */ | |
251 N_("Allows you to control Gaim by entering commands in a file."), | |
252 "Eric Warmenhoven <eric@warmenhoven.org>", /**< author */ | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6179
diff
changeset
|
253 GAIM_WEBSITE, /**< homepage */ |
5255 | 254 |
255 plugin_load, /**< load */ | |
256 plugin_unload, /**< unload */ | |
257 NULL, /**< destroy */ | |
258 | |
259 NULL, /**< ui_info */ | |
260 NULL /**< extra_info */ | |
261 }; | |
262 | |
263 static void | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
264 init_plugin(GaimPlugin *plugin) |
5255 | 265 { |
266 } | |
267 | |
6063 | 268 GAIM_INIT_PLUGIN(filectl, init_plugin, info) |