|
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>
|
|
105
|
16 #include "gaim.h"
|
|
|
17
|
|
114
|
18 char username[] = "";
|
|
|
19 char password[] = "";
|
|
|
20 char mailhost[] = "";
|
|
|
21 int mailport = 110;
|
|
|
22
|
|
105
|
23 static void *handle = NULL;
|
|
|
24 extern GtkWidget *blist;
|
|
124
|
25 extern GtkWidget *buddies;
|
|
114
|
26
|
|
105
|
27 GList *tmp;
|
|
114
|
28 int lastnum = 0;
|
|
|
29 int orig = 0;
|
|
|
30 int mytimer;
|
|
|
31
|
|
|
32 void update_mail();
|
|
|
33
|
|
|
34 int num_msgs()
|
|
|
35 {
|
|
|
36 struct in_addr *sin;
|
|
|
37 char recv[1024];
|
|
|
38 char command[256];
|
|
|
39 int fd;
|
|
|
40 int num = 0;
|
|
|
41 int step = 0;
|
|
|
42 int len;
|
|
|
43
|
|
|
44 sin = (struct in_addr *)get_address(mailhost);
|
|
|
45 fd = connect_address(sin->s_addr, mailport);
|
|
|
46 while ((len = read(fd, recv, 1023))>0) {
|
|
|
47 recv[len] = 0;
|
|
|
48 if (!strncmp(recv, "-ERR", strlen("-ERR"))) { step = 4; break;
|
|
|
49 } else if (!strncmp(recv, "+OK", strlen("+OK"))) {
|
|
|
50 if (step == 3) {
|
|
|
51 if (sscanf(recv, "+OK %d %d\n", &num, &step) != 2)
|
|
|
52 break;
|
|
|
53 g_snprintf(command, sizeof(command), "QUIT\n");
|
|
|
54 write(fd, command, strlen(command));
|
|
|
55 close(fd);
|
|
|
56 return num;
|
|
|
57 }
|
|
|
58
|
|
|
59 if (step == 0) {
|
|
|
60 g_snprintf(command, sizeof(command), "USER %s\n", username);
|
|
|
61 write(fd, command, strlen(command));
|
|
|
62 step = 1;
|
|
|
63 } else if (step == 1) {
|
|
|
64 g_snprintf(command, sizeof(command), "PASS %s\n", password);
|
|
|
65 write(fd, command, strlen(command));
|
|
|
66 step = 2;
|
|
|
67 } else if (step == 2) {
|
|
|
68 g_snprintf(command, sizeof(command), "STAT\n");
|
|
|
69 write(fd, command, strlen(command));
|
|
|
70 step = 3;
|
|
|
71 }
|
|
|
72 }
|
|
|
73 }
|
|
|
74 close(fd);
|
|
|
75 return 0;
|
|
|
76 }
|
|
105
|
77
|
|
124
|
78 void destroy_mail_list()
|
|
|
79 {
|
|
|
80 GList *list;
|
|
|
81 GtkWidget *w;
|
|
|
82
|
|
|
83 list = GTK_TREE(buddies)->children;
|
|
|
84
|
|
|
85 while (list) {
|
|
|
86 w = (GtkWidget *)list->data;
|
|
|
87 if (!strcmp(GTK_LABEL(GTK_BIN(w)->child)->label, "Mail Server")) {
|
|
|
88 gtk_tree_remove_items(GTK_TREE(buddies), list);
|
|
|
89 if (!list)
|
|
|
90 break;
|
|
|
91 }
|
|
|
92 list = list->next;
|
|
|
93 }
|
|
|
94 }
|
|
|
95
|
|
|
96
|
|
|
97 void setup_mail_list()
|
|
|
98 {
|
|
|
99 GList *list;
|
|
|
100 GtkWidget *w;
|
|
|
101 GtkWidget *item;
|
|
|
102 GtkWidget *tree;
|
|
|
103 gchar *buf;
|
|
|
104
|
|
|
105 list = GTK_TREE(buddies)->children;
|
|
|
106
|
|
|
107 while (list) {
|
|
|
108 w = (GtkWidget *)list->data;
|
|
|
109 if (!strcmp(GTK_LABEL(GTK_BIN(w)->child)->label, "Mail Server")) {
|
|
|
110 gtk_tree_remove_items(GTK_TREE(buddies), list);
|
|
|
111 if (!list)
|
|
|
112 break;
|
|
|
113 }
|
|
|
114 list = list->next;
|
|
|
115 }
|
|
|
116
|
|
|
117 item = gtk_tree_item_new_with_label("Mail Server");
|
|
|
118 tree = gtk_tree_new();
|
|
|
119 gtk_widget_show(item);
|
|
|
120 gtk_widget_show(tree);
|
|
|
121 gtk_tree_append(GTK_TREE(buddies), item);
|
|
|
122 gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), tree);
|
|
|
123 gtk_tree_item_expand(GTK_TREE_ITEM(item));
|
|
|
124
|
|
|
125 buf = g_malloc(BUF_LONG);
|
|
|
126
|
|
|
127 g_snprintf(buf, BUF_LONG, "%s (%d/%d)", mailhost, lastnum - orig, orig);
|
|
|
128 item = gtk_tree_item_new_with_label(buf);
|
|
|
129 g_free(buf);
|
|
|
130
|
|
|
131 gtk_tree_append(GTK_TREE(tree), item);
|
|
|
132 gtk_widget_show(item);
|
|
|
133 }
|
|
|
134
|
|
105
|
135 void gaim_plugin_init(void *h) {
|
|
|
136 handle = h;
|
|
|
137 tmp = gtk_container_children(GTK_CONTAINER(blist));
|
|
|
138
|
|
114
|
139 orig = num_msgs();
|
|
|
140 lastnum = orig;
|
|
|
141
|
|
124
|
142 gaim_signal_connect(handle, event_blist_update, setup_mail_list, NULL);
|
|
|
143 setup_mail_list();
|
|
|
144
|
|
114
|
145 mytimer = gtk_timeout_add(30000, (GtkFunction)update_mail, NULL);
|
|
105
|
146 }
|
|
|
147
|
|
114
|
148 void update_mail () {
|
|
|
149 int newnum;
|
|
|
150
|
|
|
151 gtk_timeout_remove(mytimer);
|
|
|
152
|
|
|
153 newnum = num_msgs();
|
|
|
154
|
|
|
155 if ( (newnum >= lastnum) && (newnum > 0)) {
|
|
124
|
156 newnum = newnum - orig;
|
|
114
|
157 } else {
|
|
124
|
158 newnum = 0;
|
|
114
|
159 }
|
|
|
160
|
|
|
161 if (newnum < lastnum) {
|
|
|
162 orig = 0;
|
|
|
163 }
|
|
|
164
|
|
|
165 lastnum = newnum;
|
|
|
166 mytimer = gtk_timeout_add(30000, (GtkFunction)update_mail, NULL);
|
|
124
|
167 setup_mail_list();
|
|
114
|
168 }
|
|
|
169
|
|
|
170
|
|
105
|
171 void gaim_plugin_remove() {
|
|
124
|
172 gtk_timeout_remove(mytimer);
|
|
|
173 destroy_mail_list();
|
|
105
|
174 handle = NULL;
|
|
|
175 }
|
|
|
176
|
|
|
177 char *name() {
|
|
|
178 return "Check Mail";
|
|
|
179 }
|
|
|
180
|
|
|
181 char *description() {
|
|
|
182 return "Check email every X seconds.\n";
|
|
|
183 }
|