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

Ftp客户端

开发平台:

Visual C++

  1. /*****************************************************************************/
  2. /*  dnd.c - drag and drop functions                                          */
  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: dnd.c,v 1.10 2002/12/04 02:35:44 masneyb Exp $";
  21. static int
  22. dnd_remote_file (char *url, gftp_window_data * wdata)
  23. {
  24.   gftp_window_data * other_wdata, * fromwdata;
  25.   gftp_request * current_ftpdata;
  26.   gftp_file * newfle;
  27.   GList * templist;
  28.   char *pos;
  29.   if (wdata == &window1)
  30.     other_wdata = &window2;
  31.   else if (wdata == &window2)
  32.     other_wdata = &window1;
  33.   else 
  34.     other_wdata = NULL;
  35.     
  36.   newfle = g_malloc0 (sizeof (*newfle));
  37.   newfle->shown = 1;
  38.   if (url[strlen (url) - 1] == '/') 
  39.     {
  40.       newfle->isdir = 1;
  41.       url[strlen (url) - 1] = '';
  42.     }
  43.   current_ftpdata = gftp_request_new ();
  44.   current_ftpdata->logging_function = ftp_log;
  45.   if (gftp_parse_url (current_ftpdata, url) != 0 ||
  46.       current_ftpdata->directory == NULL ||
  47.       (pos = strrchr (current_ftpdata->directory, '/')) == NULL) 
  48.     {
  49.       ftp_log (gftp_logging_misc, NULL, 
  50.                _("Drag-N-Drop: Ignoring url %s: Not a valid urln"), url);
  51.       gftp_request_destroy (current_ftpdata, 1);
  52.       free_fdata (newfle);
  53.       return (0);
  54.     }
  55.   *pos++ = '';
  56.   if (compare_request (current_ftpdata, wdata->request, 1))
  57.     {
  58.       gftp_request_destroy (current_ftpdata, 1);
  59.       return (0);
  60.     }
  61.   if (other_wdata != NULL && 
  62.       compare_request (current_ftpdata, other_wdata->request, 1))
  63.     {
  64.       if (other_wdata->request->password != NULL)
  65.         gftp_set_password (current_ftpdata, other_wdata->request->password);
  66.       fromwdata = other_wdata;
  67.     }
  68.   else
  69.     fromwdata = NULL;
  70.   *(pos - 1) = '/';
  71.   newfle->file = g_malloc (strlen (current_ftpdata->directory) + 1);
  72.   strcpy (newfle->file, current_ftpdata->directory);
  73.   *(pos - 1) = '';
  74.   
  75.   newfle->destfile = g_strconcat (GFTP_GET_DIRECTORY (wdata->request),
  76.                                      "/", pos, NULL);
  77.   templist = g_malloc0 (sizeof (*templist));
  78.   templist->data = newfle;
  79.   templist->next = NULL;
  80.   add_file_transfer (current_ftpdata, wdata->request, fromwdata,
  81.                      wdata, templist, 1);
  82.   gftp_request_destroy (current_ftpdata, 1);
  83.   /* FIXME  resume files and download entire directories */
  84.   return (1);
  85. }
  86. void
  87. openurl_get_drag_data (GtkWidget * widget, GdkDragContext * context, gint x,
  88.        gint y, GtkSelectionData * selection_data, guint info,
  89.        guint32 clk_time, gpointer data)
  90. {
  91.   if ((selection_data->length >= 0) && (selection_data->format == 8)) 
  92.     {
  93.       if (gftp_parse_url (current_wdata->request, 
  94.                           (char *) selection_data->data) == 0)
  95.         {
  96.           if (GFTP_IS_CONNECTED (current_wdata->request))
  97.             disconnect (current_wdata);
  98.           ftp_connect (current_wdata, current_wdata->request, 1);
  99.         }
  100.       else
  101.         {
  102.           ftp_log (gftp_logging_misc, NULL, _("Could not parse URL %sn"), 
  103.                    selection_data->data);
  104.         }
  105.     }
  106. }
  107. void
  108. listbox_drag (GtkWidget * widget, GdkDragContext * context,
  109.       GtkSelectionData * selection_data, guint info, guint32 clk_time,
  110.       gpointer data)
  111. {
  112.   GList * templist, * filelist;
  113.   char *tempstr, *str, *pos;
  114.   gftp_window_data * wdata;
  115.   size_t totlen, oldlen;
  116.   gftp_file * tempfle;
  117.   int curpos;
  118.    
  119.   totlen = 0;
  120.   str = NULL;
  121.   wdata = data;
  122.   if (!check_status (_("Drag-N-Drop"), wdata, 1, 0, 1, 1)) 
  123.     return;
  124.   filelist = wdata->files;
  125.   templist = GTK_CLIST (wdata->listbox)->selection;
  126.   curpos = 0;
  127.   while (templist != NULL)
  128.     {
  129.       templist = get_next_selection (templist, &filelist, &curpos);
  130.       tempfle = filelist->data;
  131.       if (strcmp (tempfle->file, "..") == 0) 
  132.         continue;
  133.       oldlen = totlen;
  134.       if (GFTP_GET_HOSTNAME (wdata->request) == NULL || 
  135.           wdata->request->protonum == GFTP_LOCAL_NUM)
  136.         {
  137.           tempstr = g_strdup_printf ("%s://%s/%s ", 
  138.                                  GFTP_GET_URL_PREFIX (wdata->request),
  139.                                  GFTP_GET_DIRECTORY (wdata->request), 
  140.                                  tempfle->file);
  141.         }
  142.       else if (GFTP_GET_USERNAME (wdata->request) == NULL 
  143.                || *GFTP_GET_USERNAME (wdata->request) == '')
  144.         {
  145.           tempstr = g_strdup_printf ("%s://%s:%d%s/%s ", 
  146.                                  GFTP_GET_URL_PREFIX (wdata->request),
  147.                                  GFTP_GET_HOSTNAME (wdata->request),
  148.                                  GFTP_GET_PORT (wdata->request),
  149.                                  GFTP_GET_DIRECTORY (wdata->request), 
  150.                                  tempfle->file);
  151.         }
  152.       else
  153.         {
  154.           tempstr = g_strdup_printf ("%s://%s@%s:%d%s/%s ", 
  155.                                  GFTP_GET_URL_PREFIX (wdata->request),
  156.                                  GFTP_GET_USERNAME (wdata->request), 
  157.                                  GFTP_GET_HOSTNAME (wdata->request),
  158.                                  GFTP_GET_PORT (wdata->request),
  159.                                  GFTP_GET_DIRECTORY (wdata->request), 
  160.                                  tempfle->file);
  161.         }
  162.       if ((pos = strchr (tempstr, ':')) != NULL)
  163.         pos += 3;
  164.       else
  165.         pos = tempstr;
  166.       remove_double_slashes (pos);
  167.       /* Note, I am allocating memory for this byte above. Note the extra space
  168.          at the end of the g_strdup_printf() format argument */
  169.       if (tempfle->isdir)
  170.         tempstr[strlen (tempstr) - 1] = '/';
  171.       else
  172.         tempstr[strlen (tempstr) - 1] = '';
  173.       totlen += strlen (tempstr);
  174.       if (str != NULL)
  175.         {
  176.           totlen++;
  177.           str = g_realloc (str, totlen + 1);
  178.           strcpy (str + oldlen, "n");
  179.           strcpy (str + oldlen + 1, tempstr);
  180.         } 
  181.       else
  182.         {
  183.           str = g_malloc (totlen + 1);
  184.           strcpy (str, tempstr);
  185.         }
  186.       g_free (tempstr);
  187.     }
  188.   if (str != NULL)
  189.     {
  190.       gtk_selection_data_set (selection_data, selection_data->target, 8,
  191.                              (unsigned char *) str, strlen (str));
  192.       g_free (str);
  193.     }
  194. }
  195. void
  196. listbox_get_drag_data (GtkWidget * widget, GdkDragContext * context, gint x,
  197.        gint y, GtkSelectionData * selection_data, guint info,
  198.        guint32 clk_time, gpointer data)
  199. {
  200.   char *newpos, *oldpos, tempchar;
  201.   gftp_window_data * wdata;
  202.   int finish_drag;
  203.   wdata = data;   
  204.   if (!check_status (_("Drag-N-Drop"), wdata, 1, 0, 0, 1)) 
  205.     return;
  206.   finish_drag = 0;
  207.   if ((selection_data->length >= 0) && (selection_data->format == 8)) 
  208.     {
  209.       oldpos = (char *) selection_data->data;
  210.       while ((newpos = strchr (oldpos, 'n')) || 
  211.              (newpos = strchr (oldpos, ''))) 
  212.         {
  213.           tempchar = *newpos;
  214.           *newpos = '';
  215.           ftp_log (gftp_logging_misc, NULL, _("Received URL %sn"), oldpos);
  216.           if (dnd_remote_file (oldpos, wdata))
  217.             finish_drag = 1;
  218.          
  219.           if (*newpos == '') 
  220.             break;
  221.           oldpos = newpos + 1;
  222.         }
  223.     }
  224.   gtk_drag_finish (context, finish_drag, FALSE, clk_time);
  225. }