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

📄 callbacks.c

📁 飞鸽传书的linux源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
  attachment_editor =  (GtkWidget*) g_object_get_data (G_OBJECT (mainwindow),						      "attach_win");  g_assert(attachment_editor);  g_object_set_data (G_OBJECT (attachment_editor),		     "main_win",		     NULL);  g_object_set_data (G_OBJECT (mainwindow),		     "attach_win",		     NULL);  attachment_editor =  (GtkWidget*) g_object_get_data (G_OBJECT (mainwindow),						      "attach_win");  g_assert(!attachment_editor);}voidon_attachFileEditor_show               (GtkWidget       *widget,                                        gpointer         user_data){  GtkWidget *attachment_editor;  GtkWidget *add_btn;  GtkWidget *remove_btn;  GtkWidget *view;  GtkWidget *entry;  GtkTreeSelection *sel;  GtkTreeModel     *model;  GtkTreeIter  selected_row;  size_t size;  time_t mtime;  int type;  int rc;  gchar *filepath;  dbg_out("here\n");  /*   * setup button/entry   */  attachment_editor=lookup_widget(widget,"attachFileEditor");  g_assert(attachment_editor);  add_btn=lookup_widget(GTK_WIDGET(attachment_editor),"AttachFIleAddBtn");  g_assert(add_btn);  remove_btn=lookup_widget(GTK_WIDGET(attachment_editor),"AttachFileRemoveBtn");  g_assert(remove_btn);  entry=lookup_widget(GTK_WIDGET(attachment_editor),"AttachFilePathEntry");  g_assert(entry);  filepath=(char *)gtk_entry_get_text(GTK_ENTRY(entry));  rc=get_file_info(filepath,&size,&mtime,&type);  if ( (rc) || (type != IPMSG_FILE_REGULAR) )    gtk_widget_set_sensitive(add_btn,FALSE);  else    gtk_widget_set_sensitive(add_btn,TRUE);  view=lookup_widget(GTK_WIDGET(attachment_editor),"attachedFilesView");  g_assert(GTK_TREE_VIEW(view));  sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(view));  g_assert(gtk_tree_selection_get_mode(sel) == GTK_SELECTION_SINGLE);  if (gtk_tree_selection_get_selected(sel, &model, &selected_row))    gtk_widget_set_sensitive(remove_btn,TRUE);  else    gtk_widget_set_sensitive(remove_btn,FALSE);}voidon_AttachFIleAddBtn_clicked            (GtkButton       *button,                                        gpointer         user_data){  GtkWidget *parent_window;  GtkWidget *file_entry;  char *filename;  dbg_out("here\n");  parent_window=lookup_widget(GTK_WIDGET(button),"attachFileEditor");  file_entry=lookup_widget(GTK_WIDGET(button),"AttachFilePathEntry");  filename=(char *)gtk_entry_get_text(GTK_ENTRY(file_entry));   on_add_new_file(filename,parent_window,TRUE);}voidon_AttachFileRemoveBtn_clicked         (GtkButton       *button,                                        gpointer         user_data){  GtkTreeIter  selected_row;  GtkWidget    *view;  GtkTreeSelection *sel;  GtkTreeModel *model;  GtkWidget    *remove_btn;  GtkWidget    *file_entry;  dbg_out("here\n");  view=lookup_widget(GTK_WIDGET(button),"attachedFilesView");  g_assert(view);  remove_btn=lookup_widget(GTK_WIDGET(button),"AttachFileRemoveBtn");  g_assert(remove_btn);    sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(view));  g_assert(sel);    file_entry=lookup_widget(GTK_WIDGET(button),"AttachFilePathEntry");  g_assert(file_entry);  g_assert(gtk_tree_selection_get_mode(sel) == GTK_SELECTION_SINGLE);  if (gtk_tree_selection_get_selected(sel, &model, &selected_row))    {      gchar *tree_path;      gtk_tree_model_get (model, &selected_row,                           0, &tree_path,                          -1);      dbg_out("Selected: %s\n",tree_path);      gtk_entry_set_text(GTK_ENTRY(file_entry), tree_path);             g_free(tree_path);      gtk_list_store_remove(GTK_LIST_STORE(model), &selected_row);      gtk_widget_set_sensitive(remove_btn, FALSE);    }}static int on_attach_window_drag_data_received(GtkWidget *widget,GtkSelectionData *data){  GtkWidget *attachment_editor;  int rc;  if (!data)    return -EINVAL;  dbg_out("here:data %s\n",(char *)data->data);    attachment_editor=lookup_widget(widget,"attachFileEditor");  g_assert(attachment_editor);  gtk_widget_show(attachment_editor);  rc=handle_attachment_drag_data(data,attachment_editor);  if (rc<0)    err_out("Can not handle drag data %s (%d)\n",strerror(-rc),-rc);  return rc;}voidon_attachedFilesView_drag_data_received                                        (GtkWidget       *widget,                                        GdkDragContext  *drag_context,                                        gint             x,                                        gint             y,                                        GtkSelectionData *data,                                        guint            info,                                        guint            time,                                        gpointer         user_data){  int rc;  dbg_out("here\n");  if (!data)    return;  rc=on_attach_window_drag_data_received(widget,data);  if (rc<0)    err_out("Can not handle drag data %s (%d)\n",strerror(-rc),-rc);  return;}static intdownload_file_ok_operation(const char *file,const char *filepath,size_t size,const char *dir){  GtkWidget *dialog=create_DownloadConfirmDialog();  GtkWidget *file_label;  GtkWidget *size_label;  char buff[1024];  gint result;  gchar *url;  gchar *utf8_fname;  int rc=-EINVAL;  if ( (!file) || (!filepath) || (!dir) )    return -EINVAL;  dbg_out("Post down load opetation filepath:%s dir:%s\n",filepath,dir);  g_assert(dialog);  file_label=GTK_WIDGET(lookup_widget(dialog,"DownLoadCompleteFileLabel"));  size_label=GTK_WIDGET(lookup_widget(dialog,"DownLoadConfirmFileSizeLabel"));  g_assert(file_label);  g_assert(size_label);  buff[1023]='\0';  snprintf(buff,1023,"%s : %s",_("Downloaded File"),file);  gtk_label_set_text(GTK_LABEL(file_label),buff);  snprintf(buff,1023,"%s : %d (%d KB)",_("Downloaded Size"),size,(size/1024));  gtk_label_set_text(GTK_LABEL(size_label),buff);  result=gtk_dialog_run (GTK_DIALOG (dialog));  switch (result) {  case GTK_RESPONSE_OK:    dbg_out("Accept for directory\n");    url=gnome_vfs_get_uri_from_local_path(dir);    break;  case GTK_RESPONSE_ACCEPT:    dbg_out("Accept for exec\n");    url=gnome_vfs_get_uri_from_local_path(filepath);    break;  case GTK_RESPONSE_CLOSE:  default:    dbg_out("response:%d close\n",result);    gtk_widget_destroy (dialog);    rc=-ENOENT;    goto no_free_out;    break;  }  gtk_widget_destroy (dialog);  rc=gnome_vfs_url_show(url);  if ( rc != GNOME_VFS_OK)    rc=-rc;  else    rc=0; free_url:  g_free(url); no_free_out:  return rc;}static intdownload_file_failed_operation(const char *filepath,const char *basename){  GtkWidget *dialog=create_downLoadFailDialog ();  GtkWidget *flabel;  gint result;  int rc;  if (!dialog) {    err_out("Can not create dialog\n");    return -ENOMEM;  }  flabel=lookup_widget(dialog,"downLoadFailFileLabel");  g_assert(flabel);  if (basename)    gtk_label_set_text(GTK_LABEL(flabel),basename);  else    gtk_label_set_text(GTK_LABEL(flabel),_("UnKnown"));  rc=0;  result=gtk_dialog_run (GTK_DIALOG (dialog));  switch (result) {  case GTK_RESPONSE_OK:    dbg_out("response:%d ok\n",result);    rc=-EAGAIN;    break;  case GTK_RESPONSE_CANCEL:  default:    dbg_out("response:%d cancel\n",result);    if (filepath) {    dbg_out("remove:%s\n",filepath);      unlink(filepath);    }    break;  }  gtk_widget_destroy (dialog);  return rc;}static intpost_download_operation(int code,const char *filepath,size_t size,size_t all_size,const char *dir){  int rc;  char *file;    if ( (!filepath) || (!dir) )    return -EINVAL;  file=g_path_get_basename(filepath);  if (!file)    return -ENOMEM;  if ( (!code) && (size == all_size) ) {    rc=download_file_ok_operation(file,filepath,size,dir);  }  else     if (rc != -EFAULT)      rc=download_file_failed_operation(filepath,file);  g_free(file);  return rc;}static intdo_download(GtkTreeModel *model,	       GtkTreePath *path,	       GtkTreeIter *iter,	       gpointer data){  int rc;  tcp_con_t con;  int fd;  GtkWidget *window;  GtkWidget *entry;  ipmsg_recvmsg_private_t *sender_info;  ipmsg_private_data_t *priv;  long pkt_no;  int fileid;  char buff[_MSG_BUF_SIZE];  ssize_t recv_len;  ssize_t len;  ssize_t soc_remains;  ssize_t write_len;  size_t total_write;  size_t total_read;  size_t file_remains;  char filepath[PATH_MAX];  char *filename;  char *dirname;  char *req_message=NULL;  int is_retry;  int wait_max=TCP_DOWNLOAD_RETRY;  window=GTK_WIDGET(data);  if (!GTK_IS_WINDOW(window))    return -EFAULT;   entry=lookup_widget(GTK_WIDGET(window),"DownLoadDirectoryEntry");  if (!GTK_IS_ENTRY(entry))    return -EFAULT;   priv=(ipmsg_private_data_t *)lookup_widget(GTK_WIDGET(window),"senderInfo");  g_assert(priv);  sender_info=priv->data;   g_assert(sender_info->ipaddr);  pkt_no=sender_info->pktno;  gtk_tree_model_get (model, iter, 		      0, &fileid,		      1, &filename,		      3, &total_read,		      -1);  dirname=(char *)gtk_entry_get_text(GTK_ENTRY(entry));  snprintf(filepath,PATH_MAX-1,"%s/%s",dirname,filename);  filepath[PATH_MAX-1]='\0';  g_free(filename);  dbg_out("download %d th element of %ld from %s into %s\n",fileid,pkt_no,sender_info->ipaddr,filepath);  fd=open(filepath,O_RDWR|O_EXCL|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);  if (fd<0) {    if (errno == EEXIST) {      GtkWidget *dialog=create_ipmsgDownloadOverWrite ();      GtkWidget *label;      gint result;      g_assert(dialog);      label=GTK_WIDGET(lookup_widget(dialog,"overwriteFileNameLabel"));      gtk_label_set_text(GTK_LABEL(label),filepath);      result=gtk_dialog_run (GTK_DIALOG (dialog));      switch (result) {      case GTK_RESPONSE_OK:	dbg_out("Accept for overwrite\n");	fd=open(filepath,O_RDWR|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);	if (fd<0) {	  err_out("Can not open file:%s (%d)\n",strerror(errno),errno);	  gtk_widget_destroy (dialog);	  rc=-errno;	  goto no_close_out;	}	break;      default:	if (errno)	  err_out("response:%d Can not open file:%s (%d)\n",result,strerror(errno),errno);	gtk_widget_destroy (dialog);	rc=-ENOENT;	goto no_close_out;	break;      }      gtk_widget_destroy (dialog);    } else{      err_out("Can not open file:%s (%d)\n",strerror(errno),errno);      rc=-errno;      goto no_close_out;    }  }  memset(&con,0,sizeof(tcp_con_t));  rc=tcp_setup_client(hostinfo_get_ipmsg_system_addr_family(),sender_info->ipaddr,hostinfo_refer_ipmsg_port(),&con);  if (rc<0) {    rc=-errno;    goto file_close_out;  }  /* 送信側は受信側を待つ仕様なのでselectは使用不可能なので, タイムアウト付きで   *   仮読みを開始する   */  rc=sock_recv_time_out(con.soc,TCP_CLIENT_TMOUT_MS);   if (rc<0) {    rc=-errno;    goto file_close_out;  } retry_this_file:  memset(buff,0,TCP_FILE_BUFSIZ);  snprintf(buff,TCP_FILE_BUFSIZ-1,"%x:%x:0",(unsigned int)pkt_no,(unsigned int)fileid);  buff[TCP_FILE_BUFSIZ-1]='\0';  dbg_out("request:%s\n",buff);  rc=ipmsg_construct_getfile_message(buff,0,(size_t *)&len,&req_message,ipmsg_get_pkt_no());  if (rc<0) {    rc=-errno;    goto file_close_out;  }  dbg_out("request message:%s\n",req_message);  wait_max=TCP_DOWNLOAD_RETRY; wrtite_wait_start:  ipmsg_update_ui();  rc=wait_socket(con.soc,WAIT_FOR_WRITE,TCP_SELECT_SEC);  if (rc<0) {    --wait_max;    if (wait_max)      goto wrtite_wait_start;    err_out("Can not write for socket %s (%d)\n",strerror(-rc),-rc);    free(req_message);    goto err_io;  }    soc_remains=len;  while(soc_remains > 0) {    write_len=send(con.soc, req_message,len, MSG_NOSIGNAL);    if (write_len < 0) {      err_out("Can not write socket :%s (%d)\n",strerror(errno),errno);      free(req_message);      rc=-errno;      goto err_io;    }    soc_remains -= write_len;    dbg_out("Write remains:%d\n",soc_remains);  }  free(req_message);  total_write=0;  file_remains=total_read;  dbg_out("Try to read %d byte total\n", file_remains);  /*   *読み取り   */  while(file_remains>0) {    ipmsg_update_ui();    wait_max=TCP_DOWNLOAD_RETRY; /* 送信側は受信側を待つ仕様なのでselectは使用不可能 */  read_wait_start:    memset(buff, 0, sizeof(buff));    errno=0;    recv_len=recv(con.soc,buff,_MSG_BUF_SIZE,(MSG_PEEK));    if (!recv_len) {      err_out("Peeked message zero\n");      rc=-errno;      goto err_io; /* err or end */    }    if (recv_len<0) {      if (errno) {	if ( ( (errno == EAGAIN) || (errno == EINTR) ) && (wait_max) ) {	  err_out("Read time out %s(errno:%d) (remains:%d)\n",strerror(errno),errno,wait_max);	  --wait_max;	  goto read_wait_start;	}	err_out("Can not peek message %s(errno:%d)\n",strerror(errno),errno);      }      rc=-errno;      goto err_io; /* err or end */    }    dbg_out("tcp peek read:%d\n",recv_len);    if (file_remains<recv_l

⌨️ 快捷键说明

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