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

Ftp客户端

开发平台:

Visual C++

  1. /*****************************************************************************/
  2. /*  chmod_dialog.c - the chmod dialog box                                    */
  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: chmod_dialog.c,v 1.8 2002/11/26 14:58:13 masneyb Exp $";
  21. static GtkWidget *suid, *sgid, *sticky, *ur, *uw, *ux, *gr, *gw, *gx, *or, *ow,
  22.                  *ox;
  23. static int mode; 
  24. static void *
  25. do_chmod_thread (void * data)
  26. {
  27.   GList * filelist, * templist;
  28.   gftp_window_data * wdata;
  29.   int success, num, sj;
  30.   gftp_file * tempfle;
  31.   wdata = data;
  32.   if (wdata->request->use_threads)
  33.     {
  34.       sj = sigsetjmp (jmp_environment, 1);
  35.       use_jmp_environment = 1;
  36.     }
  37.   else
  38.     sj = 0;
  39.   success = 0;
  40.   if (sj == 0)
  41.     { 
  42.       filelist = wdata->files;
  43.       templist = GTK_CLIST (wdata->listbox)->selection;
  44.       num = 0;
  45.       while (templist != NULL)
  46.         {
  47.           templist = get_next_selection (templist, &filelist, &num);
  48.           tempfle = filelist->data;
  49.           if (wdata->request->network_timeout > 0)
  50.             alarm (wdata->request->network_timeout);
  51.           if (gftp_chmod (wdata->request, tempfle->file, mode) == 0)
  52.             success = 1;
  53.           if (!GFTP_IS_CONNECTED (wdata->request))
  54.             break;
  55.         }
  56.       alarm (0);
  57.     }
  58.   else
  59.     {
  60.       gftp_disconnect (wdata->request);
  61.       wdata->request->logging_function (gftp_logging_error, 
  62.                                         wdata->request->user_data,
  63.                                         _("Operation canceledn"));
  64.     }
  65.   if (wdata->request->use_threads)
  66.     use_jmp_environment = 0;
  67.   wdata->request->stopable = 0;
  68.   return ((void *) success);
  69. }
  70. static void
  71. dochmod (GtkWidget * widget, gftp_window_data * wdata)
  72. {
  73.   int cur;
  74.   mode = 0;
  75.   if (GTK_TOGGLE_BUTTON (suid)->active)
  76.     mode += 4;
  77.   if (GTK_TOGGLE_BUTTON (sgid)->active)
  78.     mode += 2;
  79.   if (GTK_TOGGLE_BUTTON (sticky)->active)
  80.     mode += 1;
  81.   cur = 0;
  82.   if (GTK_TOGGLE_BUTTON (ur)->active)
  83.     cur += 4;
  84.   if (GTK_TOGGLE_BUTTON (uw)->active)
  85.     cur += 2;
  86.   if (GTK_TOGGLE_BUTTON (ux)->active)
  87.     cur += 1;
  88.   mode = mode * 10 + cur;
  89.   cur = 0;
  90.   if (GTK_TOGGLE_BUTTON (gr)->active)
  91.     cur += 4;
  92.   if (GTK_TOGGLE_BUTTON (gw)->active)
  93.     cur += 2;
  94.   if (GTK_TOGGLE_BUTTON (gx)->active)
  95.     cur += 1;
  96.   mode = mode * 10 + cur;
  97.   cur = 0;
  98.   if (GTK_TOGGLE_BUTTON (or)->active)
  99.     cur += 4;
  100.   if (GTK_TOGGLE_BUTTON (ow)->active)
  101.     cur += 2;
  102.   if (GTK_TOGGLE_BUTTON (ox)->active)
  103.     cur += 1;
  104.   mode = mode * 10 + cur;
  105.   if (check_reconnect (wdata) < 0)
  106.     return;
  107.    if ((int) generic_thread (do_chmod_thread, wdata))
  108.     refresh (wdata);
  109. }
  110. #if GTK_MAJOR_VERSION > 1
  111. static void
  112. chmod_action (GtkWidget * widget, gint response, gpointer wdata)
  113. {
  114.   switch (response)
  115.     {
  116.       case GTK_RESPONSE_OK:
  117.         dochmod (widget, wdata);
  118.         /* no break */
  119.       default:
  120.         gtk_widget_destroy (widget);
  121.     }
  122. }
  123. #endif
  124. void
  125. chmod_dialog (gpointer data)
  126. {
  127.   GtkWidget *tempwid, *dialog, *hbox, *vbox;
  128.   GList * templist, * filelist;
  129.   gftp_window_data * wdata;
  130.   gftp_file * tempfle;
  131.   int num;
  132.   wdata = data;
  133.   if (!check_status (_("Chmod"), wdata, wdata->request->use_threads, 0, 1, 
  134.                      wdata->request->chmod != NULL))
  135.     return;
  136. #if GTK_MAJOR_VERSION == 1
  137.   dialog = gtk_dialog_new ();
  138.   gtk_window_set_title (GTK_WINDOW (dialog), _("Chmod"));
  139.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area),
  140.                               5);
  141.   gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
  142. #else
  143.   dialog = gtk_dialog_new_with_buttons (_("Chmod"), NULL, 0,
  144.                                         GTK_STOCK_OK,
  145.                                         GTK_RESPONSE_OK,
  146.                                         GTK_STOCK_CANCEL,
  147.                                         GTK_RESPONSE_CANCEL,
  148.                                         NULL);
  149. #endif
  150.   gtk_window_set_wmclass (GTK_WINDOW(dialog), "Chmod", "gFTP");
  151.   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
  152.   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5);
  153.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
  154.   gtk_widget_realize (dialog);
  155.   if (gftp_icon != NULL)
  156.     {
  157.       gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap,
  158.                            gftp_icon->bitmap);
  159.       gdk_window_set_icon_name (dialog->window, _("gFTP Icon"));
  160.     }
  161.   tempwid = gtk_label_new (_("You can now adjust the attributes of your file(s)nNote: Not all ftp servers support the chmod feature"));
  162.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tempwid, FALSE,
  163.       FALSE, 0);
  164.   gtk_widget_show (tempwid);
  165.   hbox = gtk_hbox_new (TRUE, 5);
  166.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE,
  167.       0);
  168.   gtk_widget_show (hbox);
  169.   tempwid = gtk_frame_new (_("Special"));
  170.   gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0);
  171.   gtk_widget_show (tempwid);
  172.   vbox = gtk_vbox_new (TRUE, 5);
  173.   gtk_container_add (GTK_CONTAINER (tempwid), vbox);
  174.   gtk_widget_show (vbox);
  175.   suid = gtk_check_button_new_with_label (_("SUID"));
  176.   gtk_box_pack_start (GTK_BOX (vbox), suid, FALSE, FALSE, 0);
  177.   gtk_widget_show (suid);
  178.   sgid = gtk_check_button_new_with_label (_("SGID"));
  179.   gtk_box_pack_start (GTK_BOX (vbox), sgid, FALSE, FALSE, 0);
  180.   gtk_widget_show (sgid);
  181.   sticky = gtk_check_button_new_with_label (_("Sticky"));
  182.   gtk_box_pack_start (GTK_BOX (vbox), sticky, FALSE, FALSE, 0);
  183.   gtk_widget_show (sticky);
  184.   tempwid = gtk_frame_new (_("User"));
  185.   gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0);
  186.   gtk_widget_show (tempwid);
  187.   vbox = gtk_vbox_new (TRUE, 5);
  188.   gtk_container_add (GTK_CONTAINER (tempwid), vbox);
  189.   gtk_widget_show (vbox);
  190.   ur = gtk_check_button_new_with_label (_("Read"));
  191.   gtk_box_pack_start (GTK_BOX (vbox), ur, FALSE, FALSE, 0);
  192.   gtk_widget_show (ur);
  193.   uw = gtk_check_button_new_with_label (_("Write"));
  194.   gtk_box_pack_start (GTK_BOX (vbox), uw, FALSE, FALSE, 0);
  195.   gtk_widget_show (uw);
  196.   ux = gtk_check_button_new_with_label (_("Execute"));
  197.   gtk_box_pack_start (GTK_BOX (vbox), ux, FALSE, FALSE, 0);
  198.   gtk_widget_show (ux);
  199.   tempwid = gtk_frame_new (_("Group"));
  200.   gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0);
  201.   gtk_widget_show (tempwid);
  202.   vbox = gtk_vbox_new (TRUE, 5);
  203.   gtk_container_add (GTK_CONTAINER (tempwid), vbox);
  204.   gtk_widget_show (vbox);
  205.   gr = gtk_check_button_new_with_label (_("Read"));
  206.   gtk_box_pack_start (GTK_BOX (vbox), gr, FALSE, FALSE, 0);
  207.   gtk_widget_show (gr);
  208.   gw = gtk_check_button_new_with_label (_("Write"));
  209.   gtk_box_pack_start (GTK_BOX (vbox), gw, FALSE, FALSE, 0);
  210.   gtk_widget_show (gw);
  211.   gx = gtk_check_button_new_with_label (_("Execute"));
  212.   gtk_box_pack_start (GTK_BOX (vbox), gx, FALSE, FALSE, 0);
  213.   gtk_widget_show (gx);
  214.   tempwid = gtk_frame_new (_("Other"));
  215.   gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0);
  216.   gtk_widget_show (tempwid);
  217.   vbox = gtk_vbox_new (TRUE, 5);
  218.   gtk_container_add (GTK_CONTAINER (tempwid), vbox);
  219.   gtk_widget_show (vbox);
  220.   or = gtk_check_button_new_with_label (_("Read"));
  221.   gtk_box_pack_start (GTK_BOX (vbox), or, FALSE, FALSE, 0);
  222.   gtk_widget_show (or);
  223.   ow = gtk_check_button_new_with_label (_("Write"));
  224.   gtk_box_pack_start (GTK_BOX (vbox), ow, FALSE, FALSE, 0);
  225.   gtk_widget_show (ow);
  226.   ox = gtk_check_button_new_with_label (_("Execute"));
  227.   gtk_box_pack_start (GTK_BOX (vbox), ox, FALSE, FALSE, 0);
  228.   gtk_widget_show (ox);
  229. #if GTK_MAJOR_VERSION == 1
  230.   tempwid = gtk_button_new_with_label (_("OK"));
  231.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  232.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  233.       TRUE, TRUE, 0);
  234.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  235.       GTK_SIGNAL_FUNC (dochmod), (gpointer) wdata);
  236.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  237.      GTK_SIGNAL_FUNC (gtk_widget_destroy),
  238.      GTK_OBJECT (dialog));
  239.   gtk_widget_grab_default (tempwid);
  240.   gtk_widget_show (tempwid);
  241.   tempwid = gtk_button_new_with_label (_("  Cancel  "));
  242.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  243.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  244.       TRUE, TRUE, 0);
  245.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  246.      GTK_SIGNAL_FUNC (gtk_widget_destroy),
  247.      GTK_OBJECT (dialog));
  248.   gtk_widget_show (tempwid);
  249. #else
  250.   g_signal_connect (GTK_OBJECT (dialog), "response",
  251.                     G_CALLBACK (chmod_action), wdata);
  252. #endif
  253.   if (IS_ONE_SELECTED (wdata))
  254.     {
  255.       filelist = wdata->files;
  256.       templist = GTK_CLIST (wdata->listbox)->selection;
  257.       num = 0;
  258.       templist = get_next_selection (templist, &filelist, &num);
  259.       tempfle = filelist->data;
  260.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (suid),
  261.     tolower (tempfle->attribs[3]) == 's');
  262.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sgid),
  263.     tolower (tempfle->attribs[6]) == 's');
  264.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sticky),
  265.     tolower (tempfle->attribs[9]) == 't');
  266.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ur),
  267.     tempfle->attribs[1] == 'r');
  268.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (uw),
  269.     tempfle->attribs[2] == 'w');
  270.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ux),
  271.     tempfle->attribs[3] == 'x' ||
  272.                                     tempfle->attribs[3] == 's');
  273.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gr),
  274.     tempfle->attribs[4] == 'r');
  275.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gw),
  276.     tempfle->attribs[5] == 'w');
  277.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gx),
  278.     tempfle->attribs[6] == 'x' ||
  279.                                     tempfle->attribs[6] == 's');
  280.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (or),
  281.     tempfle->attribs[7] == 'r');
  282.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow),
  283.     tempfle->attribs[8] == 'w');
  284.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ox),
  285.     tempfle->attribs[9] == 'x' ||
  286.                                     tempfle->attribs[9] == 't');
  287.     }
  288.   gtk_widget_show (dialog);
  289. }