Ejemplo n.º 1
0
static void _manage_event_on_drive (CairoDockFMEventType iEventType, const gchar *cBaseURI, GList *pIconsList, GldiContainer *pContainer, GldiModuleInstance *myApplet)
{
    gchar *cURI = (g_strdup (cBaseURI));
    cairo_dock_remove_html_spaces (cURI);
    cd_debug (" * event %d on '%s'", iEventType, cURI);

    switch (iEventType)
    {
    case CAIRO_DOCK_FILE_DELETED :  // a mount point has been disconnected
    {
        Icon *pConcernedIcon = cairo_dock_get_icon_with_base_uri (pIconsList, cURI);
        if (pConcernedIcon == NULL)  // search by name
        {
            pConcernedIcon = cairo_dock_get_icon_with_name (pIconsList, cURI);
        }
        if (pConcernedIcon == NULL)
        {
            cd_warning ("  an unknown mount point was removed");
            return ;
        }
        //g_print (" %s will be removed\n", pConcernedIcon->cName);

        CD_APPLET_REMOVE_ICON_FROM_MY_ICONS_LIST (pConcernedIcon);
        g_free (myData.cLastDeletedUri);
        myData.cLastDeletedUri = g_strdup (cURI);
    }
    break ;

    case CAIRO_DOCK_FILE_CREATED :  // a mount point has been connected
    {
        //\_______________________does it already exist?
        Icon *pSameIcon = cairo_dock_get_icon_with_base_uri (pIconsList, cURI);
        if (pSameIcon != NULL)
        {
            cd_warning ("this mount point (%s) already exists.", pSameIcon->cName);
            return;  // do nothing, certainly an useless/double signal
        }

        //\_______________________ create a new icon
        Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, pContainer, CAIRO_DOCK_FM_SORT_BY_NAME);
        if (pNewIcon == NULL)
        {
            cd_warning ("couldn't create an icon for this mount point");
            return ;
        }
        pNewIcon->iGroup = CD_DRIVE_GROUP;

        //\_______________________ place it at the right position (by name)
        cd_shortcuts_set_icon_order_by_name (pNewIcon, pIconsList);
        cd_debug (" new drive : %s, %s", pNewIcon->cName, pNewIcon->cCommand);

        //\_______________________ added in the list
        CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pNewIcon);
        _init_disk_usage (pNewIcon, myApplet);
        if (pNewIcon->cCommand)
        {
            cd_shortcuts_add_progress_bar (pNewIcon, myApplet);
            cd_shortcuts_display_disk_usage (pNewIcon, myApplet);
        }

        //\_______________________ display a notification
        gboolean bIsMounted = FALSE;
        gchar *cUri = cairo_dock_fm_is_mounted (pNewIcon->cBaseURI, &bIsMounted);
        g_free (cUri);
        gldi_dialog_show_temporary_with_icon_printf (
            bIsMounted ? D_("%s is now mounted") : D_("%s has been connected"),
            pNewIcon, pContainer,
            4000,
            NULL,  // it's icon is not already loaded
            pNewIcon->cName);
        g_free (myData.cLastCreatedUri);
        myData.cLastCreatedUri = g_strdup (cURI);
    }
    break ;

    case CAIRO_DOCK_FILE_MODIFIED :  // a mount point has been (un)mounted
    {
        //\_______________________ search the right icon
        Icon *pConcernedIcon = cairo_dock_get_icon_with_base_uri (pIconsList, cURI);
        if (pConcernedIcon == NULL)  // search by using the name
        {
            pConcernedIcon = cairo_dock_get_icon_with_name (pIconsList, cURI);
        }
        if (pConcernedIcon == NULL)
        {
            cd_warning ("  an unknown mount point was modified");
            return ;
        }
        cd_debug (" %s is modified (%s)", pConcernedIcon->cName, pConcernedIcon->cCommand);

        //\_______________________ grab current info
        Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, pContainer, CAIRO_DOCK_FM_SORT_BY_NAME);
        if (pNewIcon == NULL)
        {
            cd_warning ("couldn't create an icon for this mount point");
            return ;
        }
        pNewIcon->iGroup = CD_DRIVE_GROUP;

        //\_______________________ replace the icon if smthg has changed
        if (cairo_dock_strings_differ (pConcernedIcon->cName, pNewIcon->cName)
                || cairo_dock_strings_differ (pConcernedIcon->cFileName, pNewIcon->cFileName))
        {
            //g_print (" '%s' -> '%s'\n'%s' -> '%s'\n", pConcernedIcon->cName, pNewIcon->cName, pConcernedIcon->cFileName, pNewIcon->cFileName);

            CD_APPLET_REMOVE_ICON_FROM_MY_ICONS_LIST (pConcernedIcon);
            pIconsList = CD_APPLET_MY_ICONS_LIST;

            cd_shortcuts_set_icon_order_by_name (pNewIcon, pIconsList);
            CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pNewIcon);
            _init_disk_usage (pNewIcon, myApplet);
            if (pNewIcon->cCommand)
            {
                cd_shortcuts_add_progress_bar (pNewIcon, myApplet);
            }

            // pConcernedIcon has been distroyed, assigned the new one to display a dialogue just after
            pConcernedIcon = pNewIcon;
        }
        else
        {
            gldi_object_unref (GLDI_OBJECT (pNewIcon));
            pNewIcon = NULL;
        }

        cd_shortcuts_display_disk_usage (pConcernedIcon, myApplet);

        //\_______________________ display a notification
        gldi_dialogs_remove_on_icon (pConcernedIcon); // avoid multiple dialogues
        gboolean bIsMounted = FALSE;
        gchar *cUri = cairo_dock_fm_is_mounted (pConcernedIcon->cBaseURI, &bIsMounted);
        g_free (cUri);
        gldi_dialog_show_temporary_with_icon_printf (
            bIsMounted ? D_("%s is now mounted") : D_("%s is now unmounted"),
            pConcernedIcon, pContainer,
            4000,
            "same icon",  // it's possible to not have the right icon, not so important
            pConcernedIcon->cName);
        // disk has been unmounted but a icon is needed
        if (! bIsMounted && pNewIcon == NULL)
        {
            CDDiskUsage *pDiskUsage = CD_APPLET_GET_MY_ICON_DATA (pConcernedIcon);
            if (pDiskUsage != NULL)
            {
                if (pDiskUsage->iTotal != 0)
                {
                    pDiskUsage->iTotal = 0;
                    pDiskUsage->iAvail = 0;
                    // remove the quick-info because it has been unmounted
                    gldi_icon_set_quick_info (pConcernedIcon, NULL);
                }
            }
        }
    }
    break ;
    case CAIRO_DOCK_NB_EVENT_ON_FILES :
        break ;
    }
    g_free (cURI);
}
Ejemplo n.º 2
0
GList *vfs_backend_list_directory (const gchar *cBaseURI, CairoDockFMSortType iSortType, int iNewIconsType, gboolean bListHiddenFiles, gchar **cFullURI)
{
	g_return_val_if_fail (cBaseURI != NULL, NULL);
	cd_message ("%s (%s)", __func__, cBaseURI);
	
	gchar *cURI;
	gboolean bAddHome = FALSE;
	if (strcmp (cBaseURI, CAIRO_DOCK_FM_VFS_ROOT) == 0)
	{
		cURI = g_strdup ("computer://");
		bAddHome = TRUE;
		///*cFullURI = cURI;
		///return vfs_backend_list_volumes ();
		//vfs_backend_list_volumes ();
	}
	else if (strcmp (cBaseURI, CAIRO_DOCK_FM_NETWORK) == 0)
		cURI = g_strdup ("network://");
	else
		cURI = (*cBaseURI == '/' ? g_strconcat ("file://", cBaseURI, NULL) : g_strdup (cBaseURI));
	*cFullURI = cURI;
	
	GFile *pFile = g_file_new_for_uri (cURI);
	GError *erreur = NULL;
	const gchar *cAttributes = G_FILE_ATTRIBUTE_STANDARD_TYPE","
		G_FILE_ATTRIBUTE_STANDARD_SIZE","
		G_FILE_ATTRIBUTE_TIME_MODIFIED","
		G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE","
		G_FILE_ATTRIBUTE_STANDARD_NAME","
		G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN","
		G_FILE_ATTRIBUTE_STANDARD_ICON","
		G_FILE_ATTRIBUTE_STANDARD_TARGET_URI","
		G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE;
	GFileEnumerator *pFileEnum = g_file_enumerate_children (pFile,
		cAttributes,
		G_FILE_QUERY_INFO_NONE,  /// G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
		NULL,
		&erreur);
	//g_object_unref (pFile);
	if (erreur != NULL)
	{
		cd_warning ("gnome_integration : %s", erreur->message);
		g_error_free (erreur);
		return NULL;
	}
	
	int iOrder = 0;
	GList *pIconList = NULL;
	Icon *icon;
	GFileInfo *pFileInfo;
	do
	{
		pFileInfo = g_file_enumerator_next_file (pFileEnum, NULL, &erreur);
		if (erreur != NULL)
		{
			cd_warning ("gnome_integration : %s", erreur->message);
			g_error_free (erreur);
			erreur = NULL;
			continue;
		}
		if (pFileInfo == NULL)
			break ;
		
		gboolean bIsHidden = g_file_info_get_is_hidden (pFileInfo);
		if (bListHiddenFiles || ! bIsHidden)
		{
			GFileType iFileType = g_file_info_get_file_type (pFileInfo);
			GIcon *pFileIcon = g_file_info_get_icon (pFileInfo);
			if (pFileIcon == NULL)
			{
				cd_message ("AUCUNE ICONE");
				continue;
			}
			const gchar *cFileName = g_file_info_get_name (pFileInfo);
			const gchar *cMimeType = g_file_info_get_content_type (pFileInfo);
			gchar *cName = NULL;
			
			icon = g_new0 (Icon, 1);
			icon->iType = iNewIconsType;
			icon->cBaseURI = g_strconcat (*cFullURI, "/", cFileName, NULL);
			cd_message ("+ %s (mime:%s)", icon->cBaseURI, cMimeType);
			
			if (iFileType == G_FILE_TYPE_MOUNTABLE)
			{
				const gchar *cTargetURI = g_file_info_get_attribute_string (pFileInfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
				cd_message ("  c'est un point de montage correspondant a %s", cTargetURI);
				
				GMount *pMount = NULL;
				if (cTargetURI != NULL)
				{
					icon->acCommand = g_strdup (cTargetURI);
					GFile *file = g_file_new_for_uri (cTargetURI);
					pMount = g_file_find_enclosing_mount (file, NULL, NULL);
					//g_object_unref (file);
				}
				if (pMount != NULL)
				{
					cName = g_mount_get_name (pMount);
					cd_message ("un GMount existe (%s)", cName);
					
					GVolume *volume = g_mount_get_volume (pMount);
					if (volume)
						cd_message ("  volume associe : %s", g_volume_get_name (volume));
					GDrive *drive = g_mount_get_drive (pMount);
					if (drive)
						cd_message ("  disque associe : %s", g_drive_get_name (drive));
					
					///pFileIcon = g_mount_get_icon (pMount);
				}
				else
				{
					cName = g_strdup (cFileName);
					gchar *str = strrchr (cName, '.');  // on vire l'extension ".volume" ou ".drive".
					if (str != NULL)
					{
						*str = '\0';
						if (strcmp (str+1, "link") == 0)
						{
							if (strcmp (cName, "root") == 0)
							{
								g_free (cName);
								cName = g_strdup ("/");
							}
						}
						else if (strcmp (str+1, "drive") == 0)  // on cherche un nom plus parlant si possible.
						{
							gchar *cVolumeName = _cd_find_volume_name_from_drive_name (cName);
							if (cVolumeName != NULL)
							{
								g_free (cName);
								g_free (cVolumeName);
								continue;  /// apparemment il n'est plus necessaire d'afficher les .drives qui ont 1 (ou plusieurs ?) volumes, car ces derniers sont dans la liste, donc ca fait redondant.
								/**if (strcmp (cVolumeName, "discard") == 0)
									continue;
								g_free (cName);
								cName = cVolumeName;*/
							}
						}
					}
				}
				icon->iVolumeID = 1;
				cd_message ("le nom de ce volume est : %s", cName);
			}
			else
				cName = g_strdup (cFileName);
			
			if (icon->acCommand == NULL)
				icon->acCommand = g_strdup (icon->cBaseURI);
			icon->acName = cName;
			icon->acFileName = NULL;
			if (cMimeType != NULL && strncmp (cMimeType, "image", 5) == 0)
			{
				gchar *cHostname = NULL;
				gchar *cFilePath = g_filename_from_uri (icon->cBaseURI, &cHostname, &erreur);
				if (erreur != NULL)
				{
					g_error_free (erreur);
					erreur = NULL;
				}
				else if (cHostname == NULL || strcmp (cHostname, "localhost") == 0)  // on ne recupere la vignette que sur les fichiers locaux.
				{
					icon->acFileName = g_strdup (cFilePath);
					cairo_dock_remove_html_spaces (icon->acFileName);
				}
				g_free (cHostname);
				g_free (cFilePath);
			}
			if (icon->acFileName == NULL)
			{
				icon->acFileName = _cd_get_icon_path (pFileIcon);
				cd_message ("icon->acFileName : %s", icon->acFileName);
			}
			
			if (iSortType == CAIRO_DOCK_FM_SORT_BY_SIZE)
				icon->fOrder = g_file_info_get_size (pFileInfo);
			else if (iSortType == CAIRO_DOCK_FM_SORT_BY_DATE)
			{
				GTimeVal t;
				g_file_info_get_modification_time (pFileInfo, &t);
				icon->fOrder = t.tv_sec;
			}
			else if (iSortType == CAIRO_DOCK_FM_SORT_BY_TYPE)
				icon->fOrder = (cMimeType != NULL ? *((int *) cMimeType) : 0);
			if (icon->fOrder == 0)  // un peu moyen mais mieux que rien non ?
				icon->fOrder = iOrder;
			pIconList = g_list_insert_sorted (pIconList,
				icon,
				(GCompareFunc) cairo_dock_compare_icons_order);
			//g_list_prepend (pIconList, icon);
			iOrder ++;
		}
	} while (TRUE);  // 'g_file_enumerator_close' est appelee lors du dernier 'g_file_enumerator_next_file'.
	
	if (bAddHome && pIconList != NULL)
	{
		icon = g_new0 (Icon, 1);
		icon->iType = iNewIconsType;
		icon->cBaseURI = g_strdup_printf ("file://%s", "/home");
		icon->acCommand = g_strdup ("/home");
		//icon->acCommand = g_strdup (icon->cBaseURI);
		icon->iVolumeID = 0;
		icon->acName = g_strdup ("home");
		Icon *pRootIcon = cairo_dock_get_icon_with_name (pIconList, "/");
		if (pRootIcon == NULL)
		{
			pRootIcon = cairo_dock_get_first_icon (pIconList);
			g_print ("domage ! (%s:%s)\n", pRootIcon->acCommand, pRootIcon->acName);
		}
		icon->acFileName = g_strdup (pRootIcon->acFileName);
		icon->fOrder = iOrder++;
		pIconList = g_list_insert_sorted (pIconList,
			icon,
			(GCompareFunc) cairo_dock_compare_icons_order);
	}
	
	if (iSortType == CAIRO_DOCK_FM_SORT_BY_NAME)
		pIconList = cairo_dock_sort_icons_by_name (pIconList);
	else
		pIconList = cairo_dock_sort_icons_by_order (pIconList);
	
	return pIconList;
}