| 61 "span.value { color: #324aa4; }" \ |
61 "span.value { color: #324aa4; }" \ |
| 62 "span.xmlns { color: #2cb12f; font-weight: bold;}" \ |
62 "span.xmlns { color: #2cb12f; font-weight: bold;}" \ |
| 63 "</style></head></html>" |
63 "</style></head></html>" |
| 64 |
64 |
| 65 static char * |
65 static char * |
| 66 xmlnode_to_pretty_str(xmlnode *node, int *len) |
66 purple_xmlnode_to_pretty_str(PurpleXmlNode *node, int *len) |
| 67 { |
67 { |
| 68 GString *text = g_string_new(""); |
68 GString *text = g_string_new(""); |
| 69 xmlnode *c; |
69 PurpleXmlNode *c; |
| 70 char *node_name, *esc, *esc2; |
70 char *node_name, *esc, *esc2; |
| 71 gboolean need_end = FALSE, pretty = TRUE; |
71 gboolean need_end = FALSE, pretty = TRUE; |
| 72 |
72 |
| 73 g_return_val_if_fail(node != NULL, NULL); |
73 g_return_val_if_fail(node != NULL, NULL); |
| 74 |
74 |
| 92 g_free(xmlns); |
92 g_free(xmlns); |
| 93 } |
93 } |
| 94 } |
94 } |
| 95 for (c = node->child; c; c = c->next) |
95 for (c = node->child; c; c = c->next) |
| 96 { |
96 { |
| 97 if (c->type == XMLNODE_TYPE_ATTRIB) { |
97 if (c->type == PURPLE_XMLNODE_TYPE_ATTRIB) { |
| 98 esc = g_markup_escape_text(c->name, -1); |
98 esc = g_markup_escape_text(c->name, -1); |
| 99 esc2 = g_markup_escape_text(c->data, -1); |
99 esc2 = g_markup_escape_text(c->data, -1); |
| 100 g_string_append_printf(text, |
100 g_string_append_printf(text, |
| 101 " <span class=attr>%s</span>=" |
101 " <span class=attr>%s</span>=" |
| 102 "'<span class=value>%s</span>'", |
102 "'<span class=value>%s</span>'", |
| 103 esc, esc2); |
103 esc, esc2); |
| 104 g_free(esc); |
104 g_free(esc); |
| 105 g_free(esc2); |
105 g_free(esc2); |
| 106 } else if (c->type == XMLNODE_TYPE_TAG || c->type == XMLNODE_TYPE_DATA) { |
106 } else if (c->type == PURPLE_XMLNODE_TYPE_TAG || c->type == PURPLE_XMLNODE_TYPE_DATA) { |
| 107 if (c->type == XMLNODE_TYPE_DATA) |
107 if (c->type == PURPLE_XMLNODE_TYPE_DATA) |
| 108 pretty = FALSE; |
108 pretty = FALSE; |
| 109 need_end = TRUE; |
109 need_end = TRUE; |
| 110 } |
110 } |
| 111 } |
111 } |
| 112 |
112 |
| 116 pretty ? "<br>" : ""); |
116 pretty ? "<br>" : ""); |
| 117 |
117 |
| 118 need_end = FALSE; |
118 need_end = FALSE; |
| 119 for (c = node->child; c; c = c->next) |
119 for (c = node->child; c; c = c->next) |
| 120 { |
120 { |
| 121 if (c->type == XMLNODE_TYPE_TAG) { |
121 if (c->type == PURPLE_XMLNODE_TYPE_TAG) { |
| 122 int esc_len; |
122 int esc_len; |
| 123 esc = xmlnode_to_pretty_str(c, &esc_len); |
123 esc = purple_xmlnode_to_pretty_str(c, &esc_len); |
| 124 if (!need_end) { |
124 if (!need_end) { |
| 125 g_string_append(text, "<div class=tab>"); |
125 g_string_append(text, "<div class=tab>"); |
| 126 need_end = TRUE; |
126 need_end = TRUE; |
| 127 } |
127 } |
| 128 text = g_string_append_len(text, esc, esc_len); |
128 text = g_string_append_len(text, esc, esc_len); |
| 129 g_free(esc); |
129 g_free(esc); |
| 130 } else if (c->type == XMLNODE_TYPE_DATA && c->data_sz > 0) { |
130 } else if (c->type == PURPLE_XMLNODE_TYPE_DATA && c->data_sz > 0) { |
| 131 esc = g_markup_escape_text(c->data, c->data_sz); |
131 esc = g_markup_escape_text(c->data, c->data_sz); |
| 132 text = g_string_append(text, esc); |
132 text = g_string_append(text, esc); |
| 133 g_free(esc); |
133 g_free(esc); |
| 134 } |
134 } |
| 135 } |
135 } |
| 154 |
154 |
| 155 return g_string_free(text, FALSE); |
155 return g_string_free(text, FALSE); |
| 156 } |
156 } |
| 157 |
157 |
| 158 static void |
158 static void |
| 159 xmlnode_received_cb(PurpleConnection *gc, xmlnode **packet, gpointer null) |
159 purple_xmlnode_received_cb(PurpleConnection *gc, PurpleXmlNode **packet, gpointer null) |
| 160 { |
160 { |
| 161 char *str, *formatted; |
161 char *str, *formatted; |
| 162 |
162 |
| 163 if (!console || console->gc != gc) |
163 if (!console || console->gc != gc) |
| 164 return; |
164 return; |
| 165 str = xmlnode_to_pretty_str(*packet, NULL); |
165 str = purple_xmlnode_to_pretty_str(*packet, NULL); |
| 166 formatted = g_strdup_printf("<div class=incoming>%s</div>", str); |
166 formatted = g_strdup_printf("<div class=incoming>%s</div>", str); |
| 167 gtk_webview_append_html(GTK_WEBVIEW(console->webview), formatted); |
167 gtk_webview_append_html(GTK_WEBVIEW(console->webview), formatted); |
| 168 g_free(formatted); |
168 g_free(formatted); |
| 169 g_free(str); |
169 g_free(str); |
| 170 } |
170 } |
| 171 |
171 |
| 172 static void |
172 static void |
| 173 xmlnode_sent_cb(PurpleConnection *gc, char **packet, gpointer null) |
173 purple_xmlnode_sent_cb(PurpleConnection *gc, char **packet, gpointer null) |
| 174 { |
174 { |
| 175 char *str; |
175 char *str; |
| 176 char *formatted; |
176 char *formatted; |
| 177 xmlnode *node; |
177 PurpleXmlNode *node; |
| 178 |
178 |
| 179 if (!console || console->gc != gc) |
179 if (!console || console->gc != gc) |
| 180 return; |
180 return; |
| 181 node = xmlnode_from_str(*packet, -1); |
181 node = purple_xmlnode_from_str(*packet, -1); |
| 182 |
182 |
| 183 if (!node) |
183 if (!node) |
| 184 return; |
184 return; |
| 185 |
185 |
| 186 str = xmlnode_to_pretty_str(node, NULL); |
186 str = purple_xmlnode_to_pretty_str(node, NULL); |
| 187 formatted = g_strdup_printf("<div class=outgoing>%s</div>", str); |
187 formatted = g_strdup_printf("<div class=outgoing>%s</div>", str); |
| 188 gtk_webview_append_html(GTK_WEBVIEW(console->webview), formatted); |
188 gtk_webview_append_html(GTK_WEBVIEW(console->webview), formatted); |
| 189 g_free(formatted); |
189 g_free(formatted); |
| 190 g_free(str); |
190 g_free(str); |
| 191 xmlnode_free(node); |
191 purple_xmlnode_free(node); |
| 192 } |
192 } |
| 193 |
193 |
| 194 static gboolean |
194 static gboolean |
| 195 message_send_cb(GtkWidget *widget, GdkEventKey *event, gpointer p) |
195 message_send_cb(GtkWidget *widget, GdkEventKey *event, gpointer p) |
| 196 { |
196 { |
| 226 int lines; |
226 int lines; |
| 227 GdkRectangle oneline; |
227 GdkRectangle oneline; |
| 228 int height; |
228 int height; |
| 229 int pad_top, pad_inside, pad_bottom; |
229 int pad_top, pad_inside, pad_bottom; |
| 230 #endif |
230 #endif |
| 231 xmlnode *node; |
231 PurpleXmlNode *node; |
| 232 |
232 |
| 233 #if 0 |
233 #if 0 |
| 234 /* TODO WebKit: Do entry auto-sizing... */ |
234 /* TODO WebKit: Do entry auto-sizing... */ |
| 235 wrapped_lines = 1; |
235 wrapped_lines = 1; |
| 236 gtk_text_buffer_get_start_iter(buffer, &iter); |
236 gtk_text_buffer_get_start_iter(buffer, &iter); |
| 256 |
256 |
| 257 str = gtk_webview_get_body_text(GTK_WEBVIEW(webview)); |
257 str = gtk_webview_get_body_text(GTK_WEBVIEW(webview)); |
| 258 if (!str) |
258 if (!str) |
| 259 return; |
259 return; |
| 260 xmlstr = g_strdup_printf("<xml>%s</xml>", str); |
260 xmlstr = g_strdup_printf("<xml>%s</xml>", str); |
| 261 node = xmlnode_from_str(xmlstr, -1); |
261 node = purple_xmlnode_from_str(xmlstr, -1); |
| 262 if (node) { |
262 if (node) { |
| 263 gtk_webview_clear_formatting(GTK_WEBVIEW(console->entry)); |
263 gtk_webview_clear_formatting(GTK_WEBVIEW(console->entry)); |
| 264 } else { |
264 } else { |
| 265 gtk_webview_toggle_backcolor(GTK_WEBVIEW(console->entry), "#ffcece"); |
265 gtk_webview_toggle_backcolor(GTK_WEBVIEW(console->entry), "#ffcece"); |
| 266 } |
266 } |
| 267 g_free(str); |
267 g_free(str); |
| 268 g_free(xmlstr); |
268 g_free(xmlstr); |
| 269 if (node) |
269 if (node) |
| 270 xmlnode_free(node); |
270 purple_xmlnode_free(node); |
| 271 } |
271 } |
| 272 |
272 |
| 273 static void iq_clicked_cb(GtkWidget *w, gpointer nul) |
273 static void iq_clicked_cb(GtkWidget *w, gpointer nul) |
| 274 { |
274 { |
| 275 GtkWidget *vbox, *hbox, *to_entry, *label, *type_combo; |
275 GtkWidget *vbox, *hbox, *to_entry, *label, *type_combo; |
| 715 if (!jabber) |
715 if (!jabber) |
| 716 return FALSE; |
716 return FALSE; |
| 717 |
717 |
| 718 xmpp_console_handle = plugin; |
718 xmpp_console_handle = plugin; |
| 719 purple_signal_connect(jabber, "jabber-receiving-xmlnode", xmpp_console_handle, |
719 purple_signal_connect(jabber, "jabber-receiving-xmlnode", xmpp_console_handle, |
| 720 PURPLE_CALLBACK(xmlnode_received_cb), NULL); |
720 PURPLE_CALLBACK(purple_xmlnode_received_cb), NULL); |
| 721 purple_signal_connect(jabber, "jabber-sending-text", xmpp_console_handle, |
721 purple_signal_connect(jabber, "jabber-sending-text", xmpp_console_handle, |
| 722 PURPLE_CALLBACK(xmlnode_sent_cb), NULL); |
722 PURPLE_CALLBACK(purple_xmlnode_sent_cb), NULL); |
| 723 purple_signal_connect(purple_connections_get_handle(), "signing-on", |
723 purple_signal_connect(purple_connections_get_handle(), "signing-on", |
| 724 plugin, PURPLE_CALLBACK(signing_on_cb), NULL); |
724 plugin, PURPLE_CALLBACK(signing_on_cb), NULL); |
| 725 purple_signal_connect(purple_connections_get_handle(), "signed-off", |
725 purple_signal_connect(purple_connections_get_handle(), "signed-off", |
| 726 plugin, PURPLE_CALLBACK(signed_off_cb), NULL); |
726 plugin, PURPLE_CALLBACK(signed_off_cb), NULL); |
| 727 |
727 |