Wed, 01 Dec 2004 05:41:12 +0000
[gaim-migrate @ 11460]
i committed this to oldstatus earlier. i really do need to fix the cause at some point (someone trying to register an invalid jabberid)
| 114 | 1 | /* This is some funky code. It is still being developed by Rob Flynn - rob@linuxpimps.com |
| 2 | * I recommend not using this code right now. :) | |
| 3 | */ | |
| 4 | ||
| 105 | 5 | #define GAIM_PLUGINS |
| 6 | ||
| 7 | #include <stdio.h> | |
| 114 | 8 | #include <stdlib.h> |
| 9 | #include <unistd.h> | |
| 10 | #include <string.h> | |
| 11 | #include <netinet/in.h> | |
| 12 | #include <arpa/inet.h> | |
| 13 | #include <sys/socket.h> | |
| 14 | #include <netdb.h> | |
| 15 | #include <netinet/in.h> | |
| 127 | 16 | #include <pthread.h> |
|
9821
d02520c59822
[gaim-migrate @ 10692]
Mark Doliner <markdoliner@pidgin.im>
parents:
6308
diff
changeset
|
17 | |
|
d02520c59822
[gaim-migrate @ 10692]
Mark Doliner <markdoliner@pidgin.im>
parents:
6308
diff
changeset
|
18 | #include "internal.h" |
|
d02520c59822
[gaim-migrate @ 10692]
Mark Doliner <markdoliner@pidgin.im>
parents:
6308
diff
changeset
|
19 | #include "gtkgaim.h" |
|
d02520c59822
[gaim-migrate @ 10692]
Mark Doliner <markdoliner@pidgin.im>
parents:
6308
diff
changeset
|
20 | |
| 105 | 21 | #include "gaim.h" |
| 22 | ||
| 114 | 23 | char username[] = ""; |
| 24 | char password[] = ""; | |
| 25 | char mailhost[] = ""; | |
| 26 | int mailport = 110; | |
| 127 | 27 | int state = 0; |
| 114 | 28 | |
| 105 | 29 | static void *handle = NULL; |
| 124 | 30 | extern GtkWidget *buddies; |
| 114 | 31 | |
| 32 | int lastnum = 0; | |
| 33 | int orig = 0; | |
| 34 | int mytimer; | |
| 35 | ||
| 36 | void update_mail(); | |
| 127 | 37 | void check_mail(); |
| 114 | 38 | |
| 39 | int num_msgs() | |
| 40 | { | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
41 | struct in_addr *sin; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
42 | char recv[1024]; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
43 | char command[256]; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
44 | int fd; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
45 | int num = 0; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
46 | int step = 0; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
47 | int len; |
| 114 | 48 | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
49 | sin = (struct in_addr *)get_address(mailhost); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
50 | fd = connect_address(sin->s_addr, mailport); |
| 114 | 51 | while ((len = read(fd, recv, 1023))>0) { |
| 52 | recv[len] = 0; | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
53 | if (!strncmp(recv, "-ERR", strlen("-ERR"))) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
54 | step = 4; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
55 | break; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
56 | } else if (!strncmp(recv, "+OK", strlen("+OK"))) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
57 | if (step == 3) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
58 | if (sscanf(recv, "+OK %d %d\n", &num, &step) != 2) |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
59 | break; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
60 | g_snprintf(command, sizeof(command), "QUIT\n"); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
61 | write(fd, command, strlen(command)); |
| 114 | 62 | close(fd); |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
63 | return num; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
64 | } |
| 114 | 65 | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
66 | if (step == 0) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
67 | g_snprintf(command, sizeof(command), "USER %s\n", username); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
68 | write(fd, command, strlen(command)); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
69 | step = 1; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
70 | } else if (step == 1) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
71 | g_snprintf(command, sizeof(command), "PASS %s\n", password); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
72 | write(fd, command, strlen(command)); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
73 | step = 2; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
74 | } else if (step == 2) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
75 | g_snprintf(command, sizeof(command), "STAT\n"); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
76 | write(fd, command, strlen(command)); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
77 | step = 3; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
78 | } |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
79 | } |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
80 | } |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
81 | close(fd); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
82 | |
| 114 | 83 | return 0; |
| 84 | } | |
| 105 | 85 | |
| 124 | 86 | void destroy_mail_list() |
| 87 | { | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
88 | GList *list; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
89 | GtkWidget *w; |
| 124 | 90 | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
91 | list = GTK_TREE(buddies)->children; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
92 | while (list) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
93 | w = (GtkWidget *)list->data; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
94 | if (!strcmp(GTK_LABEL(GTK_BIN(w)->child)->label, _("Mail Server"))) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
95 | gtk_tree_remove_items(GTK_TREE(buddies), list); |
|
126
3d72ea2f8625
[gaim-migrate @ 136]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
124
diff
changeset
|
96 | list = GTK_TREE(buddies)->children; |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
97 | if (!list) |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
98 | break; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
99 | } |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
100 | list = list->next; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
101 | } |
| 124 | 102 | } |
| 103 | ||
| 104 | ||
| 105 | void setup_mail_list() | |
| 106 | { | |
| 107 | GList *list; | |
| 108 | GtkWidget *w; | |
| 109 | GtkWidget *item; | |
| 110 | GtkWidget *tree; | |
| 111 | gchar *buf; | |
| 112 | ||
| 113 | list = GTK_TREE(buddies)->children; | |
| 114 | ||
| 115 | while (list) { | |
| 116 | w = (GtkWidget *)list->data; | |
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
117 | if (!strcmp(GTK_LABEL(GTK_BIN(w)->child)->label, _("Mail Server"))) { |
| 124 | 118 | gtk_tree_remove_items(GTK_TREE(buddies), list); |
|
126
3d72ea2f8625
[gaim-migrate @ 136]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
124
diff
changeset
|
119 | list = GTK_TREE(buddies)->children; |
| 124 | 120 | if (!list) |
| 121 | break; | |
| 122 | } | |
| 123 | list = list->next; | |
| 124 | } | |
| 125 | ||
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
126 | item = gtk_tree_item_new_with_label(_("Mail Server")); |
| 124 | 127 | tree = gtk_tree_new(); |
| 128 | gtk_widget_show(item); | |
| 129 | gtk_widget_show(tree); | |
| 130 | gtk_tree_append(GTK_TREE(buddies), item); | |
| 131 | gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), tree); | |
| 132 | gtk_tree_item_expand(GTK_TREE_ITEM(item)); | |
| 133 | ||
| 134 | buf = g_malloc(BUF_LONG); | |
| 135 | ||
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
136 | g_snprintf(buf, BUF_LONG, _("%s (%d new/%d total)"), mailhost, lastnum - orig, lastnum); |
| 124 | 137 | item = gtk_tree_item_new_with_label(buf); |
| 138 | g_free(buf); | |
| 139 | ||
| 140 | gtk_tree_append(GTK_TREE(tree), item); | |
| 141 | gtk_widget_show(item); | |
| 142 | } | |
| 143 | ||
| 105 | 144 | void gaim_plugin_init(void *h) { |
| 145 | handle = h; | |
| 146 | ||
| 114 | 147 | orig = num_msgs(); |
| 148 | lastnum = orig; | |
| 149 | ||
| 124 | 150 | gaim_signal_connect(handle, event_blist_update, setup_mail_list, NULL); |
| 151 | setup_mail_list(); | |
| 152 | ||
| 4168 | 153 | mytimer = g_timeout_add(30000, check_mail, NULL); |
| 127 | 154 | } |
| 155 | ||
| 156 | void check_mail() { | |
| 157 | pthread_t mail_thread; | |
| 158 | pthread_attr_t attr; | |
| 159 | ||
| 160 | if (state == 0) { | |
| 161 | state = 1; | |
| 162 | pthread_attr_init(&attr); | |
| 163 | pthread_create(&mail_thread, &attr, (void *)&update_mail, NULL); | |
| 164 | } | |
| 105 | 165 | } |
| 166 | ||
| 114 | 167 | void update_mail () { |
| 168 | int newnum; | |
| 169 | ||
| 4168 | 170 | g_source_remove(mytimer); |
| 114 | 171 | |
| 172 | newnum = num_msgs(); | |
| 173 | ||
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
174 | if ((newnum >= lastnum) && (newnum > 0)) { |
| 127 | 175 | newnum = newnum - lastnum; |
| 114 | 176 | } else { |
| 124 | 177 | newnum = 0; |
| 114 | 178 | } |
| 179 | ||
| 180 | if (newnum < lastnum) { | |
| 127 | 181 | orig = lastnum; |
| 114 | 182 | } |
| 183 | ||
| 184 | lastnum = newnum; | |
| 4168 | 185 | mytimer = g_timeout_add(30000, check_mail, NULL); |
| 124 | 186 | setup_mail_list(); |
| 127 | 187 | state = 0; |
| 114 | 188 | } |
| 189 | ||
| 190 | ||
| 105 | 191 | void gaim_plugin_remove() { |
| 4168 | 192 | g_source_remove(mytimer); |
| 127 | 193 | while (state == 1) { } |
| 124 | 194 | destroy_mail_list(); |
| 105 | 195 | handle = NULL; |
| 196 | } | |
| 197 | ||
| 198 | char *name() { | |
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
199 | return _("Check Mail"); |
| 105 | 200 | } |
| 201 | ||
| 202 | char *description() { | |
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
203 | return _("Check email every X seconds.\n"); |
| 105 | 204 | } |