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

📄 lookup.c

📁 LINUX下的DICT.CN的客户端,C语言实现.
💻 C
字号:
/* lookup.c * Vincent.Silent * vincent.silent@gmail.com * 2008-04 */#include "lookup.h"gint look_up_init(Lookup * lookup, GtkWidget * textview, GtkWidget * entry, GtkWidget * dict){	if(!lookup)	  goto error;	lookup->m_TextView = textview;	lookup->m_Entry = entry;	lookup->m_Dict = dict;	if(!textview || !entry || !dict)	  goto error;	if((lookup->m_Socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)	  goto error;	lookup->m_Addr.sin_family = AF_INET;	lookup->m_Addr.sin_port = htons(80);	lookup->m_Addr.sin_addr.s_addr = inet_addr(get_ip(HOST_ADDR));	return 0;error:	return -1;}void look_up_play(GtkButton * button, gpointer data){	gchar cmd[128];	strcpy(cmd, "gst-launch-0.10 playbin uri=");	strcat(cmd, audio_url);	system(cmd);}void look_up_show(Lookup * lookup){	xmlChar * audio = NULL;	xmlChar * pron = NULL;	xmlChar * def = NULL;	xmlChar * info = NULL;	xmlChar * rel[64];	xmlChar * sent[2][64];	GtkTextIter iter;	GtkTextBuffer * buffer = NULL;	gint n = 0;	gint rel_n = 0;	gint sent_n = 0;	gchar buf[1024];	for(n=0; n<64; n++)	{		rel[n] = NULL;		sent[0][n] = NULL;		sent[1][n] = NULL;	}	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(lookup->m_TextView));	gtk_text_buffer_set_text(buffer, "", -1);	gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);	xmlNodePtr cur_node = xmlDocGetRootElement(lookup->m_xmlDoc);	for(cur_node=cur_node->children; cur_node; cur_node=cur_node->next)	{		if(cur_node->type == XML_ELEMENT_NODE)		{			if(strcmp(cur_node->name, "audio") == 0)			  audio = xmlNodeGetContent(cur_node);			else if(strcmp(cur_node->name, "pron") == 0)			  pron = xmlNodeGetContent(cur_node);			else if(strcmp(cur_node->name, "def") == 0)			  def = xmlNodeGetContent(cur_node);			else if(strcmp(cur_node->name, "info") == 0)			  info = xmlNodeGetContent(cur_node);			else if(strcmp(cur_node->name, "rel") == 0)			{				rel[rel_n] = xmlNodeGetContent(cur_node);				rel_n ++;			}			else if(strcmp(cur_node->name, "sent") == 0)			{				xmlNodePtr node = cur_node->children;				for(; node; node=node->next)				{					if(node->type == XML_ELEMENT_NODE)					{						if(strcmp(node->name, "orig") == 0)						  sent[0][sent_n] = xmlNodeGetContent(node);						else						  sent[1][sent_n] = xmlNodeGetContent(node);					}				}				sent_n ++;			}		}	}	/* insert word */	gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, gtk_entry_get_text(GTK_ENTRY(lookup->m_Entry)), -1,									"bold", NULL);	/* set word & pron */	if(pron)	{		bzero(buf, 1024);		g_sprintf(buf, PRON_STR, pron);		gtk_text_buffer_insert(buffer, &iter, buf, -1);	}	/* set audio */	if(audio)	{		extern gchar app_path[256];		gchar path[256];		strcpy(path, app_path);		strcat(path, PLAY_ICON_PATH);		GtkWidget * image = gtk_image_new_from_file(path);		GtkWidget * button = gtk_button_new();		gtk_container_add(GTK_CONTAINER(button), image);		/* connect signal */		g_signal_connect(button, "clicked", G_CALLBACK(look_up_play), NULL);		gtk_text_buffer_insert(buffer, &iter, "  ", -1);		GtkTextChildAnchor * anchor = gtk_text_buffer_create_child_anchor(buffer, &iter);		gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(lookup->m_TextView), button, anchor);		gtk_text_buffer_insert(buffer, &iter, "\n\n", -1);		gtk_widget_show_all(button);		bzero(audio_url, 128);		strcpy(audio_url, audio);	}	else	  gtk_text_buffer_insert(buffer, &iter, "\n\n", -1);	/* set info */	if(info)	{		bzero(buf, 1024);		gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, INFO_STR, -1, "bold", NULL);		g_sprintf(buf, "%s\n\n", info);		gtk_text_buffer_insert(buffer, &iter, buf, -1);	}	/* set def */	if(def && (strcmp(def, NOT_FOUND) != 0))	{		bzero(buf, 1024);		gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, DEF_STR, -1, "bold", NULL);		g_sprintf(buf, "%s\n\n", def);		gtk_text_buffer_insert(buffer, &iter, buf, -1);	}	else	{		gtk_text_buffer_set_text(buffer, "", -1);		GtkWidget * msg_dialog = gtk_message_dialog_new(GTK_WINDOW(lookup->m_Dict),									GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,									NOT_FOUND_STR);		gtk_dialog_run(GTK_DIALOG(msg_dialog));		gtk_widget_destroy(msg_dialog);	}	/* set rels */	if(rel[0])	{		bzero(buf, 1024);		gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, REL_STR, -1, "bold", NULL);		for(n=0; n<rel_n; n++)		{			strcat(buf, rel[n]);			strcat(buf, "\n");		}		strcat(buf, "\n");		gtk_text_buffer_insert(buffer, &iter, buf, -1);	}	/* set sents */	if(sent[0][0])	{		bzero(buf, 1024);		gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, SENT_STR, -1, "bold", NULL);		for(n=0; n<sent_n; n++)		{			gchar str[1024];			g_sprintf(str, "%d.\t%s\n\t%s\n", n+1, sent[0][n], sent[1][n]);			strcat(buf, str);		}		gtk_text_buffer_insert(buffer, &iter, buf, -1);	}	xmlFree(audio);	xmlFree(pron);	xmlFree(def);	xmlFree(info);	for(n=0; n<rel_n; n++)		xmlFree(rel[n]);	for(n=0; n<sent_n; n++)	{		xmlFree(sent[0][n]);		xmlFree(sent[1][n]);	}}gint look_up(Lookup * lookup){	if(!lookup)	  return -1;	if(strlen(gtk_entry_get_text(GTK_ENTRY(lookup->m_Entry))) <= 0)	{		GtkWidget * msg_dialog = gtk_message_dialog_new(GTK_WINDOW(lookup->m_Dict),										GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,										NOT_INPUT_WARNING);		gtk_dialog_run(GTK_DIALOG(msg_dialog));		gtk_widget_destroy(msg_dialog);		goto error;	}	gchar get_str[256];	gchar str[128];	bzero(str, 128);	strcpy(str, gtk_entry_get_text(GTK_ENTRY(lookup->m_Entry)));	gint l = strlen(str);	gint i = 0;	for(; i<l; i++)	{		if(str[i] == ' ')		{			memmove(str+i+3, str+i+1, l-i-1);			str[i] = '%';			str[i+1] = '2';			str[i+2] = '0';			l = l + 3;		}	}	g_sprintf(get_str, GET_STR, str,  HOST_ADDR);	if(connect(lookup->m_Socket, (struct sockaddr*)(&lookup->m_Addr), sizeof(lookup->m_Addr)) == -1)	  goto error;	if(send(lookup->m_Socket, get_str, strlen(get_str), 0) == -1)	  goto error;	if(recv(lookup->m_Socket, lookup->m_Buf, 4096, 0) == -1)	  goto error;		gchar * buf = strstr(lookup->m_Buf, "<?xml ");	gchar * t = strstr(lookup->m_Buf, "</dict>");	t[strlen("</dict>")] = '\0';	if(buf && t)	{		lookup->m_xmlDoc = xmlParseDoc(buf);		if(lookup->m_xmlDoc)		{			look_up_show(lookup);			xmlFreeDoc(lookup->m_xmlDoc);		}	}	else	{		GtkWidget * msg_dialog = gtk_message_dialog_new(GTK_WINDOW(lookup->m_Dict),										GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,										LOOK_UP_FAILED);		gtk_dialog_run(GTK_DIALOG(msg_dialog));		gtk_widget_destroy(msg_dialog);	}	gtk_entry_select_region(GTK_ENTRY(lookup->m_Entry), 0, -1);error:	close(lookup->m_Socket);	bzero(lookup, sizeof(Lookup));	return -1;}gchar * get_ip(gchar * dn){	struct sockaddr_in addr;	struct hostent * host;	struct ifreq req;	int sock;	if(dn == NULL) return NULL;	if(strcmp(dn, "localhost") == 0)	{		sock = socket(AF_INET, SOCK_DGRAM, 0);		strncpy(req.ifr_name, "lo", IFNAMSIZ);		if(ioctl(sock, SIOCGIFADDR, &req) < 0)			return NULL;		dn = (char*)(inet_ntoa(*(struct in_addr *) &((struct sockaddr_in *) &req.ifr_addr)->sin_addr));		shutdown(sock, 2);		close(sock);	}	else	{		host = gethostbyname(dn);		if(host == NULL) return NULL;		dn = (char*)(inet_ntoa(*(struct in_addr*)(host->h_addr)));	}		return dn;}

⌨️ 快捷键说明

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