⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmppconsole.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	status = gtk_entry_get_text(GTK_ENTRY(status_entry));	priority = gtk_entry_get_text(GTK_ENTRY(priority_entry));	if (!strcmp(priority, "0"))		priority = "";	stanza = g_strdup_printf("<presence %s%s%s id='console%x' %s%s%s>"				 "%s%s%s%s%s%s%s%s%s"				 "</presence>", 				 *to ? "to='" : "",				 *to ? to : "",				 *to ? "'" : "",				 g_random_int(),				 				 *type ? "type='" : "",				 *type ? type : "",				 *type ? "'" : "",				 				 *show ? "<show>" : "",				 *show ? show : "",				 *show ? "</show>" : "",				 *status ? "<status>" : "",				 *status ? status : "",				 *status ? "</status>" : "",				       				 *priority ? "<priority>" : "",				 *priority ? priority : "",				 *priority ? "</priority>" : "");		buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(console->entry));	gtk_text_buffer_set_text(buffer, stanza, -1);	gtk_text_buffer_get_iter_at_offset(buffer, &iter, strstr(stanza, "</presence>") - stanza);	gtk_text_buffer_place_cursor(buffer, &iter);	g_free(stanza);	gtk_widget_destroy(dialog);}static void message_clicked_cb(GtkWidget *w, gpointer nul){	GtkWidget *hbox, 		  *to_entry, 		  *body_entry,    		  *thread_entry,		  *subject_entry,		  *label, 		  *type_combo;	GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);	GtkTextIter iter;	GtkTextBuffer *buffer;	const char *to, *body, *thread, *subject;	char *stanza;	int result;	GtkWidget *dialog = gtk_dialog_new_with_buttons("<message/>",							GTK_WINDOW(console->window),							GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,							GTK_STOCK_CANCEL,							GTK_RESPONSE_REJECT,							GTK_STOCK_OK,							GTK_RESPONSE_ACCEPT,							NULL);	gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);	gtk_dialog_set_default_response (GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);	gtk_container_set_border_width(GTK_CONTAINER(dialog), 12);	hbox = gtk_hbox_new(FALSE, 3);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);	label = gtk_label_new("To:");	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);	gtk_size_group_add_widget(sg, label);	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);	to_entry = gtk_entry_new();	gtk_entry_set_activates_default (GTK_ENTRY (to_entry), TRUE);	gtk_box_pack_start(GTK_BOX(hbox), to_entry, FALSE, FALSE, 0);	hbox = gtk_hbox_new(FALSE, 3);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);	label = gtk_label_new("Type:");	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);	gtk_size_group_add_widget(sg, label);	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);	type_combo = gtk_combo_box_new_text();	gtk_combo_box_append_text(GTK_COMBO_BOX(type_combo), "chat");	gtk_combo_box_append_text(GTK_COMBO_BOX(type_combo), "headline");	gtk_combo_box_append_text(GTK_COMBO_BOX(type_combo), "groupchat");	gtk_combo_box_append_text(GTK_COMBO_BOX(type_combo), "normal");	gtk_combo_box_append_text(GTK_COMBO_BOX(type_combo), "error");	gtk_combo_box_set_active(GTK_COMBO_BOX(type_combo), 0);	gtk_box_pack_start(GTK_BOX(hbox), type_combo, FALSE, FALSE, 0);	hbox = gtk_hbox_new(FALSE, 3);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);	label = gtk_label_new("Body:");	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);	gtk_size_group_add_widget(sg, label);	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);	body_entry = gtk_entry_new();	gtk_entry_set_activates_default (GTK_ENTRY (body_entry), TRUE);	gtk_box_pack_start(GTK_BOX(hbox), body_entry, FALSE, FALSE, 0);	hbox = gtk_hbox_new(FALSE, 3);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);	label = gtk_label_new("Subject:");	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);	gtk_size_group_add_widget(sg, label);	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);	subject_entry = gtk_entry_new();	gtk_entry_set_activates_default (GTK_ENTRY (subject_entry), TRUE);	gtk_box_pack_start(GTK_BOX(hbox), subject_entry, FALSE, FALSE, 0);	hbox = gtk_hbox_new(FALSE, 3);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);	label = gtk_label_new("Thread:");	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);	gtk_size_group_add_widget(sg, label);	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);	thread_entry = gtk_entry_new();	gtk_entry_set_activates_default (GTK_ENTRY (thread_entry), TRUE);	gtk_box_pack_start(GTK_BOX(hbox), thread_entry, FALSE, FALSE, 0);		gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);	result = gtk_dialog_run(GTK_DIALOG(dialog));	if (result != GTK_RESPONSE_ACCEPT) {		gtk_widget_destroy(dialog);		return;	}		to = gtk_entry_get_text(GTK_ENTRY(to_entry));	body = gtk_entry_get_text(GTK_ENTRY(body_entry));	thread = gtk_entry_get_text(GTK_ENTRY(thread_entry));	subject = gtk_entry_get_text(GTK_ENTRY(subject_entry));	stanza = g_strdup_printf("<message %s%s%s id='console%x' type='%s'>"				 "%s%s%s%s%s%s%s%s%s"				 "</message>",				 				 *to ? "to='" : "",				 *to ? to : "",				 *to ? "'" : "",				 g_random_int(),				 gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_combo)),				 				 *body ? "<body>" : "",				 *body ? body : "",				 *body ? "</body>" : "",				 				 *subject ? "<subject>" : "",				 *subject ? subject : "",				 *subject ? "</subject>" : "",				 				 *thread ? "<thread>" : "",				 *thread ? thread : "",				 *thread ? "</thread>" : "");		buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(console->entry));	gtk_text_buffer_set_text(buffer, stanza, -1);	gtk_text_buffer_get_iter_at_offset(buffer, &iter, strstr(stanza, "</message>") - stanza);	gtk_text_buffer_place_cursor(buffer, &iter);	g_free(stanza);	gtk_widget_destroy(dialog);}static voidsigned_on_cb(PurpleConnection *gc){	if (!console)		return;		gtk_combo_box_append_text(GTK_COMBO_BOX(console->dropdown), purple_account_get_username(gc->account));	console->accounts = g_list_append(console->accounts, gc);	console->count++;		if (console->count > 1)		gtk_widget_show_all(console->hbox);}static voidsigned_off_cb(PurpleConnection *gc){	int i = 0;	GList *l;	if (!console)		return;	l = console->accounts;	while (l) {		PurpleConnection *g = l->data;		if (gc == g)			break;		i++;		l = l->next;	}	if (l == NULL)		return;	gtk_combo_box_remove_text(GTK_COMBO_BOX(console->dropdown), i);	console->accounts = g_list_remove(console->accounts, gc);	printf("%s\n", purple_account_get_username(gc->account));	console->count--;	if (gc == console->gc) {		console->gc = NULL;		gtk_imhtml_append_text(GTK_IMHTML(console->imhtml), 				       _("<font color='#777777'>Logged out.</font>"), 0);	}}static gbooleanplugin_load(PurplePlugin *plugin){	PurplePlugin *jabber;	jabber = purple_find_prpl("prpl-jabber");	if (!jabber)		return FALSE;	xmpp_console_handle = plugin;	purple_signal_connect(jabber, "jabber-receiving-xmlnode", xmpp_console_handle,			    PURPLE_CALLBACK(xmlnode_received_cb), NULL);	purple_signal_connect(jabber, "jabber-sending-text", xmpp_console_handle,			    PURPLE_CALLBACK(xmlnode_sent_cb), NULL);	purple_signal_connect(purple_connections_get_handle(), "signed-on",			    plugin, PURPLE_CALLBACK(signed_on_cb), NULL);	purple_signal_connect(purple_connections_get_handle(), "signed-off",			    plugin, PURPLE_CALLBACK(signed_off_cb), NULL);		return TRUE;}static gbooleanplugin_unload(PurplePlugin *plugin){	if (console)		gtk_widget_destroy(console->window);	return TRUE;}static voidconsole_destroy(GtkObject *window, gpointer nul){	g_list_free(console->accounts);	g_free(console);	console = NULL;}static voiddropdown_changed_cb(GtkComboBox *widget, gpointer nul){	PurpleAccount *account;	if (!console)		return;		account = purple_accounts_find(gtk_combo_box_get_active_text(GTK_COMBO_BOX(console->dropdown)), 				    "prpl-jabber");	if (!account || !account->gc)		return;		console->gc = account->gc;	gtk_imhtml_clear(GTK_IMHTML(console->imhtml));}static void create_console() {	GtkWidget *vbox = gtk_vbox_new(FALSE, 6);	GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);	GtkWidget *label;	GtkTextBuffer *buffer;	GtkWidget *toolbar;	GList *connections;#if GTK_CHECK_VERSION(2,4,0)	GtkToolItem *button;#endif	if (console) {		gtk_window_present(GTK_WINDOW(console->window));		return;	}		console = g_new0(XmppConsole, 1);	console->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	gtk_window_set_title(GTK_WINDOW(console->window), _("XMPP Console"));	g_signal_connect(G_OBJECT(console->window), "destroy", G_CALLBACK(console_destroy), NULL);	gtk_container_set_border_width(GTK_CONTAINER(console->window), 12);	gtk_window_set_default_size(GTK_WINDOW(console->window), 580, 400);	gtk_container_add(GTK_CONTAINER(console->window), vbox);	console->hbox = gtk_hbox_new(FALSE, 3);	gtk_box_pack_start(GTK_BOX(vbox), console->hbox, FALSE, FALSE, 0);	label = gtk_label_new(_("Account: "));	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);	gtk_box_pack_start(GTK_BOX(console->hbox), label, FALSE, FALSE, 0);	console->dropdown = gtk_combo_box_new_text();	for (connections = purple_connections_get_all(); connections; connections = connections->next) {		PurpleConnection *gc = connections->data;		if (!strcmp(purple_account_get_protocol_id(purple_connection_get_account(gc)), "prpl-jabber")) {			console->count++;			console->accounts = g_list_append(console->accounts, gc);			gtk_combo_box_append_text(GTK_COMBO_BOX(console->dropdown),						  purple_account_get_username(purple_connection_get_account(gc)));			if (!console->gc)				console->gc = gc;		}	}	gtk_combo_box_set_active(GTK_COMBO_BOX(console->dropdown),0);	gtk_box_pack_start(GTK_BOX(console->hbox), console->dropdown, TRUE, TRUE, 0);	g_signal_connect(G_OBJECT(console->dropdown), "changed", G_CALLBACK(dropdown_changed_cb), NULL);	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), 				       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);	console->imhtml = gtk_imhtml_new(NULL, NULL);	gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);	if (console->count == 0)		gtk_imhtml_append_text(GTK_IMHTML(console->imhtml), 				       _("<font color='#777777'>Not connected to XMPP</font>"), 0);	gtk_container_add(GTK_CONTAINER(sw), console->imhtml);		toolbar = gtk_toolbar_new();#if GTK_CHECK_VERSION(2,4,0)		button = gtk_tool_button_new(NULL, "<iq/>");	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(iq_clicked_cb), NULL);	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));#else	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<iq/>", 			           _("Insert an <iq/> stanza."), "foo", NULL, GTK_SIGNAL_FUNC(iq_clicked_cb), NULL);#endif#if GTK_CHECK_VERSION(2,4,0)		button = gtk_tool_button_new(NULL, "<presence/>");	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(presence_clicked_cb), NULL);	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));#else	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<presence/>", 			           _("Insert a <presence/> stanza."), NULL, gtk_label_new(NULL), GTK_SIGNAL_FUNC(presence_clicked_cb), NULL);#endif#if GTK_CHECK_VERSION(2,4,0)	button = gtk_tool_button_new(NULL, "<message/>");	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(message_clicked_cb), NULL);	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));#else	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<message/>", 			           _("Insert a <message/> stanza."), "foo", gtk_label_new(NULL), GTK_SIGNAL_FUNC(message_clicked_cb), NULL);#endif		gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);		sw = gtk_scrolled_window_new(NULL, NULL);	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), 				       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);		console->entry = gtk_imhtml_new(NULL, NULL);	gtk_imhtml_set_whole_buffer_formatting_only(GTK_IMHTML(console->entry), TRUE);	g_signal_connect(G_OBJECT(console->entry),"message_send", G_CALLBACK(message_send_cb), console);	gtk_box_pack_start(GTK_BOX(vbox), sw, FALSE, FALSE, 0);	gtk_container_add(GTK_CONTAINER(sw), console->entry);	gtk_imhtml_set_editable(GTK_IMHTML(console->entry), TRUE);	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(console->entry));	g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(entry_changed_cb), NULL);	console->sw = sw;	entry_changed_cb(buffer, NULL);	gtk_widget_show_all(console->window);	if (console->count < 2)		gtk_widget_hide(console->hbox);}static GList *actions(PurplePlugin *plugin, gpointer context){	GList *l = NULL;	PurplePluginAction *act = NULL;	act = purple_plugin_action_new(_("XMPP Console"), create_console);	l = g_list_append(l, act);		return l;}static PurplePluginInfo info ={	PURPLE_PLUGIN_MAGIC,	PURPLE_MAJOR_VERSION,	PURPLE_MINOR_VERSION,	PURPLE_PLUGIN_STANDARD,                             /**< type           */	PIDGIN_PLUGIN_TYPE,                             /**< ui_requirement */	0,                                                /**< flags          */	NULL,                                             /**< dependencies   */	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */	"gtk-xmpp",                                       /**< id             */	N_("XMPP Console"),                                  /**< name           */	VERSION,                                          /**< version        */	                                                  /**  summary        */	N_("Send and receive raw XMPP stanzas."),	                                                  /**  description    */	N_("This plugin is useful for debbuging XMPP servers or clients."),	"Sean Egan <seanegan@gmail.com>",                 /**< author         */	PURPLE_WEBSITE,                                     /**< homepage       */	plugin_load,                                      /**< load           */	plugin_unload,                                    /**< unload         */	NULL,                                             /**< destroy        */	NULL,                                         /**< ui_info        */	NULL,                                             /**< extra_info     */	NULL,	actions,	/* padding */	NULL,	NULL,	NULL,	NULL};static voidinit_plugin(PurplePlugin *plugin){}PURPLE_INIT_PLUGIN(interval, init_plugin, info)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -