📄 recvmsg.c
字号:
#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/time.h>#include <gnome.h>#include <glib.h>#include <bonobo.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "common.h"#include "interface.h"#include "callbacks.h"#include "support.h"#define GLADE_HOOKUP_OBJECT(component,widget,name) \ g_object_set_data_full (G_OBJECT (component), name, \ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)static GList *store_wins=NULL;static GList *displayed_wins=NULL;static GList *opened_wins=NULL;static guint init_win_timer_id;static GtkWidget *normal_image=NULL;static GtkWidget *reverse_image=NULL;GStaticMutex openwin_mutex = G_STATIC_MUTEX_INIT;GStaticMutex displayedwin_mutex = G_STATIC_MUTEX_INIT;GStaticMutex store_win_mutex = G_STATIC_MUTEX_INIT;int init_ipmsg_private(ipmsg_private_data_t **priv,const int type){ ipmsg_private_data_t *new_priv; int rc=0; if (!priv) return -EINVAL; rc=-ENOMEM; new_priv=malloc(sizeof(ipmsg_private_data_t)); if (!new_priv) goto err_out; rc=0; new_priv->magic=IPMSG_PRIVATE_DATA_MAGIC; new_priv->type=type; new_priv->data=NULL; *priv=new_priv; err_out: return rc;}static intinit_recvmsg_private(const char *ipaddr,int flags,int pktno, ipmsg_private_data_t **priv) { ipmsg_recvmsg_private_t *element; ipmsg_private_data_t *new_prev; int rc=0; if ( (!ipaddr) || (!priv) ) return -EINVAL; rc=-ENOMEM; element=malloc(sizeof(ipmsg_recvmsg_private_t)); if (!element) goto no_free_out; memset(element,0,sizeof(ipmsg_recvmsg_private_t)); if (init_ipmsg_private(&new_prev,IPMSG_PRIVATE_RECVMSG)<0) goto err_out; element->pktno=pktno; element->flags=flags; element->ipaddr=strdup(ipaddr); if (element->ipaddr) { new_prev->data=(void *)element; *priv=new_prev; return 0; } no_ipaddr: free(new_prev); err_out: free(element); no_free_out: return rc;}static voiddestroy_recvmsg_private(ipmsg_private_data_t *private) { ipmsg_recvmsg_private_t *priv; IPMSG_ASSERT_PRIVATE(private,IPMSG_PRIVATE_RECVMSG); priv=private->data; dbg_out("destroy private:ipaddr %s pktno:%d\n",priv->ipaddr,priv->pktno); g_assert(priv->ipaddr); free(priv->ipaddr); priv->ipaddr=NULL; if (priv->ext_part){ free(priv->ext_part); priv->ext_part=NULL; } free(priv);}voiddestroy_ipmsg_private(gpointer data) { ipmsg_private_data_t *private; g_assert(data); dbg_out("Called destroy private::%x\n",(unsigned int)data); private=(ipmsg_private_data_t *)data; dbg_out("Called destroy private magic::%x\n",private->magic); if (private->magic != IPMSG_PRIVATE_DATA_MAGIC) goto err_out; switch(private->type) { case IPMSG_PRIVATE_RECVMSG: destroy_recvmsg_private(private); break; default: g_assert_not_reached(); break; } err_out: dbg_out("Free private ::%x\n",(unsigned int)private); free(private); dbg_out("Complete free private ::%x\n",(unsigned int)private); return;}static voidprogress_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data){ GtkTreeView *view; GtkEntry *entry; GtkWidget *window; int fd; gint sent; gint size; gint persent; gchar size_string[32]; gchar path_string[PATH_MAX]; gchar *filename; gboolean is_exist=FALSE; g_assert(user_data); view=(GtkTreeView *)user_data; window=lookup_widget(GTK_WIDGET(view),"downloadWindow"); g_assert(window); entry=GTK_ENTRY(lookup_widget(GTK_WIDGET(view),"DownLoadDirectoryEntry")); g_assert(entry); gtk_tree_model_get(model, iter, 1, &filename, 2, &sent, 3, &size, -1); snprintf(path_string,PATH_MAX-1,"%s/%s",gtk_entry_get_text(GTK_ENTRY(entry)),filename); path_string[PATH_MAX-1]='\0'; dbg_out("Check path:%s\n",path_string); if (size>0) persent=(gint)((sent/(double)size)*100); else { /* 0バイトファイル対策 */ persent=0; fd=open(path_string,O_RDONLY); if (fd>0) { is_exist=TRUE; close(fd); persent=100; } } // dbg_out("transfer: %d/%d(%3d)\n",sent,size,persent); g_free(filename); if (persent<0) persent=0; if (persent>100) persent=100; snprintf(size_string,31,"%d %%",persent); size_string[31]='\0'; g_object_set(renderer, "value", persent, NULL); g_object_set(renderer, "text", size_string, NULL);}static intsetup_download_view(GtkTreeView *view,GList *dlist) { GList *node; GtkTreeModel *model; GtkListStore *liststore; GtkTreeViewColumn *col; GtkCellRenderer *renderer; if ( (!view) || (!dlist) ) return -EINVAL; liststore = gtk_list_store_new(5, G_TYPE_INT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INT); g_assert(liststore); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(liststore)); g_object_unref(liststore); /* bind to view */ /* * タイトル設定 */ /* --- Column #1 --- */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("FileID")); /* pack tree view column into tree view */ gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); renderer = gtk_cell_renderer_text_new(); /* pack cell renderer into tree view column */ gtk_tree_view_column_pack_start(col, renderer, TRUE); /* connect 'text' property of the cell renderer to * model column that contains the first name */ gtk_tree_view_column_add_attribute(col, renderer, "text", 0); gtk_tree_view_column_set_resizable (col,TRUE); /* --- Column #2 --- */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("FileName")); /* pack tree view column into tree view */ gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); renderer = gtk_cell_renderer_text_new(); /* pack cell renderer into tree view column */ gtk_tree_view_column_pack_start(col, renderer, TRUE); /* connect 'text' property of the cell renderer to * model column that contains the first name */ gtk_tree_view_column_add_attribute(col, renderer, "text", 1); gtk_tree_view_column_set_resizable (col,TRUE); /* --- Column #3 --- */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("Recv Size")); /* pack tree view column into tree view */ gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); renderer = gtk_cell_renderer_text_new(); /* pack cell renderer into tree view column */ gtk_tree_view_column_pack_start(col, renderer, TRUE); /* connect 'text' property of the cell renderer to * model column that contains the first name */ gtk_tree_view_column_add_attribute(col, renderer, "text", 2); gtk_tree_view_column_set_resizable (col,TRUE); /* --- Column #4 --- */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("FileSize")); /* pack tree view column into tree view */ gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); renderer = gtk_cell_renderer_text_new(); /* pack cell renderer into tree view column */ gtk_tree_view_column_pack_start(col, renderer, TRUE); /* connect 'text' property of the cell renderer to * model column that contains the first name */ gtk_tree_view_column_add_attribute(col, renderer, "text", 3); gtk_tree_view_column_set_resizable (col,TRUE); /* --- Column #5 --- */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("Progress")); /* pack tree view column into tree view */ gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); renderer = gtk_cell_renderer_progress_new (); /* pack cell renderer into tree view column */ gtk_tree_view_column_pack_start(col, renderer, TRUE); /* connect 'text' property of the cell renderer to * model column that contains the first name */ gtk_tree_view_column_add_attribute(col, renderer, "text", 4); gtk_tree_view_column_set_cell_data_func(col, renderer, progress_cell_data_func, GTK_TREE_VIEW(view), NULL); gtk_tree_view_column_set_resizable (col,TRUE); for(node=g_list_first (dlist);node;node=g_list_next(node)) { GtkTreeIter newrow; download_file_block_t *element = node->data; gchar *filename=NULL; dbg_out("add view:%d,%s,%d\n",element->fileid,element->filename,element->size); model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); gtk_list_store_append(GTK_LIST_STORE(model), &newrow); if (!convert_string_internal(element->filename,(const gchar **)&filename)) { gtk_list_store_set(GTK_LIST_STORE(model), &newrow, 0, element->fileid, 1, filename, 2, 0, 3, element->size, 4, 0, -1); g_free(filename); } } gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE ); return 0;}static int internal_create_download_window(GtkWidget *recvWin,GtkWidget **window){ GtkWidget *new_window; GtkWidget *view; ipmsg_recvmsg_private_t *new_sender; ipmsg_recvmsg_private_t *sender_info; ipmsg_private_data_t *recv_priv; ipmsg_private_data_t *new_priv; GtkWidget *entry; char cwd[PATH_MAX]; GList *downloads=NULL; if ( (!recvWin) && (!window) ) return -EINVAL; dbg_out("here\n"); if (getcwd(cwd,PATH_MAX)<0) cwd[0]='\0'; else cwd[PATH_MAX-1]='\0'; recv_priv=(ipmsg_private_data_t *)lookup_widget(GTK_WIDGET(recvWin),"senderInfo"); g_assert(recv_priv); sender_info=recv_priv->data; g_assert( (sender_info->ipaddr) && (sender_info->ext_part) ); g_assert(!init_recvmsg_private(sender_info->ipaddr,sender_info->flags,sender_info->pktno,&new_priv)); g_assert((new_priv) && (new_priv->data)); new_sender=(ipmsg_recvmsg_private_t *)new_priv->data; dbg_out("new_priv:%x new_priv->ext_part:%x\n", (unsigned int)new_priv, (unsigned int)new_sender->ext_part); g_assert((new_sender) && (!(new_sender->ext_part))); new_sender->ext_part=strdup(sender_info->ext_part); if (!(new_sender->ext_part)) { destroy_ipmsg_private(new_priv); return -ENOMEM; } g_assert(!parse_download_string(sender_info->ext_part, &downloads)); if (!downloads) return -ENOENT; new_window=GTK_WIDGET(create_downloadWindow ()); g_assert(new_window); dbg_out("Hook private:%x\n",(unsigned int)&new_priv); IPMSG_HOOKUP_DATA(new_window,new_priv,"senderInfo"); /* pktid用 */ view=lookup_widget(GTK_WIDGET(new_window),"DownLoadFileTree"); g_assert(view); setup_download_view(GTK_TREE_VIEW(view),downloads); entry=lookup_widget(new_window,"DownLoadDirectoryEntry"); gtk_entry_set_text(GTK_ENTRY(entry),cwd); *window=new_window; return 0;}voidon_sealBtn_clicked (GtkButton *button, gpointer user_data){ int rc; GtkTextView *text_view; GtkWidget *scrolledwindow; GtkWidget *top; GtkWidget *container; GtkWidget *cite_toggle; GtkWidget *download_window; ipmsg_private_data_t *private; ipmsg_recvmsg_private_t *sender_info; private=(ipmsg_private_data_t *)lookup_widget(GTK_WIDGET(button),"senderInfo" ); IPMSG_ASSERT_PRIVATE(private,IPMSG_PRIVATE_RECVMSG); sender_info=private->data; top=lookup_widget(GTK_WIDGET(button),"viewWindow"); g_assert(top); cite_toggle=lookup_widget(GTK_WIDGET(button),"viewwindowCitationCheck"); g_assert(cite_toggle); if ( (sender_info->ipaddr) && (!(sender_info->flags & IPMSG_NO_REPLY_OPTS)) ) { dbg_out("recv notify:%s(%d)\n",sender_info->ipaddr,sender_info->pktno); ipmsg_send_read_msg(udp_con,sender_info->ipaddr,sender_info->pktno); } sender_info->flags &= ~IPMSG_SECRETOPT; dbg_out("new flags %x\n",sender_info->flags); text_view=GTK_TEXT_VIEW(lookup_widget(GTK_WIDGET(button),"viewwindowTextView")); container=gtk_widget_get_parent(GTK_WIDGET(button)); g_assert(container); dbg_out("Seal Btn Container Name:%s(0x%x)\n",gtk_widget_get_name(container),(unsigned int)container); scrolledwindow=lookup_widget(GTK_WIDGET(button),"scrolledwindow6"); /* * View Portを取り除くと自動的にviewport(とその上のボタン)が破棄される. */ gtk_container_remove(GTK_CONTAINER (scrolledwindow),GTK_WIDGET (container)); gtk_container_add (GTK_CONTAINER (scrolledwindow), GTK_WIDGET(text_view)); gtk_widget_set_sensitive(cite_toggle, TRUE); if (hostinfo_refer_ipmsg_default_citation()) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cite_toggle),TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cite_toggle),FALSE); if ((sender_info->flags & IPMSG_FILEATTACHOPT) && (sender_info->ext_part) ){ /* ダウンロードウィンドウ生成 */ dbg_out("This message has attachment\n"); rc=internal_create_download_window(top,&download_window); if (!rc) { g_assert (download_window); append_displayed_window(download_window); gtk_widget_show (download_window); }else{ err_out("Can not create download window %s (%d)\n",strerror(-rc),rc); } } append_opened_window(top); if (sender_info->ext_part) { free(sender_info->ext_part); sender_info->ext_part=NULL; }}voidon_sealBtn_destroy (GtkObject *object, gpointer user_data){ dbg_out("here\n");}static GtkWidget *internal_create_recv_message_window(const msg_data_t *msg,const char *from){ char *message; int pktno; int flags; gchar *internal_message=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -