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; }
/** * 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); }
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); }
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; }
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; }
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; }
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; }
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; }