| 53 ret[size] = 0; |
55 ret[size] = 0; |
| 54 g_rand_free(rand); |
56 g_rand_free(rand); |
| 55 return ret; |
57 return ret; |
| 56 } |
58 } |
| 57 |
59 |
| |
60 static void |
| |
61 fb_util_request_buddy_ok(gpointer *mata, PurpleRequestFields *fields) |
| |
62 { |
| |
63 FbUtilRequestBuddyFunc func = mata[0]; |
| |
64 GList *l; |
| |
65 GList *select; |
| |
66 gpointer data = mata[2]; |
| |
67 GSList *ret = NULL; |
| |
68 PurpleBuddy *bdy; |
| |
69 PurpleRequestField *field; |
| |
70 |
| |
71 if (func == NULL) { |
| |
72 g_free(mata); |
| |
73 return; |
| |
74 } |
| |
75 |
| |
76 field = purple_request_fields_get_field(fields, "buddy"); |
| |
77 select = purple_request_field_list_get_selected(field); |
| |
78 |
| |
79 for (l = select; l != NULL; l = l->next) { |
| |
80 bdy = purple_request_field_list_get_data(field, l->data); |
| |
81 ret = g_slist_prepend(ret, bdy); |
| |
82 } |
| |
83 |
| |
84 ret = g_slist_reverse(ret); |
| |
85 func(ret, data); |
| |
86 |
| |
87 g_slist_free(ret); |
| |
88 g_free(mata); |
| |
89 } |
| |
90 |
| |
91 static void |
| |
92 fb_util_request_buddy_cancel(gpointer *mata, PurpleRequestFields *fields) |
| |
93 { |
| |
94 FbUtilRequestBuddyFunc func = mata[1]; |
| |
95 gpointer data = mata[2]; |
| |
96 |
| |
97 if (func != NULL) { |
| |
98 func(NULL, data); |
| |
99 } |
| |
100 |
| |
101 g_free(mata); |
| |
102 } |
| |
103 |
| |
104 gpointer |
| |
105 fb_util_request_buddy(PurpleConnection *gc, const gchar *title, |
| |
106 const gchar *primary, const gchar *secondary, |
| |
107 GSList *select, gboolean multi, GCallback ok_cb, |
| |
108 GCallback cancel_cb, gpointer data) |
| |
109 { |
| |
110 const gchar *alias; |
| |
111 const gchar *name; |
| |
112 gchar *str; |
| |
113 GList *items = NULL; |
| |
114 gpointer *mata; |
| |
115 GSList *buddies; |
| |
116 GSList *l; |
| |
117 PurpleAccount *acct; |
| |
118 PurpleRequestCommonParameters *cpar; |
| |
119 PurpleRequestField *field; |
| |
120 PurpleRequestFieldGroup *group; |
| |
121 PurpleRequestFields *fields; |
| |
122 |
| |
123 mata = g_new0(gpointer, 3); |
| |
124 mata[0] = ok_cb; |
| |
125 mata[1] = cancel_cb; |
| |
126 mata[2] = data; |
| |
127 |
| |
128 acct = purple_connection_get_account(gc); |
| |
129 buddies = purple_blist_find_buddies(acct, NULL); |
| |
130 buddies = g_slist_sort(buddies, (GCompareFunc) g_ascii_strcasecmp); |
| |
131 |
| |
132 fields = purple_request_fields_new(); |
| |
133 group = purple_request_field_group_new(NULL); |
| |
134 purple_request_fields_add_group(fields, group); |
| |
135 |
| |
136 field = purple_request_field_list_new("buddy", NULL); |
| |
137 purple_request_field_list_set_multi_select(field, multi); |
| |
138 purple_request_field_set_required(field, TRUE); |
| |
139 purple_request_field_group_add_field(group, field); |
| |
140 |
| |
141 for (l = buddies; l != NULL; l = l->next) { |
| |
142 name = purple_buddy_get_name(l->data); |
| |
143 alias = purple_buddy_get_alias(l->data); |
| |
144 str = g_strdup_printf("%s (%s)", alias, name); |
| |
145 purple_request_field_list_add_icon(field, str, NULL, l->data); |
| |
146 g_free(str); |
| |
147 } |
| |
148 |
| |
149 for (l = select; l != NULL; l = l->next) { |
| |
150 name = purple_buddy_get_name(l->data); |
| |
151 alias = purple_buddy_get_alias(l->data); |
| |
152 str = g_strdup_printf("%s (%s)", alias, name); |
| |
153 items = g_list_append(items, str); |
| |
154 } |
| |
155 |
| |
156 purple_request_field_list_set_selected(field, items); |
| |
157 g_slist_free(buddies); |
| |
158 g_list_free_full(items, g_free); |
| |
159 |
| |
160 cpar = purple_request_cpar_from_connection(gc); |
| |
161 return purple_request_fields(gc, title, primary, secondary, fields, |
| |
162 _("Ok"), |
| |
163 G_CALLBACK(fb_util_request_buddy_ok), |
| |
164 _("Cancel"), |
| |
165 G_CALLBACK(fb_util_request_buddy_cancel), |
| |
166 cpar, mata); |
| |
167 } |
| |
168 |
| |
169 gboolean |
| |
170 fb_util_str_is(const gchar *str, GAsciiType type) |
| |
171 { |
| |
172 gsize i; |
| |
173 gsize size; |
| |
174 guchar c; |
| |
175 |
| |
176 g_return_val_if_fail(str != NULL, FALSE); |
| |
177 size = strlen(str); |
| |
178 |
| |
179 for (i = 0; i < size; i++) { |
| |
180 c = (guchar) str[i]; |
| |
181 |
| |
182 if ((g_ascii_table[c] & type) == 0) { |
| |
183 return FALSE; |
| |
184 } |
| |
185 } |
| |
186 |
| |
187 return TRUE; |
| |
188 } |
| |
189 |
| 58 static voidpf |
190 static voidpf |
| 59 fb_util_zalloc(voidpf opaque, uInt items, uInt size) |
191 fb_util_zalloc(voidpf opaque, uInt items, uInt size) |
| 60 { |
192 { |
| 61 return g_malloc(size * items); |
193 return g_malloc(size * items); |
| 62 } |
194 } |