Sun, 27 Feb 2005 08:35:11 +0000
[gaim-migrate @ 12153]
GtkGaimStatusBox, a new status selection widget.
It currently sucks. Pretty much just the UI code with enough copy/paste
code hacked in from gtkstatusselector to minimally work.
Minimally work provided you're only using protocol which have already been
updated to handle offline/online as statuses. Which I think is limited to
AIM and Yahoo! right now. Anyway, it's cool.
| 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 | |
| 114 | 21 | char username[] = ""; |
| 22 | char password[] = ""; | |
| 23 | char mailhost[] = ""; | |
| 24 | int mailport = 110; | |
| 127 | 25 | int state = 0; |
| 114 | 26 | |
| 105 | 27 | static void *handle = NULL; |
| 124 | 28 | extern GtkWidget *buddies; |
| 114 | 29 | |
| 30 | int lastnum = 0; | |
| 31 | int orig = 0; | |
| 32 | int mytimer; | |
| 33 | ||
| 34 | void update_mail(); | |
| 127 | 35 | void check_mail(); |
| 114 | 36 | |
| 37 | int num_msgs() | |
| 38 | { | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
39 | struct in_addr *sin; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
40 | char recv[1024]; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
41 | char command[256]; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
42 | int fd; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
43 | int num = 0; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
44 | int step = 0; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
45 | int len; |
| 114 | 46 | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
47 | sin = (struct in_addr *)get_address(mailhost); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
48 | fd = connect_address(sin->s_addr, mailport); |
| 114 | 49 | while ((len = read(fd, recv, 1023))>0) { |
| 50 | recv[len] = 0; | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
51 | if (!strncmp(recv, "-ERR", strlen("-ERR"))) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
52 | step = 4; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
53 | break; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
54 | } else if (!strncmp(recv, "+OK", strlen("+OK"))) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
55 | if (step == 3) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
56 | if (sscanf(recv, "+OK %d %d\n", &num, &step) != 2) |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
57 | break; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
58 | g_snprintf(command, sizeof(command), "QUIT\n"); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
59 | write(fd, command, strlen(command)); |
| 114 | 60 | close(fd); |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
61 | return num; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
62 | } |
| 114 | 63 | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
64 | if (step == 0) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
65 | g_snprintf(command, sizeof(command), "USER %s\n", username); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
66 | write(fd, command, strlen(command)); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
67 | step = 1; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
68 | } else if (step == 1) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
69 | g_snprintf(command, sizeof(command), "PASS %s\n", password); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
70 | write(fd, command, strlen(command)); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
71 | step = 2; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
72 | } else if (step == 2) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
73 | g_snprintf(command, sizeof(command), "STAT\n"); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
74 | write(fd, command, strlen(command)); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
75 | step = 3; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
76 | } |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
77 | } |
|
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 | close(fd); |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
80 | |
| 114 | 81 | return 0; |
| 82 | } | |
| 105 | 83 | |
| 124 | 84 | void destroy_mail_list() |
| 85 | { | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
86 | GList *list; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
87 | GtkWidget *w; |
| 124 | 88 | |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
89 | list = GTK_TREE(buddies)->children; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
90 | while (list) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
91 | w = (GtkWidget *)list->data; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
92 | if (!strcmp(GTK_LABEL(GTK_BIN(w)->child)->label, _("Mail Server"))) { |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
93 | gtk_tree_remove_items(GTK_TREE(buddies), list); |
|
126
3d72ea2f8625
[gaim-migrate @ 136]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
124
diff
changeset
|
94 | list = GTK_TREE(buddies)->children; |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
95 | if (!list) |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
96 | break; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
97 | } |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
98 | list = list->next; |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
99 | } |
| 124 | 100 | } |
| 101 | ||
| 102 | void setup_mail_list() | |
| 103 | { | |
| 104 | GList *list; | |
| 105 | GtkWidget *w; | |
| 106 | GtkWidget *item; | |
| 107 | GtkWidget *tree; | |
| 108 | gchar *buf; | |
| 109 | ||
| 110 | list = GTK_TREE(buddies)->children; | |
| 111 | ||
| 112 | while (list) { | |
| 113 | w = (GtkWidget *)list->data; | |
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
114 | if (!strcmp(GTK_LABEL(GTK_BIN(w)->child)->label, _("Mail Server"))) { |
| 124 | 115 | gtk_tree_remove_items(GTK_TREE(buddies), list); |
|
126
3d72ea2f8625
[gaim-migrate @ 136]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
124
diff
changeset
|
116 | list = GTK_TREE(buddies)->children; |
| 124 | 117 | if (!list) |
| 118 | break; | |
| 119 | } | |
| 120 | list = list->next; | |
| 121 | } | |
| 122 | ||
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
123 | item = gtk_tree_item_new_with_label(_("Mail Server")); |
| 124 | 124 | tree = gtk_tree_new(); |
| 125 | gtk_widget_show(item); | |
| 126 | gtk_widget_show(tree); | |
| 127 | gtk_tree_append(GTK_TREE(buddies), item); | |
| 128 | gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), tree); | |
| 129 | gtk_tree_item_expand(GTK_TREE_ITEM(item)); | |
| 130 | ||
|
10320
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
9821
diff
changeset
|
131 | /* XXX - This needs to use ngettext() */ |
|
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
9821
diff
changeset
|
132 | buf = g_strdup_printf(_("%s (%d new/%d total)"), mailhost, lastnum - orig, lastnum); |
| 124 | 133 | item = gtk_tree_item_new_with_label(buf); |
| 134 | g_free(buf); | |
| 135 | ||
| 136 | gtk_tree_append(GTK_TREE(tree), item); | |
| 137 | gtk_widget_show(item); | |
| 138 | } | |
|
10320
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
9821
diff
changeset
|
139 | |
| 105 | 140 | void gaim_plugin_init(void *h) { |
| 141 | handle = h; | |
| 142 | ||
| 114 | 143 | orig = num_msgs(); |
| 144 | lastnum = orig; | |
| 145 | ||
| 124 | 146 | gaim_signal_connect(handle, event_blist_update, setup_mail_list, NULL); |
| 147 | setup_mail_list(); | |
|
10320
f5b0f5cf8562
[gaim-migrate @ 11527]
Mark Doliner <markdoliner@pidgin.im>
parents:
9821
diff
changeset
|
148 | |
| 4168 | 149 | mytimer = g_timeout_add(30000, check_mail, NULL); |
| 127 | 150 | } |
| 151 | ||
| 152 | void check_mail() { | |
| 153 | pthread_t mail_thread; | |
| 154 | pthread_attr_t attr; | |
| 155 | ||
| 156 | if (state == 0) { | |
| 157 | state = 1; | |
| 158 | pthread_attr_init(&attr); | |
| 159 | pthread_create(&mail_thread, &attr, (void *)&update_mail, NULL); | |
| 160 | } | |
| 105 | 161 | } |
| 162 | ||
| 114 | 163 | void update_mail () { |
| 164 | int newnum; | |
| 165 | ||
| 4168 | 166 | g_source_remove(mytimer); |
| 114 | 167 | |
| 168 | newnum = num_msgs(); | |
| 169 | ||
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
5116
diff
changeset
|
170 | if ((newnum >= lastnum) && (newnum > 0)) { |
| 127 | 171 | newnum = newnum - lastnum; |
| 114 | 172 | } else { |
| 124 | 173 | newnum = 0; |
| 114 | 174 | } |
| 175 | ||
| 176 | if (newnum < lastnum) { | |
| 127 | 177 | orig = lastnum; |
| 114 | 178 | } |
| 179 | ||
| 180 | lastnum = newnum; | |
| 4168 | 181 | mytimer = g_timeout_add(30000, check_mail, NULL); |
| 124 | 182 | setup_mail_list(); |
| 127 | 183 | state = 0; |
| 114 | 184 | } |
| 185 | ||
| 105 | 186 | void gaim_plugin_remove() { |
| 4168 | 187 | g_source_remove(mytimer); |
| 127 | 188 | while (state == 1) { } |
| 124 | 189 | destroy_mail_list(); |
| 105 | 190 | handle = NULL; |
| 191 | } | |
| 192 | ||
| 193 | char *name() { | |
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
194 | return _("Check Mail"); |
| 105 | 195 | } |
| 196 | ||
| 197 | char *description() { | |
|
5116
8e5a5161a4d9
[gaim-migrate @ 5479]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4168
diff
changeset
|
198 | return _("Check email every X seconds.\n"); |
| 105 | 199 | } |