static void grl_dpap_source_search (GrlSource *source, GrlSourceSearchSpec *ss) { GrlDpapSource *dmap_source = GRL_DPAP_SOURCE (source); ResultCbAndArgsAndDb *cb_and_db; DMAPMdnsBrowserService *service = dmap_source->priv->service; gchar *url = grl_dmap_build_url (service); cb_and_db = g_new (ResultCbAndArgsAndDb, 1); cb_and_db->cb.callback = ss->callback; cb_and_db->cb.source = ss->source; cb_and_db->cb.container = NULL; cb_and_db->cb.op_id = ss->operation_id; cb_and_db->cb.predicate = (GHRFunc) grl_dpap_match; cb_and_db->cb.predicate_data = ss->text; cb_and_db->cb.user_data = ss->user_data; if ((cb_and_db->db = g_hash_table_lookup (connections, url))) { /* Just call directly; already connected, already populated database */ search_connected_cb (NULL, TRUE, NULL, cb_and_db); } else { /* Connect */ cb_and_db->db = DMAP_DB (grl_dpap_db_new ()); grl_dpap_connect (service->name, service->host, service->port, cb_and_db, (DMAPConnectionCallback) search_connected_cb); g_hash_table_insert (connections, g_strdup (url), cb_and_db->db); } g_free (url); }
static void create_connection (const DMAPMdnsBrowserServiceType protocol, const char *name, const char *host, const guint port) { DMAPRecordFactory *factory; DMAPConnection *conn; DMAPDb *db; db = DMAP_DB (g_object_new (TYPE_DMAPD_DMAP_DB_GHASHTABLE, NULL)); if (db == NULL) { g_error ("Error creating DB"); } /* FIXME: switch on DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP, _DPAP, _DACP or _INVALID */ if (protocol == DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP) { factory = DMAP_RECORD_FACTORY (g_object_new (TYPE_DMAPD_DAAP_RECORD_FACTORY, NULL)); if (factory == NULL) { g_error ("Error creating record factory"); } conn = DMAP_CONNECTION (daap_connection_new (name, host, port, db, factory)); } else { factory = DMAP_RECORD_FACTORY (g_object_new (TYPE_DMAPD_DPAP_RECORD_FACTORY, NULL)); if (factory == NULL) { g_error ("Error creating record factory"); } conn = DMAP_CONNECTION (dpap_connection_new (name, host, port, db, factory)); } dmap_connection_connect (DMAP_CONNECTION (conn), (DMAPConnectionCallback) connected_cb, db); }
static void grl_dpap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DMAPConnectionCallback callback) { DMAPRecordFactory *factory; DMAPConnection *connection; factory = DMAP_RECORD_FACTORY (grl_dpap_record_factory_new ()); connection = DMAP_CONNECTION (dpap_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory)); dmap_connection_connect (connection, (DMAPConnectionCallback) callback, cb_and_db); }
static void dmap_connection_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { DMAPConnectionPrivate *priv = DMAP_CONNECTION (object)->priv; switch (prop_id) { case PROP_NAME: g_free (priv->name); priv->name = g_value_dup_string (value); break; case PROP_DB: priv->db = DMAP_DB (g_value_get_pointer (value)); break; case PROP_FACTORY: priv->record_factory = DMAP_RECORD_FACTORY (g_value_get_pointer (value)); break; case PROP_PASSWORD_PROTECTED: priv->password_protected = g_value_get_boolean (value); break; case PROP_HOST: g_free (priv->host); priv->host = g_value_dup_string (value); break; case PROP_PORT: priv->port = g_value_get_uint (value); break; case PROP_BASE_URI: priv->base_uri = g_value_get_pointer (value); break; case PROP_DATABASE_ID: priv->database_id = g_value_get_int (value); break; case PROP_SESSION_ID: priv->session_id = g_value_get_int (value); break; case PROP_DMAP_VERSION: priv->dmap_version = g_value_get_double (value); break; case PROP_REVISION_NUMBER: priv->revision_number = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static GObject* dmapd_dmap_db_ghashtable_constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params) { GObject *object; gchar *db_dir = NULL; DMAPRecordFactory *factory = NULL; object = G_OBJECT_CLASS (dmapd_dmap_db_ghashtable_parent_class)->constructor (type, n_construct_params, construct_params); g_object_get (object, "db-dir", &db_dir, "record-factory", &factory, NULL); /* NOTE: Don't load cache when used for DmapdDMAPContainerRecord: */ if (db_dir && factory) { load_cached_records (DMAP_DB (object), db_dir, factory); } g_free (db_dir); return object; }
static void create_share (RBShell *shell) { RhythmDB *rdb; DMAPDb *db; DMAPContainerDb *container_db; RBPlaylistManager *playlist_manager; char *name; char *password; gboolean require_password; g_assert (share == NULL); rb_debug ("initialize daap sharing"); name = eel_gconf_get_string (CONF_DAAP_SHARE_NAME); if (name == NULL || *name == '\0') { g_free (name); name = rb_daap_sharing_default_share_name (); } g_object_get (shell, "db", &rdb, "playlist-manager", &playlist_manager, NULL); db = DMAP_DB (rb_rhythmdb_dmap_db_adapter_new (rdb, RHYTHMDB_ENTRY_TYPE_SONG)); container_db = DMAP_CONTAINER_DB (rb_dmap_container_db_adapter_new (playlist_manager)); require_password = eel_gconf_get_boolean (CONF_DAAP_REQUIRE_PASSWORD); if (require_password) { password = eel_gconf_get_string (CONF_DAAP_SHARE_PASSWORD); } else { password = NULL; } share = daap_share_new (name, password, db, container_db, NULL); g_object_unref (db); g_object_unref (container_db); g_object_unref (rdb); g_object_unref (playlist_manager); g_free (name); g_free (password); }
static void load_cached_records (DMAPDb *db, const gchar *db_dir, DMAPRecordFactory *factory) { GDir *d; GError *error = NULL; d = g_dir_open (db_dir, 0, &error); if (error != NULL) { g_warning ("%s", error->message); } else { if (db_dir) { const gchar *entry; while ((entry = g_dir_read_name (d))) { gchar *path = g_strdup_printf ("%s/%s", db_dir, entry); if (g_file_test (path, G_FILE_TEST_IS_REGULAR) && g_str_has_suffix (path, ".record")) { GByteArray *blob = cache_read (path); if (blob) { g_debug ("Adding cache: %s", path); DMAPRecord *record = dmap_record_factory_create (factory, NULL); if (NULL != record) { if (dmap_record_set_from_blob (record, blob)) { dmap_db_add (DMAP_DB (db), record); } else { g_warning ("Removing stale cache entry %s\n", path); g_unlink (path); } g_object_unref (record); } g_byte_array_free (blob, TRUE); } } g_free (path); } } g_dir_close (d); } }
static void grl_dpap_source_browse (GrlSource *source, GrlSourceBrowseSpec *bs) { GrlDpapSource *dmap_source = GRL_DPAP_SOURCE (source); gchar *url = grl_dmap_build_url (dmap_source->priv->service); GRL_DEBUG (__func__); ResultCbAndArgsAndDb *cb_and_db; cb_and_db = g_new (ResultCbAndArgsAndDb, 1); cb_and_db->cb.callback = bs->callback; cb_and_db->cb.source = bs->source; cb_and_db->cb.container = bs->container; cb_and_db->cb.op_id = bs->operation_id; cb_and_db->cb.skip = grl_operation_options_get_skip (bs->options); cb_and_db->cb.count = grl_operation_options_get_count (bs->options); cb_and_db->cb.user_data = bs->user_data; if ((cb_and_db->db = g_hash_table_lookup (connections, url))) { /* Just call directly; already connected, already populated database. */ browse_connected_cb (NULL, TRUE, NULL, cb_and_db); } else { /* Connect */ cb_and_db->db = DMAP_DB (grl_dpap_db_new ()); grl_dpap_connect (dmap_source->priv->service->name, dmap_source->priv->service->host, dmap_source->priv->service->port, cb_and_db, (DMAPConnectionCallback) browse_connected_cb); g_hash_table_insert (connections, g_strdup (url), cb_and_db->db); } g_free (url); }