view_dialog.c
上传用户:tjfeida
上传日期:2013-03-10
资源大小:1917k
文件大小:13k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. /*****************************************************************************/
  2. /*  view_dialog.c - view dialog box and ftp routines                         */
  3. /*  Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org>                  */
  4. /*                                                                           */
  5. /*  This program is free software; you can redistribute it and/or modify     */
  6. /*  it under the terms of the GNU General Public License as published by     */
  7. /*  the Free Software Foundation; either version 2 of the License, or        */
  8. /*  (at your option) any later version.                                      */
  9. /*                                                                           */
  10. /*  This program is distributed in the hope that it will be useful,          */
  11. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of           */
  12. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            */
  13. /*  GNU General Public License for more details.                             */
  14. /*                                                                           */
  15. /*  You should have received a copy of the GNU General Public License        */
  16. /*  along with this program; if not, write to the Free Software              */
  17. /*  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA      */
  18. /*****************************************************************************/
  19. #include "gftp-gtk.h"
  20. static const char cvsid[] = "$Id: view_dialog.c,v 1.8 2002/11/21 00:33:51 masneyb Exp $";
  21. static gftp_file * curfle;
  22. void
  23. view_dialog (gpointer data)
  24. {
  25.   GList * templist, * filelist, * newfile;
  26.   gftp_window_data * fromwdata, * towdata;
  27.   gftp_file * new_fle;
  28.   int num;
  29.   fromwdata = data;
  30.   towdata = fromwdata == &window1 ? &window2 : &window1;
  31.   if (!check_status (_("View"), fromwdata, 0, 1, 1, 1))
  32.     return;
  33.   templist = GTK_CLIST (fromwdata->listbox)->selection;
  34.   num = 0;
  35.   filelist = fromwdata->files;
  36.   templist = get_next_selection (templist, &filelist, &num);
  37.   curfle = filelist->data;
  38.   if (curfle->isdir)
  39.     {
  40.       ftp_log (gftp_logging_misc, NULL,
  41.        _("View: %s is a directory. Cannot view it.n"), curfle->file);
  42.       return;
  43.     }
  44.   if (strcmp (GFTP_GET_PROTOCOL_NAME (fromwdata->request), "Local") == 0)
  45.     view_file (curfle->file, 0, 1, 0, 1, 1, NULL, fromwdata);
  46.   else
  47.     {
  48.       new_fle = copy_fdata (curfle);
  49.       if (new_fle->destfile)
  50.         g_free (new_fle->destfile);
  51.       new_fle->destfile = g_strconcat (g_get_tmp_dir (), "/gftp-view.XXXXXX", NULL);
  52.       if ((new_fle->fd = mkstemp (new_fle->destfile)) < 0)
  53.         {
  54.           ftp_log (gftp_logging_misc, NULL, 
  55.                    _("Error: Cannot open %s for writing: %sn"),  
  56.                    new_fle->destfile, g_strerror (errno));
  57.           free_fdata (new_fle);
  58.           return;
  59.         }
  60.       fchmod (new_fle->fd, S_IRUSR | S_IWUSR);
  61.       new_fle->is_fd = 1;
  62.       new_fle->done_view = 1;
  63.       new_fle->done_rm = 1;
  64.       newfile = g_list_append (NULL, new_fle); 
  65.       add_file_transfer (fromwdata->request, towdata->request,
  66.                          fromwdata, towdata, newfile, 1);
  67.     }
  68. }
  69. void
  70. edit_dialog (gpointer data)
  71. {
  72.   gftp_window_data * fromwdata, * towdata;
  73.   GList * templist, * filelist, * newfile;
  74.   gftp_file * new_fle;
  75.   int num;
  76.   fromwdata = data;
  77.   towdata = fromwdata == &window1 ? &window2 : &window1;
  78.   if (!check_status (_("Edit"), fromwdata, 0, 1, 1, 1))
  79.     return;
  80.   if (*edit_program == '')
  81.     {
  82.       ftp_log (gftp_logging_misc, NULL,
  83.        _("Edit: You must specify an editor in the options dialogn"));
  84.       return;
  85.     }
  86.   templist = GTK_CLIST (fromwdata->listbox)->selection;
  87.   num = 0;
  88.   filelist = fromwdata->files;
  89.   templist = get_next_selection (templist, &filelist, &num);
  90.   curfle = filelist->data;
  91.   if (curfle->isdir)
  92.     {
  93.       ftp_log (gftp_logging_misc, NULL,
  94.        _("Edit: %s is a directory. Cannot edit it.n"), curfle->file);
  95.       return;
  96.     }
  97.   if (strcmp (GFTP_GET_PROTOCOL_NAME (fromwdata->request), "Local") == 0)
  98.     view_file (curfle->file, 0, 0, 0, 1, 1, NULL, fromwdata);
  99.   else
  100.     {
  101.       new_fle = copy_fdata (curfle);
  102.       if (new_fle->destfile)
  103.         g_free (new_fle->destfile);
  104.       new_fle->destfile = g_strconcat (g_get_tmp_dir (), "/gftp-view.XXXXXX",
  105.                                        NULL);
  106.       if ((new_fle->fd = mkstemp (new_fle->destfile)) < 0)
  107.         {
  108.           ftp_log (gftp_logging_misc, NULL, 
  109.                    _("Error: Cannot open %s for writing: %sn"),
  110.                    new_fle->destfile, g_strerror (errno));
  111.           free_fdata (new_fle);
  112.           return;
  113.         }
  114.       fchmod (new_fle->fd, S_IRUSR | S_IWUSR);
  115.       new_fle->is_fd = 1;
  116.       new_fle->done_edit = 1;
  117.       newfile = g_list_append (NULL, new_fle); 
  118.       add_file_transfer (fromwdata->request, towdata->request,
  119.                          fromwdata, towdata, newfile, 1);
  120.     }
  121. }
  122. static gftp_viewedit_data *
  123. fork_process (char *proc, char *filename, int fd, char *remote_filename, 
  124.               int viewedit, int del_file, int dontupload, 
  125.               gftp_window_data * wdata)
  126. {
  127.   gftp_viewedit_data * newproc;
  128.   char *pos, *endpos, **argv;
  129.   pid_t ret;
  130.   int n;
  131.   argv = NULL;
  132.   n = 0;
  133.   pos = proc;
  134.   while ((endpos = strchr (pos, ' ')) != NULL)
  135.     {
  136.       *endpos = '';
  137.       n++;
  138.       argv = g_realloc (argv, n * sizeof (char *));
  139.       argv[n - 1] = g_malloc (strlen (pos) + 1);
  140.       strcpy (argv[n - 1], pos);
  141.       *endpos = ' ';
  142.       pos = endpos + 1;
  143.     }
  144.   argv = g_realloc (argv, (n + 3) * sizeof (char *));
  145.   argv[n] = g_malloc (strlen (pos) + 1);
  146.   strcpy (argv[n], pos);
  147.   argv[n + 1] = g_malloc (strlen (filename) + 1);
  148.   strcpy (argv[n + 1], filename);
  149.   argv[n + 2] = NULL;
  150.   newproc = NULL;
  151.   switch ((ret = fork ()))
  152.     {
  153.     case 0:
  154.       close (fd);
  155.       execvp (argv[0], argv);
  156.       _exit (1);
  157.     case -1:
  158.       for (n = 0; argv[n] != NULL; n++)
  159. g_free (argv[n]);
  160.       ftp_log (gftp_logging_error, NULL,
  161.               _("View: Cannot fork another process: %sn"), g_strerror (errno));
  162.       break;
  163.     default:
  164.       ftp_log (gftp_logging_misc, NULL, _("Running program: %s %sn"), proc,
  165.        filename);
  166.       newproc = g_malloc0 (sizeof (*newproc));
  167.       newproc->pid = ret;
  168.       newproc->argv = argv;
  169.       if (wdata == &window2)
  170.         {
  171.           newproc->fromwdata = &window2;
  172.           newproc->towdata = &window1;
  173.         }
  174.       else
  175.         {
  176.           newproc->fromwdata = &window1;
  177.           newproc->towdata = &window2;
  178.         }
  179.       newproc->filename = g_malloc (strlen (filename) + 1);
  180.       strcpy (newproc->filename, filename);
  181.       if (remote_filename != NULL)
  182. {
  183.   newproc->remote_filename = g_malloc (strlen (remote_filename) + 1);
  184.   strcpy (newproc->remote_filename, remote_filename);
  185. }
  186.       newproc->view = viewedit;
  187.       newproc->rm = del_file;
  188.       newproc->dontupload = dontupload;
  189.       viewedit_processes = g_list_append (viewedit_processes, newproc);
  190.     }
  191.   return (newproc);
  192. }
  193. void
  194. view_file (char *filename, int fd, int viewedit, int del_file, int start_pos,
  195.    int dontupload, char *remote_filename, gftp_window_data * wdata)
  196. {
  197.   GtkWidget * dialog, * view, * table, * tempwid;
  198.   gftp_file_extensions * tempext;
  199.   gftp_viewedit_data * newproc;
  200.   GtkAdjustment * vadj;
  201.   int stlen, doclose;
  202.   GList * templist;
  203.   char buf[8192];
  204.   ssize_t n;
  205. #if GTK_MAJOR_VERSION > 1
  206.   GtkTextBuffer * textbuf;
  207.   GtkTextIter iter;
  208.   guint len;
  209. #endif
  210.   doclose = 1;
  211.   stlen = strlen (filename);
  212.   for (templist = registered_exts; templist != NULL; templist = templist->next)
  213.     {
  214.       tempext = templist->data;
  215.       if (stlen >= tempext->stlen &&
  216.           strcmp (&filename[stlen - tempext->stlen], tempext->ext) == 0)
  217.         {
  218.           if (*tempext->view_program == '')
  219.             break;
  220.           ftp_log (gftp_logging_misc, NULL, _("Opening %s with %sn"),
  221.                    filename, tempext->view_program);
  222.           fork_process (tempext->view_program, filename, fd, remote_filename,
  223.                         viewedit, del_file, dontupload, wdata);
  224.           return;
  225.         }
  226.     }
  227.   if (viewedit && *view_program != '')
  228.     {
  229.       /* Open the file with the default file viewer */
  230.       fork_process (view_program, filename, fd, remote_filename, viewedit,
  231.                     del_file, dontupload, wdata);
  232.       return;
  233.     }
  234.   else if (!viewedit)
  235.     {
  236.       /* Open the file with the default file editor */
  237.       newproc = fork_process (edit_program, filename, fd, remote_filename, 
  238.                               viewedit, del_file, dontupload, wdata);
  239.       stat (filename, &newproc->st);
  240.       return;
  241.     }
  242.   ftp_log (gftp_logging_misc, NULL, _("Viewing file %sn"), filename);
  243.   if (fd == 0)
  244.     {
  245.       if ((fd = open (filename, O_RDONLY)) < 0)
  246.         {
  247.           ftp_log (gftp_logging_misc, NULL, 
  248.                    _("View: Cannot open file %s: %sn"), filename, 
  249.                    g_strerror (errno));
  250.           return;
  251.         }
  252.       doclose = 1;
  253.     }
  254.   else
  255.     {
  256.       lseek (fd, 0, SEEK_SET);
  257.       doclose = 0;
  258.     }
  259.   if (del_file)
  260.     {
  261.       if (unlink (filename) == 0)
  262.         ftp_log (gftp_logging_misc, NULL, _("Successfully removed %sn"), 
  263.                  filename);
  264.       else
  265.         ftp_log (gftp_logging_error, NULL,
  266.                  _("Error: Could not remove file %s: %sn"), filename, 
  267.                  g_strerror (errno));
  268.     }
  269. #if GTK_MAJOR_VERSION == 1
  270.   dialog = gtk_dialog_new ();
  271.   gtk_window_set_title (GTK_WINDOW (dialog), filename);
  272.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area),
  273.                               5);
  274.   gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
  275. #else
  276.   dialog = gtk_dialog_new_with_buttons (filename, NULL, 0,
  277.                                         GTK_STOCK_CLOSE,
  278.                                         GTK_RESPONSE_CLOSE,
  279.                                         NULL);
  280. #endif
  281.   gtk_window_set_wmclass (GTK_WINDOW(dialog), "fileview", "gFTP");
  282.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5);
  283.   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5);
  284.   gtk_widget_realize (dialog);
  285.   if (gftp_icon != NULL)
  286.     {
  287.       gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap,
  288.                            gftp_icon->bitmap);
  289.       gdk_window_set_icon_name (dialog->window, _("gFTP Icon"));
  290.     }
  291.   table = gtk_table_new (1, 2, FALSE);
  292.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table, TRUE, TRUE, 0);
  293. #if GTK_MAJOR_VERSION == 1
  294.   view = gtk_text_new (NULL, NULL);
  295.   gtk_text_set_editable (GTK_TEXT (view), FALSE);
  296.   gtk_text_set_word_wrap (GTK_TEXT (view), TRUE);
  297.   gtk_table_attach (GTK_TABLE (table), view, 0, 1, 0, 1,
  298.     GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
  299.     0, 0);
  300.   gtk_widget_show (view);
  301.   tempwid = gtk_vscrollbar_new (GTK_TEXT (view)->vadj);
  302.   gtk_table_attach (GTK_TABLE (table), tempwid, 1, 2, 0, 1,
  303.     GTK_FILL, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0);
  304.   gtk_widget_show (tempwid);
  305.   vadj = GTK_TEXT (view)->vadj;
  306. #else
  307.   view = gtk_text_view_new ();
  308.   gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
  309.   gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
  310.   gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
  311.   tempwid = gtk_scrolled_window_new (NULL, NULL);
  312.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (tempwid),
  313.                                  GTK_POLICY_AUTOMATIC,
  314.                                  GTK_POLICY_AUTOMATIC);
  315.   gtk_container_add (GTK_CONTAINER (tempwid), view);
  316.   gtk_widget_show (view);
  317.   gtk_table_attach (GTK_TABLE (table), tempwid, 0, 1, 0, 1,
  318.     GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
  319.     0, 0);
  320.   gtk_widget_show (tempwid);
  321.   vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tempwid));
  322. #endif
  323.   gtk_widget_set_size_request (table, 500, 400);
  324.   gtk_widget_show (table);
  325. #if GTK_MAJOR_VERSION == 1
  326.   tempwid = gtk_button_new_with_label (_("  Close  "));
  327.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  328.       FALSE, FALSE, 0);
  329.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  330.      GTK_SIGNAL_FUNC (gtk_widget_destroy),
  331.      GTK_OBJECT (dialog));
  332.   gtk_widget_show (tempwid);
  333. #else
  334.   g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
  335.                             G_CALLBACK (gtk_widget_destroy),
  336.                             GTK_OBJECT (dialog));
  337. #endif
  338.   buf[sizeof (buf) - 1] = '';
  339.   while ((n = read (fd, buf, sizeof (buf) - 1)))
  340.     {
  341.       buf[n] = '';
  342. #if GTK_MAJOR_VERSION == 1
  343.       gtk_text_insert (GTK_TEXT (view), NULL, NULL, NULL, buf, -1);
  344. #else
  345.       textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  346.       len = gtk_text_buffer_get_char_count (textbuf);
  347.       gtk_text_buffer_get_iter_at_offset (textbuf, &iter, len - 1);
  348.       gtk_text_buffer_insert (textbuf, &iter, buf, -1);
  349. #endif
  350.     }
  351.   if (doclose)
  352.     close (fd);
  353.   gtk_widget_show (dialog);
  354.   if (!start_pos)
  355.     gtk_adjustment_set_value (vadj, vadj->upper);
  356. }