📄 lookup.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 + -