Mercurial > pidgin.yaz
annotate plugins/filectl.c @ 9793:2ce6f1a0016b
[gaim-migrate @ 10661]
I've been using this file for reference for other work, and finally got
tired with how a few minor things in it was written. The static global
variables were eliminated. Yay!
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Fri, 20 Aug 2004 17:04:43 +0000 |
parents | d7b8eb1f0a18 |
children | 0e3a84f18467 |
rev | line source |
---|---|
7658 | 1 /* |
2 ** Send commands to gaim via ~/.gaim/control | |
3 ** | |
4 ** By Eric Warmenhoven <eric@warmenhoven.org> | |
5 ** compile fixes/mini hacks Alex Bennee <alex@bennee.com> | |
6 */ | |
106 | 7 |
7658 | 8 /* system includes */ |
106 | 9 #include <stdlib.h> |
7658 | 10 #include <stdio.h> |
106 | 11 #include <unistd.h> |
12 #include <sys/types.h> | |
13 #include <sys/stat.h> | |
14 #include <string.h> | |
15 #include <ctype.h> | |
16 | |
7658 | 17 /* gaim includes */ |
18 #include "internal.h" | |
19 | |
20 #include "config.h" | |
21 #include "gaim.h" | |
22 #include "debug.h" | |
23 #include "account.h" | |
24 #include "conversation.h" | |
25 | |
26 | |
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 */ | |
39 void run_commands() { | |
40 struct stat finfo; | |
41 char filename[256]; | |
42 char buffer[1024]; | |
43 char *command, *arg1, *arg2; | |
44 FILE *file; | |
45 | |
46 sprintf(filename, "%s/.gaim/control", getenv("HOME")); | |
47 | |
48 file = fopen(filename, "r+"); | |
49 while (fgets(buffer, sizeof buffer, file)) { | |
50 if (buffer[strlen(buffer) - 1] == '\n') | |
51 buffer[strlen(buffer) - 1] = 0; | |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
52 gaim_debug(GAIM_DEBUG_MISC, "filectl", "read: %s\n", buffer); |
106 | 53 command = getarg(buffer, 0, 0); |
2324
9ab820049ede
[gaim-migrate @ 2334]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
54 if (!strncasecmp(command, "signon", 6)) { |
7658 | 55 GaimAccount *account = NULL; |
56 GList *accts = gaim_accounts_get_all(); | |
2324
9ab820049ede
[gaim-migrate @ 2334]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
57 arg1 = getarg(buffer, 1, 1); |
2765
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
58 if (arg1) { |
4491 | 59 while (accts) { |
7658 | 60 GaimAccount *a = accts->data; |
4491 | 61 if (!strcmp(a->username, arg1)) { |
62 account = a; | |
2324
9ab820049ede
[gaim-migrate @ 2334]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
63 break; |
9ab820049ede
[gaim-migrate @ 2334]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
64 } |
4491 | 65 accts = accts->next; |
2324
9ab820049ede
[gaim-migrate @ 2334]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
66 } |
9ab820049ede
[gaim-migrate @ 2334]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
67 free(arg1); |
106 | 68 } |
4491 | 69 if (account) /* username found */ |
6036 | 70 gaim_account_connect(account); |
106 | 71 } else if (!strncasecmp(command, "signoff", 7)) { |
7658 | 72 GaimConnection *gc = NULL; |
73 GList *c = gaim_connections_get_all(); | |
1047
ece2d1543b20
[gaim-migrate @ 1057]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
576
diff
changeset
|
74 arg1 = getarg(buffer, 1, 1); |
2766
0e082a9e4c32
[gaim-migrate @ 2779]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2765
diff
changeset
|
75 while (arg1 && c) { |
2765
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
76 gc = c->data; |
7658 | 77 if (!strcmp(gc->account->username, arg1)) { |
2765
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
78 break; |
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
79 } |
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
80 gc = NULL; |
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
81 c = c->next; |
2324
9ab820049ede
[gaim-migrate @ 2334]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
82 } |
2765
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
83 if (gc) |
7658 | 84 gaim_connection_disconnect(gc); |
2765
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
85 else if (!arg1) |
7658 | 86 gaim_connections_disconnect_all(); |
2765
dfd9705bc750
[gaim-migrate @ 2778]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2324
diff
changeset
|
87 free(arg1); |
106 | 88 } else if (!strncasecmp(command, "send", 4)) { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5255
diff
changeset
|
89 GaimConversation *c; |
106 | 90 arg1 = getarg(buffer, 1, 0); |
91 arg2 = getarg(buffer, 2, 1); | |
7658 | 92 c = gaim_find_conversation(arg1); |
93 if (c) | |
94 { | |
95 /* disable for now | |
96 gaim_conversation_write(c, arg2, WFLAG_SEND, NULL, time(NULL), -1); | |
97 serv_send_im(c->gc, arg1, arg2, 0); | |
98 */ | |
99 } | |
106 | 100 free(arg1); |
101 free(arg2); | |
102 } else if (!strncasecmp(command, "away", 4)) { | |
103 arg1 = getarg(buffer, 1, 1); | |
7658 | 104 serv_set_away_all(arg1); |
106 | 105 free(arg1); |
3198 | 106 } else if (!strncasecmp(command, "hide", 4)) { |
7658 | 107 //hide_buddy_list(); |
3198 | 108 } else if (!strncasecmp(command, "unhide", 6)) { |
7658 | 109 //unhide_buddy_list(); |
106 | 110 } else if (!strncasecmp(command, "back", 4)) { |
7658 | 111 //do_im_back(); |
106 | 112 } else if (!strncasecmp(command, "quit", 4)) { |
7658 | 113 //gaim_core_quit(); |
106 | 114 } |
115 free(command); | |
116 } | |
117 | |
118 fclose(file); | |
119 | |
120 if (stat (filename, &finfo) != 0) | |
121 return; | |
122 mtime = finfo.st_mtime; | |
123 } | |
124 | |
125 /* check to see if the size of the file is > 0. if so, run commands */ | |
126 void init_file() { | |
127 /* most of this was taken from Bash v2.04 by the FSF */ | |
128 struct stat finfo; | |
129 char file[256]; | |
130 | |
131 sprintf(file, "%s/.gaim/control", getenv("HOME")); | |
132 | |
133 if ((stat (file, &finfo) == 0) && (finfo.st_size > 0)) | |
134 run_commands(); | |
135 } | |
136 | |
137 /* check to see if we need to run commands from the file */ | |
7658 | 138 gboolean check_file() { |
106 | 139 /* most of this was taken from Bash v2.04 by the FSF */ |
140 struct stat finfo; | |
141 char file[256]; | |
142 | |
143 sprintf(file, "%s/.gaim/control", getenv("HOME")); | |
144 | |
145 if ((stat (file, &finfo) == 0) && (finfo.st_size > 0)) | |
7658 | 146 { |
179
8d8faeab01f6
[gaim-migrate @ 189]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
106
diff
changeset
|
147 if (mtime != finfo.st_mtime) { |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
148 gaim_debug(GAIM_DEBUG_INFO, "filectl", |
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
149 "control changed, checking\n"); |
106 | 150 run_commands(); |
179
8d8faeab01f6
[gaim-migrate @ 189]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
106
diff
changeset
|
151 } |
7658 | 152 } |
153 | |
154 return TRUE; | |
106 | 155 } |
156 | |
157 char *getarg(char *line, int which, int remain) { | |
158 char *arr; | |
159 char *val; | |
160 int count = -1; | |
161 int i; | |
162 int state = 0; | |
163 | |
164 for (i = 0; i < strlen(line) && count < which; i++) { | |
165 switch (state) { | |
166 case 0: /* in whitespace, expecting word */ | |
167 if (isalnum(line[i])) { | |
168 count++; | |
169 state = 1; | |
170 } | |
171 break; | |
172 case 1: /* inside word, waiting for whitespace */ | |
173 if (isspace(line[i])) { | |
174 state = 0; | |
175 } | |
176 break; | |
177 } | |
178 } | |
179 | |
180 arr = strdup(&line[i - 1]); | |
181 if (remain) | |
182 return arr; | |
183 | |
184 for (i = 0; i < strlen(arr) && isalnum(arr[i]); i++); | |
185 arr[i] = 0; | |
186 val = strdup(arr); | |
187 arr[i] = ' '; | |
188 free(arr); | |
189 return val; | |
190 } | |
5255 | 191 /* |
192 * EXPORTED FUNCTIONS | |
193 */ | |
194 | |
195 static gboolean | |
196 plugin_load(GaimPlugin *plugin) | |
197 { | |
198 init_file(); | |
7658 | 199 check = g_timeout_add(5000, (GSourceFunc) check_file, NULL); |
5255 | 200 |
201 return TRUE; | |
202 } | |
203 | |
204 static gboolean | |
205 plugin_unload(GaimPlugin *plugin) | |
206 { | |
207 g_source_remove(check); | |
208 | |
209 return TRUE; | |
210 } | |
211 | |
212 static GaimPluginInfo info = | |
213 { | |
8749
d7b8eb1f0a18
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8471
diff
changeset
|
214 GAIM_PLUGIN_API_VERSION, /**< api_version */ |
5255 | 215 GAIM_PLUGIN_STANDARD, /**< type */ |
216 NULL, /**< ui_requirement */ | |
217 0, /**< flags */ | |
218 NULL, /**< dependencies */ | |
219 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
220 | |
221 FILECTL_PLUGIN_ID, /**< id */ | |
222 N_("Gaim File Control"), /**< name */ | |
223 VERSION, /**< version */ | |
224 /** summary */ | |
225 N_("Allows you to control Gaim by entering commands in a file."), | |
226 /** description */ | |
227 N_("Allows you to control Gaim by entering commands in a file."), | |
228 "Eric Warmenhoven <eric@warmenhoven.org>", /**< author */ | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6179
diff
changeset
|
229 GAIM_WEBSITE, /**< homepage */ |
5255 | 230 |
231 plugin_load, /**< load */ | |
232 plugin_unload, /**< unload */ | |
233 NULL, /**< destroy */ | |
234 | |
235 NULL, /**< ui_info */ | |
236 NULL /**< extra_info */ | |
237 }; | |
238 | |
239 static void | |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
240 init_plugin(GaimPlugin *plugin) |
5255 | 241 { |
242 } | |
243 | |
6063 | 244 GAIM_INIT_PLUGIN(filectl, init_plugin, info) |