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

📄 recvmsg.c

📁 飞鸽传书的linux源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -