예제 #1
0
파일: gvfs.c 프로젝트: kfihihc/xmms2-devel
static gboolean
xmms_gvfs_browse (xmms_xform_t *xform, const gchar *url, xmms_error_t *error)
{
    GError *err = NULL;
    GFile *file;
    GFileInfo *info;
    GFileEnumerator *enumerator;

    /* Same hack as in _init */
    if (!g_ascii_strncasecmp (url, "file://", 7)) {
        file = g_file_new_for_path (url+7);
    } else {
        file = g_file_new_for_uri (url);
    }
    enumerator = g_file_enumerate_children (file,
                                            G_FILE_ATTRIBUTE_STANDARD_NAME ","
                                            G_FILE_ATTRIBUTE_STANDARD_TYPE ","
                                            G_FILE_ATTRIBUTE_STANDARD_SIZE,
                                            G_FILE_QUERY_INFO_NONE,
                                            NULL,
                                            &err);

    g_object_unref (file);

    if (!enumerator) {
        xmms_error_set (error, XMMS_ERROR_GENERIC, err->message);
        return FALSE;
    }

    while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL))) {
        guint32 child_type, flags = 0;
        guint64 child_size;
        const gchar *child_name;

        child_name = g_file_info_get_attribute_byte_string (info,
                     G_FILE_ATTRIBUTE_STANDARD_NAME);
        child_type = g_file_info_get_attribute_uint32 (info,
                     G_FILE_ATTRIBUTE_STANDARD_TYPE);
        child_size = g_file_info_get_attribute_uint64 (info,
                     G_FILE_ATTRIBUTE_STANDARD_SIZE);

        if (child_type & G_FILE_TYPE_DIRECTORY) {
            flags |= XMMS_XFORM_BROWSE_FLAG_DIR;
        }

        xmms_xform_browse_add_entry (xform, child_name, flags);

        if (~child_type & G_FILE_TYPE_DIRECTORY) {
            xmms_xform_browse_add_entry_property_int (xform,
                    XMMS_MEDIALIB_ENTRY_PROPERTY_SIZE,
                    child_size);
        }

        g_object_unref (info);
    }

    g_file_enumerator_close (enumerator, NULL, NULL);

    return TRUE;
}
예제 #2
0
/**
 * Add a song to the browsing list.
 */
static void
daap_add_song_to_list (xmms_xform_t *xform, cc_item_record_t *song)
{
	gchar *songurl;

	songurl = g_strdup_printf ("%u.%s", song->dbid, song->song_format);
	xmms_xform_browse_add_entry (xform, songurl, 0);
	g_free (songurl);

	if (song->iname) {
		xmms_xform_browse_add_entry_property_str (xform, "title",
		                                          song->iname);
	}

	if (song->song_data_artist) {
		xmms_xform_browse_add_entry_property_str (xform, "artist",
		                                          song->song_data_artist);
	}

	if (song->song_data_album) {
		xmms_xform_browse_add_entry_property_str (xform, "album",
		                                          song->song_data_album);
	}

	xmms_xform_browse_add_entry_property_int (xform, "tracknr",
	                                          song->song_track_no);
}
예제 #3
0
void
xmms_xform_browse_add_symlink_args (xmms_xform_t *xform, const gchar *basename,
                                    const gchar *url, gint nargs, gchar **args)
{
	GString *s;
	gchar *eurl;
	gchar bname[32];
	gint i;

	if (!basename) {
		g_snprintf (bname, sizeof (bname), "%d", xform->browse_index++);
		basename = bname;
	}

	xmms_xform_browse_add_entry (xform, basename, 0);
	eurl = xmms_medialib_url_encode (url);
	s = g_string_new (eurl);

	for (i = 0; i < nargs; i++) {
		g_string_append_c (s, i == 0 ? '?' : '&');
		g_string_append (s, args[i]);
	}

	xmms_xform_browse_add_entry_property_str (xform, "realpath", s->str);

	g_free (eurl);
	g_string_free (s, TRUE);
}
예제 #4
0
static gboolean
xmms_daap_browse (xmms_xform_t *xform, const gchar *url, xmms_error_t *error)
{
	gboolean ret = FALSE;

	if (g_ascii_strcasecmp (url, "daap://") == 0) {

		GSList *sl = daap_mdns_get_server_list ();

		for (; sl; sl = g_slist_next (sl)) {
			daap_mdns_server_t *mdns_serv;
			gchar *str;

			mdns_serv = sl->data;

			str = g_strdup_printf ("%s:%d", mdns_serv->address,
			                       mdns_serv->port);
			xmms_xform_browse_add_entry (xform, str, XMMS_XFORM_BROWSE_FLAG_DIR);
			g_free (str);

			xmms_xform_browse_add_entry_property_str (xform, "servername",
			                                          mdns_serv->server_name);

			xmms_xform_browse_add_entry_property_str (xform, "ip",
			                                          mdns_serv->address);

			xmms_xform_browse_add_entry_property_str (xform, "name",
			                                          mdns_serv->mdns_hostname);

			xmms_xform_browse_add_entry_property_int (xform, "port",
			                                          mdns_serv->port);

			/* TODO implement the machinery to allow for this */
			// val = xmmsv_new_int (mdns_serv->need_auth);
			// xmms_xform_browse_add_entry_property (xform, "passworded", val);
			// val = xmmsv_new_int (mdns_serv->version);
			// xmms_xform_browse_add_entry_property (xform, "version", val);
		}

		ret = TRUE;

		g_slist_free (sl);
	} else {
		gchar *host;
		guint port;

		if (get_data_from_url (url, &host, &port, NULL, error)) {
			ret = daap_get_urls_from_server (xform, host, port, error);
			g_free (host);
		}
	}

	return ret;
}
예제 #5
0
gboolean
xmms_file_browse (xmms_xform_t *xform,
                  const gchar *url,
                  xmms_error_t *error)
{
	DIR *dir;
	struct dirent *d;
	int dir_fd;
	const gchar *tmp;
	struct stat st;

	tmp = url + 7;

	dir = opendir (tmp);
	if (!dir) {
		xmms_error_set (error, XMMS_ERROR_NOENT, strerror (errno));
		return FALSE;
	}

	dir_fd = dirfd (dir);

	while ((d = readdir (dir))) {
		guint32 flags = 0;
		const char *entry;
		int ret;

		entry = d->d_name;

		if (!strcmp (d->d_name, ".") || !strcmp (d->d_name, ".."))
			continue;

		ret = fstatat (dir_fd, d->d_name, &st, 0);
		if (ret) {
			continue;
		}

		if (S_ISDIR (st.st_mode)) {
			flags |= XMMS_XFORM_BROWSE_FLAG_DIR;
		}

		xmms_xform_browse_add_entry (xform, entry, flags);

		if (!S_ISDIR (st.st_mode)) {
			xmms_xform_browse_add_entry_property_int (xform, "size",
			                                          st.st_size);
		}
	}

	closedir (dir);

	return TRUE;
}
예제 #6
0
파일: gdir.c 프로젝트: dreamerc/xmms2
gboolean
xmms_file_browse (xmms_xform_t *xform,
                  const gchar *url,
                  xmms_error_t *error)
{
	GDir *dir;
	GError *err = NULL;
	const gchar *d, *tmp;
	struct stat st;

	tmp = url + 7;

	dir = g_dir_open (tmp, 0, &err);
	if (!dir) {
		xmms_error_set (error, XMMS_ERROR_NOENT, err->message);
		return FALSE;
	}

	while ((d = g_dir_read_name (dir))) {
		guint32 flags = 0;
		const char *entry;
		int ret;

		gchar *t = g_build_filename (tmp, d, NULL);

		ret = stat (t, &st);
		g_free (t);

		entry = d;

		if (ret) {
			continue;
		}

		if (S_ISDIR (st.st_mode)) {
			flags |= XMMS_XFORM_BROWSE_FLAG_DIR;
		}

		xmms_xform_browse_add_entry (xform, entry, flags);

		if (!S_ISDIR (st.st_mode)) {
			xmms_xform_browse_add_entry_property_int (xform, "size",
			                                          st.st_size);
		}
	}

	g_dir_close (dir);

	return TRUE;
}
예제 #7
0
static gboolean
xmms_samba_browse (xmms_xform_t *xform,
                   const gchar *url,
                   xmms_error_t *error)
{
	struct smbc_dirent *dir;
	int handle;

	G_LOCK (mutex);
	handle = smbc_opendir (url);
	G_UNLOCK (mutex);

	if (handle < 0) {
		xmms_error_set (error, XMMS_ERROR_GENERIC, "Couldn't browse URL");
		xmms_log_error ("Couldn't open directory %s!", url);
		return FALSE;
	}

	while (42) {
		guint32 flags = 0;

		G_LOCK (mutex);
		dir = smbc_readdir (handle);
		if (!dir) {
			G_UNLOCK (mutex);
			break;
		}

		if (dir->name[0] == '.') {
			G_UNLOCK (mutex);
			continue;
		}

		if (dir->smbc_type == SMBC_DIR ||
		    dir->smbc_type == SMBC_WORKGROUP ||
		    dir->smbc_type == SMBC_SERVER ||
		    dir->smbc_type == SMBC_FILE_SHARE)
			flags |= XMMS_XFORM_BROWSE_FLAG_DIR;

		xmms_xform_browse_add_entry (xform, dir->name, flags);
		G_UNLOCK (mutex);
	}

	G_LOCK (mutex);
	smbc_closedir (handle);
	G_UNLOCK (mutex);

	return TRUE;
}
예제 #8
0
파일: t_xform.c 프로젝트: chrippa/xmms2
static gboolean
xmms_test_browse_browse (xmms_xform_t *xform, const gchar *url, xmms_error_t *error)
{
	xmms_xform_browse_add_entry (xform, "file02.mp3", 0);
	xmms_xform_browse_add_entry_property_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SIZE, 2);
	xmms_xform_browse_add_entry (xform, "Directory1", XMMS_XFORM_BROWSE_FLAG_DIR);
	xmms_xform_browse_add_entry (xform, "file01.mp3", 0);
	xmms_xform_browse_add_entry_property_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SIZE, 1);
	xmms_xform_browse_add_entry (xform, "file03.mp3", 0);
	xmms_xform_browse_add_entry_property_int (xform, XMMS_MEDIALIB_ENTRY_PROPERTY_SIZE, 3);
	xmms_xform_browse_add_entry (xform, "Directory2", XMMS_XFORM_BROWSE_FLAG_DIR);
	xmms_xform_browse_add_entry (xform, "Last_Directory", XMMS_XFORM_BROWSE_FLAG_DIR);
	return TRUE;
}