void rhythmdb_monitor_uri_path (RhythmDB *db, const char *uri, GError **error) { GFile *directory; if (rb_uri_is_directory (uri)) { char *dir; if (g_str_has_suffix(uri, G_DIR_SEPARATOR_S)) { dir = g_strdup (uri); } else { dir = g_strconcat (uri, G_DIR_SEPARATOR_S, NULL); } directory = g_file_new_for_uri (dir); g_free (dir); } else { GFile *file; file = g_file_new_for_uri (uri); directory = g_file_get_parent (file); g_object_unref (file); } actually_add_monitor (db, directory, error); g_object_unref (directory); }
/** * rb_static_playlist_source_add_location: * @source: an #RBStaticPlaylistSource * @location: location (URI) to add to the playlist * @index: position at which to add the location (-1 to add at the end) * * If the location matches an entry in the database, the entry is added * to the playlist. Otherwise, if it identifies a directory, the contents * of that directory are added. */ void rb_static_playlist_source_add_location (RBStaticPlaylistSource *source, const char *location, gint index) { RhythmDB *db; RhythmDBEntry *entry; db = rb_playlist_source_get_db (RB_PLAYLIST_SOURCE (source)); entry = rhythmdb_entry_lookup_by_location (db, location); /* if there is an entry, it won't be a directory */ if (entry == NULL && rb_uri_is_directory (location)) rb_uri_handle_recursively (location, NULL, (RBUriRecurseFunc) _add_location_cb, source); else rb_static_playlist_source_add_location_internal (source, location, index); }
static void rhythmdb_directory_change_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, RhythmDB *db) { char *canon_uri; char *other_canon_uri = NULL; RhythmDBEntry *entry; canon_uri = g_file_get_uri (file); if (other_file != NULL) { other_canon_uri = g_file_get_uri (other_file); } rb_debug ("directory event %d for %s", event_type, canon_uri); switch (event_type) { case G_FILE_MONITOR_EVENT_CREATED: { gboolean in_library = FALSE; int i; if (!g_settings_get_boolean (db->priv->settings, "monitor-library")) break; if (rb_uri_is_hidden (canon_uri)) break; /* ignore new files outside of the library locations */ for (i = 0; db->priv->library_locations[i] != NULL; i++) { if (g_str_has_prefix (canon_uri, db->priv->library_locations[i])) { in_library = TRUE; break; } } if (!in_library) break; } /* process directories immediately */ if (rb_uri_is_directory (canon_uri)) { actually_add_monitor (db, file, NULL); rhythmdb_add_uri (db, canon_uri); } else { add_changed_file (db, canon_uri); } break; case G_FILE_MONITOR_EVENT_CHANGED: case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: if (rhythmdb_entry_lookup_by_location (db, canon_uri)) { add_changed_file (db, canon_uri); } break; case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: /* hmm.. */ break; case G_FILE_MONITOR_EVENT_DELETED: entry = rhythmdb_entry_lookup_by_location (db, canon_uri); if (entry != NULL) { g_hash_table_remove (db->priv->changed_files, entry->location); rhythmdb_entry_set_visibility (db, entry, FALSE); rhythmdb_commit (db); } break; case G_FILE_MONITOR_EVENT_MOVED: if (other_canon_uri == NULL) { break; } entry = rhythmdb_entry_lookup_by_location (db, other_canon_uri); if (entry != NULL) { rb_debug ("file move target %s already exists in database", other_canon_uri); entry = rhythmdb_entry_lookup_by_location (db, canon_uri); if (entry != NULL) { g_hash_table_remove (db->priv->changed_files, entry->location); rhythmdb_entry_set_visibility (db, entry, FALSE); rhythmdb_commit (db); } } else { entry = rhythmdb_entry_lookup_by_location (db, canon_uri); if (entry != NULL) { GValue v = {0,}; g_value_init (&v, G_TYPE_STRING); g_value_set_string (&v, other_canon_uri); rhythmdb_entry_set_internal (db, entry, TRUE, RHYTHMDB_PROP_LOCATION, &v); g_value_unset (&v); } } break; case G_FILE_MONITOR_EVENT_PRE_UNMOUNT: case G_FILE_MONITOR_EVENT_UNMOUNTED: default: break; } g_free (canon_uri); g_free (other_canon_uri); }