[libdmapsharing] Clean up code related to dynamically-allocated properties
- From: W. Michael Petullo <wmpetullo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libdmapsharing] Clean up code related to dynamically-allocated properties
- Date: Thu, 16 Nov 2017 22:25:18 +0000 (UTC)
commit 0e2077b2f811b125f5dfacce8c70ebf2a99596b7
Author: W. Michael Petullo <mike flyn org>
Date: Thu Nov 16 17:25:06 2017 -0500
Clean up code related to dynamically-allocated properties
Signed-off-by: W. Michael Petullo <mike flyn org>
libdmapsharing/dacp-share.c | 333 ++++++------
libdmapsharing/dmap-connection.c | 861 +++++++++++++---------------
libdmapsharing/dmap-mdns-publisher-avahi.c | 5 -
libdmapsharing/dmap-mdns-service.c | 15 +-
libdmapsharing/dmap-share.c | 27 +-
libdmapsharing/dpap-share.c | 9 +-
libdmapsharing/test-daap-record.c | 3 +
7 files changed, 606 insertions(+), 647 deletions(-)
---
diff --git a/libdmapsharing/dacp-share.c b/libdmapsharing/dacp-share.c
index 3ff1f8d..094e3fa 100644
--- a/libdmapsharing/dacp-share.c
+++ b/libdmapsharing/dacp-share.c
@@ -46,15 +46,6 @@
#include <libdmapsharing/dacp-connection.h>
#include <libdmapsharing/dacp-player.h>
-static void dacp_share_set_property (GObject * object,
- guint prop_id,
- const GValue * value,
- GParamSpec * pspec);
-static void dacp_share_get_property (GObject * object,
- guint prop_id,
- GValue * value, GParamSpec * pspec);
-static void dacp_share_dispose (GObject * object);
-const char *dacp_share_get_type_of_service (DMAPShare * share);
void dacp_share_ctrl_int (DMAPShare * share,
SoupServer * server,
SoupMessage * message,
@@ -66,12 +57,6 @@ void dacp_share_login (DMAPShare * share,
const char *path,
GHashTable * query, SoupClientContext * context);
-static gchar *dacp_share_pairing_code (DACPShare * share, gchar * pair_txt,
- gchar passcode[4]);
-static void dacp_share_send_playstatusupdate (DACPShare * share);
-static void dacp_share_fill_playstatusupdate (DACPShare * share,
- SoupMessage * message);
-
#define DACP_TYPE_OF_SERVICE "_touch-able._tcp"
#define DACP_PORT 3689
@@ -125,6 +110,133 @@ static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE (DACPShare, dacp_share, DAAP_TYPE_SHARE);
+static gchar *
+get_dbid (void)
+{
+ static gchar *dbid;
+
+ if (!dbid) {
+ GString *name;
+
+ // Creates a service name 14 characters long concatenating the hostname
+ // hash hex value with itself.
+ // Idea taken from stereo.
+ name = g_string_new (NULL);
+ g_string_printf (name, "%.8x",
+ g_str_hash (g_get_host_name ()));
+ g_string_ascii_up (name);
+ g_string_append_len (name, name->str, 4);
+
+ dbid = name->str;
+
+ g_string_free (name, FALSE);
+ }
+ return dbid;
+}
+
+static void
+dacp_share_update_txt_records (DACPShare * share)
+{
+ gchar *dbid_record;
+ gchar *library_name_record;
+
+ library_name_record =
+ g_strdup_printf ("CtlN=%s", share->priv->library_name);
+ dbid_record = g_strdup_printf ("DbId=%s", get_dbid ());
+
+ gchar *txt_records[] = { "Ver=131073",
+ "DvSv=2049",
+ dbid_record,
+ "DvTy=iTunes",
+ "OSsi=0x1F6",
+ "txtvers=1",
+ library_name_record,
+ NULL
+ };
+
+ g_object_set (share, "txt-records", txt_records, NULL);
+
+ g_free (dbid_record);
+ g_free (library_name_record);
+}
+
+static void
+dacp_share_set_property (GObject * object,
+ guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ DACPShare *share = DACP_SHARE (object);
+
+ switch (prop_id) {
+ case PROP_LIBRARY_NAME:
+ g_free (share->priv->library_name);
+ share->priv->library_name = g_value_dup_string (value);
+ dacp_share_update_txt_records (share);
+ break;
+ case PROP_PLAYER:
+ if (share->priv->player) {
+ g_object_unref (share->priv->player);
+ }
+ share->priv->player = DACP_PLAYER (g_value_dup_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+dacp_share_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ DACPShare *share = DACP_SHARE (object);
+
+ switch (prop_id) {
+ case PROP_LIBRARY_NAME:
+ g_value_set_string (value, share->priv->library_name);
+ break;
+ case PROP_PLAYER:
+ g_value_set_object (value, G_OBJECT (share->priv->player));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+dacp_share_dispose (GObject * object)
+{
+ DACPShare *share = DACP_SHARE (object);
+
+ g_clear_object(&share->priv->mdns_browser);
+ g_clear_object(&share->priv->player);
+
+ if (NULL != share->priv->update_queue) {
+ g_slist_free_full (share->priv->update_queue, g_object_unref);
+ share->priv->update_queue = NULL;
+ }
+
+ if (NULL != share->priv->remotes) {
+ g_hash_table_destroy (share->priv->remotes);
+ share->priv->remotes = NULL;
+ }
+}
+
+static void
+dacp_share_finalize (GObject * object)
+{
+ DACPShare *share = DACP_SHARE (object);
+
+ g_free (share->priv->library_name);
+}
+
+const char *
+dacp_share_get_type_of_service (DMAPShare * share)
+{
+ return DACP_TYPE_OF_SERVICE;
+}
+
static void
dacp_share_class_init (DACPShareClass * klass)
{
@@ -134,6 +246,7 @@ dacp_share_class_init (DACPShareClass * klass)
object_class->get_property = dacp_share_get_property;
object_class->set_property = dacp_share_set_property;
object_class->dispose = dacp_share_dispose;
+ object_class->finalize = dacp_share_finalize;
dmap_class->get_type_of_service = dacp_share_get_type_of_service;
dmap_class->ctrl_int = dacp_share_ctrl_int;
@@ -270,118 +383,6 @@ dacp_share_init (DACPShare * share)
g_free);
}
-static gchar *
-get_dbid (void)
-{
- static gchar *dbid;
-
- if (!dbid) {
- GString *name;
-
- // Creates a service name 14 characters long concatenating the hostname
- // hash hex value with itself.
- // Idea taken from stereo.
- name = g_string_new (NULL);
- g_string_printf (name, "%.8x",
- g_str_hash (g_get_host_name ()));
- g_string_ascii_up (name);
- g_string_append_len (name, name->str, 4);
-
- dbid = name->str;
-
- g_string_free (name, FALSE);
- }
- return dbid;
-}
-
-static void
-dacp_share_update_txt_records (DACPShare * share)
-{
- gchar *dbid_record;
- gchar *library_name_record;
-
- library_name_record =
- g_strdup_printf ("CtlN=%s", share->priv->library_name);
- dbid_record = g_strdup_printf ("DbId=%s", get_dbid ());
-
- gchar *txt_records[] = { "Ver=131073",
- "DvSv=2049",
- dbid_record,
- "DvTy=iTunes",
- "OSsi=0x1F6",
- "txtvers=1",
- library_name_record,
- NULL
- };
-
- g_object_set (share, "txt-records", txt_records, NULL);
-
- g_free (dbid_record);
- g_free (library_name_record);
-}
-
-static void
-dacp_share_set_property (GObject * object,
- guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- DACPShare *share = DACP_SHARE (object);
-
- switch (prop_id) {
- case PROP_LIBRARY_NAME:
- g_free (share->priv->library_name);
- share->priv->library_name = g_value_dup_string (value);
- dacp_share_update_txt_records (share);
- break;
- case PROP_PLAYER:
- if (share->priv->player)
- g_object_unref (share->priv->player);
- share->priv->player =
- DACP_PLAYER (g_value_dup_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-dacp_share_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec)
-{
- DACPShare *share = DACP_SHARE (object);
-
- switch (prop_id) {
- case PROP_LIBRARY_NAME:
- g_value_set_string (value, share->priv->library_name);
- break;
- case PROP_PLAYER:
- g_value_set_object (value, G_OBJECT (share->priv->player));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-dacp_share_dispose (GObject * object)
-{
- DACPShare *share = DACP_SHARE (object);
-
- g_free (share->priv->library_name);
-
- if (share->priv->mdns_browser)
- g_object_unref (share->priv->mdns_browser);
-
- if (share->priv->player)
- g_object_unref (share->priv->player);
-
- g_slist_free (share->priv->update_queue);
-
- g_hash_table_destroy (share->priv->remotes);
-}
-
void
mdns_remote_added (DMAPMdnsBrowser * browser,
DMAPMdnsService * service, DACPShare * share)
@@ -512,48 +513,6 @@ dacp_share_stop_lookup (DACPShare * share)
share->priv->mdns_browser = NULL;
}
-const char *
-dacp_share_get_type_of_service (DMAPShare * share)
-{
- return DACP_TYPE_OF_SERVICE;
-}
-
-void
-dacp_share_player_updated (DACPShare * share)
-{
- share->priv->current_revision++;
- dacp_share_send_playstatusupdate (share);
-}
-
-static void
-status_update_message_finished (SoupMessage * message, DACPShare * share)
-{
- share->priv->update_queue =
- g_slist_remove (share->priv->update_queue, message);
- g_object_unref (message);
-}
-
-static void
-dacp_share_send_playstatusupdate (DACPShare * share)
-{
- GSList *list;
- SoupServer *server = NULL;
-
- g_object_get (share, "server", &server, NULL);
- if (server) {
- for (list = share->priv->update_queue; list;
- list = list->next) {
- dacp_share_fill_playstatusupdate (share,
- (SoupMessage*) list->data);
- soup_server_unpause_message (server,
- (SoupMessage*) list->data);
- }
- g_object_unref (server);
- }
- g_slist_free (share->priv->update_queue);
- share->priv->update_queue = NULL;
-}
-
static void
dacp_share_fill_playstatusupdate (DACPShare * share, SoupMessage * message)
{
@@ -624,6 +583,42 @@ dacp_share_fill_playstatusupdate (DACPShare * share, SoupMessage * message)
}
static void
+dacp_share_send_playstatusupdate (DACPShare * share)
+{
+ GSList *list;
+ SoupServer *server = NULL;
+
+ g_object_get (share, "server", &server, NULL);
+ if (server) {
+ for (list = share->priv->update_queue; list;
+ list = list->next) {
+ dacp_share_fill_playstatusupdate (share,
+ (SoupMessage*) list->data);
+ soup_server_unpause_message (server,
+ (SoupMessage*) list->data);
+ }
+ g_object_unref (server);
+ }
+ g_slist_free (share->priv->update_queue);
+ share->priv->update_queue = NULL;
+}
+
+void
+dacp_share_player_updated (DACPShare * share)
+{
+ share->priv->current_revision++;
+ dacp_share_send_playstatusupdate (share);
+}
+
+static void
+status_update_message_finished (SoupMessage * message, DACPShare * share)
+{
+ share->priv->update_queue =
+ g_slist_remove (share->priv->update_queue, message);
+ g_object_unref (message);
+}
+
+static void
debug_param (gpointer key, gpointer val, gpointer user_data)
{
g_debug ("%s %s", (char *) key, (char *) val);
diff --git a/libdmapsharing/dmap-connection.c b/libdmapsharing/dmap-connection.c
index c974ee3..7accf37 100644
--- a/libdmapsharing/dmap-connection.c
+++ b/libdmapsharing/dmap-connection.c
@@ -39,20 +39,7 @@
#define ITUNES_7_SERVER "iTunes/7"
-static void dmap_connection_dispose (GObject * obj);
-static void dmap_connection_set_property (GObject * object,
- guint prop_id,
- const GValue * value,
- GParamSpec * pspec);
-static void dmap_connection_get_property (GObject * object,
- guint prop_id,
- GValue * value, GParamSpec * pspec);
-
static gboolean dmap_connection_do_something (DMAPConnection * connection);
-static void dmap_connection_state_done (DMAPConnection * connection,
- gboolean result);
-
-static gboolean emit_progress_idle (DMAPConnection * connection);
G_DEFINE_TYPE (DMAPConnection, dmap_connection, G_TYPE_OBJECT);
#define DMAP_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DMAP_TYPE_CONNECTION,
DMAPConnectionPrivate))
@@ -128,8 +115,76 @@ enum
static guint signals[LAST_SIGNAL] = { 0, };
static void
+dmap_connection_dispose (GObject * object)
+{
+ DMAPConnectionPrivate *priv = DMAP_CONNECTION (object)->priv;
+ GSList *l;
+
+ g_debug ("DAAP connection dispose");
+
+ if (priv->emit_progress_id != 0) {
+ g_source_remove (priv->emit_progress_id);
+ priv->emit_progress_id = 0;
+ }
+
+ if (priv->do_something_id != 0) {
+ g_source_remove (priv->do_something_id);
+ priv->do_something_id = 0;
+ }
+
+ if (priv->playlists) {
+ for (l = priv->playlists; l; l = l->next) {
+ DMAPPlaylist *playlist = l->data;
+
+ /* FIXME: refstring: */
+ g_list_foreach (playlist->uris, (GFunc) g_free, NULL);
+ g_list_free (playlist->uris);
+ g_free (playlist->name);
+ g_free (playlist);
+ l->data = NULL;
+ }
+ g_slist_free (priv->playlists);
+ priv->playlists = NULL;
+ }
+
+ if (priv->item_id_to_uri) {
+ g_hash_table_destroy (priv->item_id_to_uri);
+ priv->item_id_to_uri = NULL;
+ }
+
+ if (priv->session) {
+ g_debug ("Aborting all pending requests");
+ soup_session_abort (priv->session);
+ g_object_unref (G_OBJECT (priv->session));
+ priv->session = NULL;
+ }
+
+ if (priv->base_uri) {
+ soup_uri_free (priv->base_uri);
+ priv->base_uri = NULL;
+ }
+
+ if (priv->daap_base_uri) {
+ g_free (priv->daap_base_uri);
+ priv->daap_base_uri = NULL;
+ }
+
+ g_clear_object(&priv->db);
+ g_clear_object(&priv->record_factory);
+
+ if (priv->last_error_message != NULL) {
+ g_free (priv->last_error_message);
+ priv->last_error_message = NULL;
+ }
+
+ G_OBJECT_CLASS (dmap_connection_parent_class)->dispose (object);
+}
+
+static void
dmap_connection_finalize (GObject * object)
{
+ g_debug ("Finalize");
+
DMAPConnection *connection;
g_return_if_fail (object != NULL);
@@ -139,12 +194,126 @@ dmap_connection_finalize (GObject * object)
g_return_if_fail (connection->priv != NULL);
- g_debug ("Finalize");
+ g_free (connection->priv->name);
+ g_free (connection->priv->username);
+ g_free (connection->priv->password);
+ g_free (connection->priv->host);
G_OBJECT_CLASS (dmap_connection_parent_class)->finalize (object);
}
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:
+ if (priv->db) {
+ g_object_unref(priv->db);
+ }
+ priv->db = DMAP_DB (g_value_dup_object (value));
+ break;
+ case PROP_FACTORY:
+ if (priv->record_factory) {
+ g_object_unref(priv->record_factory);
+ }
+ priv->record_factory =
+ DMAP_RECORD_FACTORY (g_value_dup_object (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:
+ if (priv->base_uri) {
+ soup_uri_free (priv->base_uri);
+ }
+ priv->base_uri = g_value_get_boxed (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;
+ case PROP_USERNAME:
+ g_free(priv->username);
+ priv->username = g_value_dup_string (value);
+ break;
+ case PROP_PASSWORD:
+ g_free(priv->password);
+ priv->password = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+dmap_connection_get_property (GObject * object,
+ guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ DMAPConnectionPrivate *priv = DMAP_CONNECTION (object)->priv;
+
+ switch (prop_id) {
+ case PROP_DB:
+ g_value_set_object (value, priv->db);
+ break;
+ case PROP_FACTORY:
+ g_value_set_object (value, priv->record_factory);
+ break;
+ case PROP_NAME:
+ g_value_set_string (value, priv->name);
+ break;
+ case PROP_HOST:
+ g_value_set_string (value, priv->host);
+ break;
+ case PROP_PORT:
+ g_value_set_uint (value, priv->port);
+ break;
+ case PROP_BASE_URI:
+ g_value_set_boxed (value, priv->base_uri);
+ break;
+ case PROP_DATABASE_ID:
+ g_value_set_int (value, priv->database_id);
+ break;
+ case PROP_SESSION_ID:
+ g_value_set_int (value, priv->session_id);
+ break;
+ case PROP_DMAP_VERSION:
+ g_value_set_double (value, priv->dmap_version);
+ break;
+ case PROP_REVISION_NUMBER:
+ g_value_set_int (value, priv->revision_number);
+ break;
+ case PROP_USERNAME:
+ g_value_set_string (value, priv->username);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
dmap_connection_class_init (DMAPConnectionClass * klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -153,8 +322,8 @@ dmap_connection_class_init (DMAPConnectionClass * klass)
klass->get_query_metadata = NULL;
klass->handle_mlcl = NULL;
- object_class->finalize = dmap_connection_finalize;
object_class->dispose = dmap_connection_dispose;
+ object_class->finalize = dmap_connection_finalize;
object_class->set_property = dmap_connection_set_property;
object_class->get_property = dmap_connection_get_property;
@@ -425,6 +594,19 @@ typedef struct
gpointer user_data;
} DAAPResponseData;
+static gboolean
+emit_progress_idle (DMAPConnection * connection)
+{
+ g_debug ("Emitting progress");
+
+ // FIXME: GDK_THREADS_ENTER ();
+ g_signal_emit (G_OBJECT (connection), signals[CONNECTING], 0,
+ connection->priv->state, connection->priv->progress);
+ connection->priv->emit_progress_id = 0;
+ // FIXME: GDK_THREADS_LEAVE ();
+ return FALSE;
+}
+
static void
actual_http_response_handler (DAAPResponseData * data)
{
@@ -703,17 +885,65 @@ dmap_connection_get (DMAPConnection * self,
(DMAPResponseHandler) handler, user_data, FALSE);
}
-static gboolean
-emit_progress_idle (DMAPConnection * connection)
+static void
+dmap_connection_state_done (DMAPConnection * connection, gboolean result)
{
- g_debug ("Emitting progress");
+ DMAPConnectionPrivate *priv = connection->priv;
- // FIXME: GDK_THREADS_ENTER ();
- g_signal_emit (G_OBJECT (connection), signals[CONNECTING], 0,
- connection->priv->state, connection->priv->progress);
- connection->priv->emit_progress_id = 0;
- // FIXME: GDK_THREADS_LEAVE ();
- return FALSE;
+ g_debug ("Transitioning to next state from %d", priv->state);
+
+ if (result == FALSE) {
+ priv->state = DMAP_DONE;
+ priv->result = FALSE;
+ } else {
+ switch (priv->state) {
+ case DMAP_GET_PLAYLISTS:
+ if (priv->playlists == NULL)
+ priv->state = DMAP_DONE;
+ else
+ priv->state = DMAP_GET_PLAYLIST_ENTRIES;
+ break;
+ case DMAP_GET_PLAYLIST_ENTRIES:
+ /* keep reading playlists until we've got them all */
+ if (++priv->reading_playlist >=
+ g_slist_length (priv->playlists))
+ priv->state = DMAP_DONE;
+ break;
+
+ case DMAP_LOGOUT:
+ priv->state = DMAP_DONE;
+ break;
+
+ case DMAP_DONE:
+ /* uhh.. */
+ g_debug ("This should never happen.");
+ break;
+
+ default:
+ /* in most states, we just move on to the next */
+ if (priv->state > DMAP_DONE) {
+ g_debug ("This should REALLY never happen.");
+ return;
+ }
+ priv->state++;
+ break;
+ }
+
+ priv->progress = 1.0f;
+ if (connection->priv->emit_progress_id != 0) {
+ g_source_remove (connection->priv->emit_progress_id);
+ }
+ connection->priv->emit_progress_id =
+ g_idle_add ((GSourceFunc) emit_progress_idle,
+ connection);
+ }
+
+ if (priv->do_something_id != 0) {
+ g_source_remove (priv->do_something_id);
+ }
+ priv->do_something_id =
+ g_idle_add ((GSourceFunc) dmap_connection_do_something,
+ connection);
}
static void
@@ -1126,6 +1356,166 @@ handle_logout (DMAPConnection * connection,
dmap_connection_state_done (connection, TRUE);
}
+static void
+dmap_connection_finish (DMAPConnection * connection)
+{
+ g_return_if_fail (IS_DMAP_CONNECTION (connection));
+
+ g_debug ("DAAP finish");
+ connection->priv->state = DMAP_DONE;
+ connection->priv->progress = 1.0f;
+
+ connection_operation_done (connection);
+}
+
+static gboolean
+dmap_connection_do_something (DMAPConnection * connection)
+{
+ DMAPConnectionPrivate *priv = connection->priv;
+ char *meta;
+ char *path;
+
+ g_debug ("Doing something for state: %d", priv->state);
+
+ priv->do_something_id = 0;
+
+ switch (priv->state) {
+ case DMAP_GET_INFO:
+ g_debug ("Getting DAAP server info");
+ if (!http_get
+ (connection, "/server-info", FALSE, 0.0, 0, FALSE,
+ (DMAPResponseHandler) handle_server_info, NULL, FALSE)) {
+ g_debug ("Could not get DAAP connection info");
+ dmap_connection_state_done (connection, FALSE);
+ }
+ break;
+
+ case DMAP_LOGIN:
+ // NOTE: libsoup will signal if password required and not present.
+ g_debug ("Logging into DAAP server");
+ if (!http_get (connection, "/login", FALSE, 0.0, 0, FALSE,
+ (DMAPResponseHandler) handle_login, NULL,
+ FALSE)) {
+ g_debug ("Could not login to DAAP server");
+ dmap_connection_state_done (connection, FALSE);
+ }
+
+ break;
+
+ case DMAP_GET_REVISION_NUMBER:
+ g_debug ("Getting DAAP server database revision number");
+ path = g_strdup_printf
+ ("/update?session-id=%u&revision-number=1",
+ priv->session_id);
+ if (!http_get
+ (connection, path, TRUE, priv->dmap_version, 0, FALSE,
+ (DMAPResponseHandler) handle_update, NULL, FALSE)) {
+ g_debug ("Could not get server database revision number");
+ dmap_connection_state_done (connection, FALSE);
+ }
+ g_free (path);
+ break;
+
+ case DMAP_GET_DB_INFO:
+ g_debug ("Getting DAAP database info");
+ path = g_strdup_printf
+ ("/databases?session-id=%u&revision-number=%d",
+ priv->session_id, priv->revision_number);
+ if (!http_get
+ (connection, path, TRUE, priv->dmap_version, 0, FALSE,
+ (DMAPResponseHandler) handle_database_info, NULL,
+ FALSE)) {
+ g_debug ("Could not get DAAP database info");
+ dmap_connection_state_done (connection, FALSE);
+ }
+ g_free (path);
+ break;
+
+ case DMAP_GET_SONGS:
+ g_debug ("Getting DAAP song listing");
+ meta = DMAP_CONNECTION_GET_CLASS
+ (connection)->get_query_metadata (connection);
+ path = g_strdup_printf
+ ("/databases/%i/items?session-id=%u&revision-number=%i"
+ "&meta=%s", priv->database_id, priv->session_id,
+ priv->revision_number, meta);
+ if (!http_get
+ (connection, path, TRUE, priv->dmap_version, 0, FALSE,
+ (DMAPResponseHandler) handle_song_listing, NULL, TRUE)) {
+ g_debug ("Could not get DAAP song listing");
+ dmap_connection_state_done (connection, FALSE);
+ }
+ g_free (path);
+ g_free (meta);
+ break;
+
+ case DMAP_GET_PLAYLISTS:
+ g_debug ("Getting DAAP playlists");
+ path = g_strdup_printf
+ ("/databases/%d/containers?session-id=%u&revision-number=%d",
+ priv->database_id, priv->session_id,
+ priv->revision_number);
+ if (!http_get
+ (connection, path, TRUE, priv->dmap_version, 0, FALSE,
+ (DMAPResponseHandler) handle_playlists, NULL, TRUE)) {
+ g_debug ("Could not get DAAP playlists");
+ dmap_connection_state_done (connection, FALSE);
+ }
+ g_free (path);
+ break;
+
+ case DMAP_GET_PLAYLIST_ENTRIES:
+ {
+ DMAPPlaylist *playlist =
+ (DMAPPlaylist *)
+ g_slist_nth_data (priv->playlists,
+ priv->reading_playlist);
+
+ g_assert (playlist);
+ g_debug ("Reading DAAP playlist %d entries",
+ priv->reading_playlist);
+ path = g_strdup_printf
+
("/databases/%d/containers/%d/items?session-id=%u&revision-number=%d&meta=dmap.itemid",
+ priv->database_id, playlist->id,
+ priv->session_id, priv->revision_number);
+ if (!http_get
+ (connection, path, TRUE, priv->dmap_version, 0,
+ FALSE,
+ (DMAPResponseHandler) handle_playlist_entries,
+ NULL, TRUE)) {
+ g_debug ("Could not get entries for DAAP playlist %d",
priv->reading_playlist);
+ dmap_connection_state_done (connection,
+ FALSE);
+ }
+ g_free (path);
+ }
+ break;
+
+ case DMAP_LOGOUT:
+ g_debug ("Logging out of DAAP server");
+ path = g_strdup_printf ("/logout?session-id=%u",
+ priv->session_id);
+ if (!http_get
+ (connection, path, TRUE, priv->dmap_version, 0, FALSE,
+ (DMAPResponseHandler) handle_logout, NULL, FALSE)) {
+ g_debug ("Could not log out of DAAP server");
+ dmap_connection_state_done (connection, FALSE);
+ }
+
+ g_free (path);
+ break;
+
+ case DMAP_DONE:
+ g_debug ("DAAP done");
+
+ dmap_connection_finish (connection);
+
+ break;
+ }
+
+ return FALSE;
+}
+
gboolean
dmap_connection_is_connected (DMAPConnection * connection)
{
@@ -1303,18 +1693,6 @@ disconnected_cb (DMAPConnection * connection, ConnectionResponseData * rdata)
}
}
-static void
-dmap_connection_finish (DMAPConnection * connection)
-{
- g_return_if_fail (IS_DMAP_CONNECTION (connection));
-
- g_debug ("DAAP finish");
- connection->priv->state = DMAP_DONE;
- connection->priv->progress = 1.0f;
-
- connection_operation_done (connection);
-}
-
void
dmap_connection_disconnect (DMAPConnection * connection,
DMAPConnectionFunc callback,
@@ -1364,215 +1742,6 @@ dmap_connection_disconnect (DMAPConnection * connection,
}
}
-static void
-dmap_connection_state_done (DMAPConnection * connection, gboolean result)
-{
- DMAPConnectionPrivate *priv = connection->priv;
-
- g_debug ("Transitioning to next state from %d", priv->state);
-
- if (result == FALSE) {
- priv->state = DMAP_DONE;
- priv->result = FALSE;
- } else {
- switch (priv->state) {
- case DMAP_GET_PLAYLISTS:
- if (priv->playlists == NULL)
- priv->state = DMAP_DONE;
- else
- priv->state = DMAP_GET_PLAYLIST_ENTRIES;
- break;
- case DMAP_GET_PLAYLIST_ENTRIES:
- /* keep reading playlists until we've got them all */
- if (++priv->reading_playlist >=
- g_slist_length (priv->playlists))
- priv->state = DMAP_DONE;
- break;
-
- case DMAP_LOGOUT:
- priv->state = DMAP_DONE;
- break;
-
- case DMAP_DONE:
- /* uhh.. */
- g_debug ("This should never happen.");
- break;
-
- default:
- /* in most states, we just move on to the next */
- if (priv->state > DMAP_DONE) {
- g_debug ("This should REALLY never happen.");
- return;
- }
- priv->state++;
- break;
- }
-
- priv->progress = 1.0f;
- if (connection->priv->emit_progress_id != 0) {
- g_source_remove (connection->priv->emit_progress_id);
- }
- connection->priv->emit_progress_id =
- g_idle_add ((GSourceFunc) emit_progress_idle,
- connection);
- }
-
- if (priv->do_something_id != 0) {
- g_source_remove (priv->do_something_id);
- }
- priv->do_something_id =
- g_idle_add ((GSourceFunc) dmap_connection_do_something,
- connection);
-}
-
-static gboolean
-dmap_connection_do_something (DMAPConnection * connection)
-{
- DMAPConnectionPrivate *priv = connection->priv;
- char *meta;
- char *path;
-
- g_debug ("Doing something for state: %d", priv->state);
-
- priv->do_something_id = 0;
-
- switch (priv->state) {
- case DMAP_GET_INFO:
- g_debug ("Getting DAAP server info");
- if (!http_get
- (connection, "/server-info", FALSE, 0.0, 0, FALSE,
- (DMAPResponseHandler) handle_server_info, NULL, FALSE)) {
- g_debug ("Could not get DAAP connection info");
- dmap_connection_state_done (connection, FALSE);
- }
- break;
-
- case DMAP_LOGIN:
- // NOTE: libsoup will signal if password required and not present.
- g_debug ("Logging into DAAP server");
- if (!http_get (connection, "/login", FALSE, 0.0, 0, FALSE,
- (DMAPResponseHandler) handle_login, NULL,
- FALSE)) {
- g_debug ("Could not login to DAAP server");
- dmap_connection_state_done (connection, FALSE);
- }
-
- break;
-
- case DMAP_GET_REVISION_NUMBER:
- g_debug ("Getting DAAP server database revision number");
- path = g_strdup_printf
- ("/update?session-id=%u&revision-number=1",
- priv->session_id);
- if (!http_get
- (connection, path, TRUE, priv->dmap_version, 0, FALSE,
- (DMAPResponseHandler) handle_update, NULL, FALSE)) {
- g_debug ("Could not get server database revision number");
- dmap_connection_state_done (connection, FALSE);
- }
- g_free (path);
- break;
-
- case DMAP_GET_DB_INFO:
- g_debug ("Getting DAAP database info");
- path = g_strdup_printf
- ("/databases?session-id=%u&revision-number=%d",
- priv->session_id, priv->revision_number);
- if (!http_get
- (connection, path, TRUE, priv->dmap_version, 0, FALSE,
- (DMAPResponseHandler) handle_database_info, NULL,
- FALSE)) {
- g_debug ("Could not get DAAP database info");
- dmap_connection_state_done (connection, FALSE);
- }
- g_free (path);
- break;
-
- case DMAP_GET_SONGS:
- g_debug ("Getting DAAP song listing");
- meta = DMAP_CONNECTION_GET_CLASS
- (connection)->get_query_metadata (connection);
- path = g_strdup_printf
- ("/databases/%i/items?session-id=%u&revision-number=%i"
- "&meta=%s", priv->database_id, priv->session_id,
- priv->revision_number, meta);
- if (!http_get
- (connection, path, TRUE, priv->dmap_version, 0, FALSE,
- (DMAPResponseHandler) handle_song_listing, NULL, TRUE)) {
- g_debug ("Could not get DAAP song listing");
- dmap_connection_state_done (connection, FALSE);
- }
- g_free (path);
- g_free (meta);
- break;
-
- case DMAP_GET_PLAYLISTS:
- g_debug ("Getting DAAP playlists");
- path = g_strdup_printf
- ("/databases/%d/containers?session-id=%u&revision-number=%d",
- priv->database_id, priv->session_id,
- priv->revision_number);
- if (!http_get
- (connection, path, TRUE, priv->dmap_version, 0, FALSE,
- (DMAPResponseHandler) handle_playlists, NULL, TRUE)) {
- g_debug ("Could not get DAAP playlists");
- dmap_connection_state_done (connection, FALSE);
- }
- g_free (path);
- break;
-
- case DMAP_GET_PLAYLIST_ENTRIES:
- {
- DMAPPlaylist *playlist =
- (DMAPPlaylist *)
- g_slist_nth_data (priv->playlists,
- priv->reading_playlist);
-
- g_assert (playlist);
- g_debug ("Reading DAAP playlist %d entries",
- priv->reading_playlist);
- path = g_strdup_printf
-
("/databases/%d/containers/%d/items?session-id=%u&revision-number=%d&meta=dmap.itemid",
- priv->database_id, playlist->id,
- priv->session_id, priv->revision_number);
- if (!http_get
- (connection, path, TRUE, priv->dmap_version, 0,
- FALSE,
- (DMAPResponseHandler) handle_playlist_entries,
- NULL, TRUE)) {
- g_debug ("Could not get entries for DAAP playlist %d",
priv->reading_playlist);
- dmap_connection_state_done (connection,
- FALSE);
- }
- g_free (path);
- }
- break;
-
- case DMAP_LOGOUT:
- g_debug ("Logging out of DAAP server");
- path = g_strdup_printf ("/logout?session-id=%u",
- priv->session_id);
- if (!http_get
- (connection, path, TRUE, priv->dmap_version, 0, FALSE,
- (DMAPResponseHandler) handle_logout, NULL, FALSE)) {
- g_debug ("Could not log out of DAAP server");
- dmap_connection_state_done (connection, FALSE);
- }
-
- g_free (path);
- break;
-
- case DMAP_DONE:
- g_debug ("DAAP done");
-
- dmap_connection_finish (connection);
-
- break;
- }
-
- return FALSE;
-}
-
SoupMessageHeaders *
dmap_connection_get_headers (DMAPConnection * connection, const gchar * uri)
{
@@ -1617,205 +1786,3 @@ dmap_connection_get_playlists (DMAPConnection * connection)
{
return connection->priv->playlists;
}
-
-static void
-dmap_connection_dispose (GObject * object)
-{
- DMAPConnectionPrivate *priv = DMAP_CONNECTION (object)->priv;
- GSList *l;
-
- g_debug ("DAAP connection dispose");
-
- if (priv->emit_progress_id != 0) {
- g_source_remove (priv->emit_progress_id);
- priv->emit_progress_id = 0;
- }
-
- if (priv->do_something_id != 0) {
- g_source_remove (priv->do_something_id);
- priv->do_something_id = 0;
- }
-
- if (priv->name) {
- g_free (priv->name);
- priv->name = NULL;
- }
-
- if (priv->username) {
- g_free (priv->username);
- priv->username = NULL;
- }
-
- if (priv->password) {
- g_free (priv->password);
- priv->password = NULL;
- }
-
- if (priv->host) {
- g_free (priv->host);
- priv->host = NULL;
- }
-
- if (priv->playlists) {
- for (l = priv->playlists; l; l = l->next) {
- DMAPPlaylist *playlist = l->data;
-
- /* FIXME: refstring: */
- g_list_foreach (playlist->uris, (GFunc) g_free, NULL);
- g_list_free (playlist->uris);
- g_free (playlist->name);
- g_free (playlist);
- l->data = NULL;
- }
- g_slist_free (priv->playlists);
- priv->playlists = NULL;
- }
-
- if (priv->item_id_to_uri) {
- g_hash_table_destroy (priv->item_id_to_uri);
- priv->item_id_to_uri = NULL;
- }
-
- if (priv->session) {
- g_debug ("Aborting all pending requests");
- soup_session_abort (priv->session);
- g_object_unref (G_OBJECT (priv->session));
- priv->session = NULL;
- }
-
- if (priv->base_uri) {
- soup_uri_free (priv->base_uri);
- priv->base_uri = NULL;
- }
-
- if (priv->daap_base_uri) {
- g_free (priv->daap_base_uri);
- priv->daap_base_uri = NULL;
- }
-
- if (priv->db) {
- g_object_unref (G_OBJECT (priv->db));
- priv->db = NULL;
- }
-
- if (priv->record_factory) {
- g_object_unref (G_OBJECT (priv->record_factory));
- priv->record_factory = NULL;
- }
-
- if (priv->last_error_message != NULL) {
- g_free (priv->last_error_message);
- priv->last_error_message = NULL;
- }
-
- G_OBJECT_CLASS (dmap_connection_parent_class)->dispose (object);
-}
-
-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:
- if (priv->db) {
- g_object_unref(priv->db);
- }
- priv->db = DMAP_DB (g_value_dup_object (value));
- break;
- case PROP_FACTORY:
- if (priv->record_factory) {
- g_object_unref(priv->record_factory);
- }
- priv->record_factory =
- DMAP_RECORD_FACTORY (g_value_dup_object (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:
- if (priv->base_uri) {
- soup_uri_free (priv->base_uri);
- }
- priv->base_uri = g_value_get_boxed (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;
- case PROP_USERNAME:
- priv->username = g_value_dup_string (value);
- break;
- case PROP_PASSWORD:
- priv->password = g_value_dup_string (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-dmap_connection_get_property (GObject * object,
- guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- DMAPConnectionPrivate *priv = DMAP_CONNECTION (object)->priv;
-
- switch (prop_id) {
- case PROP_DB:
- g_value_set_object (value, priv->db);
- break;
- case PROP_FACTORY:
- g_value_set_object (value, priv->record_factory);
- break;
- case PROP_NAME:
- g_value_set_string (value, priv->name);
- break;
- case PROP_HOST:
- g_value_set_string (value, priv->host);
- break;
- case PROP_PORT:
- g_value_set_uint (value, priv->port);
- break;
- case PROP_BASE_URI:
- g_value_set_boxed (value, priv->base_uri);
- break;
- case PROP_DATABASE_ID:
- g_value_set_int (value, priv->database_id);
- break;
- case PROP_SESSION_ID:
- g_value_set_int (value, priv->session_id);
- break;
- case PROP_DMAP_VERSION:
- g_value_set_double (value, priv->dmap_version);
- break;
- case PROP_REVISION_NUMBER:
- g_value_set_int (value, priv->revision_number);
- break;
- case PROP_USERNAME:
- g_value_set_string (value, priv->username);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
diff --git a/libdmapsharing/dmap-mdns-publisher-avahi.c b/libdmapsharing/dmap-mdns-publisher-avahi.c
index 488b5f8..37c0105 100644
--- a/libdmapsharing/dmap-mdns-publisher-avahi.c
+++ b/libdmapsharing/dmap-mdns-publisher-avahi.c
@@ -67,11 +67,6 @@ enum
LAST_SIGNAL
};
-enum
-{
- PROP_0
-};
-
static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE (DMAPMdnsPublisher, dmap_mdns_publisher, G_TYPE_OBJECT);
diff --git a/libdmapsharing/dmap-mdns-service.c b/libdmapsharing/dmap-mdns-service.c
index 11346f6..891a5f4 100644
--- a/libdmapsharing/dmap-mdns-service.c
+++ b/libdmapsharing/dmap-mdns-service.c
@@ -225,8 +225,16 @@ dmap_mdns_service_init (DMAPMdnsService * service)
static void
dmap_mdns_service_dispose (GObject * object)
{
+ G_OBJECT_CLASS (dmap_mdns_service_parent_class)->dispose (object);
+}
+
+static void
+dmap_mdns_service_finalize (GObject * object)
+{
DMAPMdnsService *service = DMAP_MDNS_SERVICE (object);
+ g_signal_handlers_destroy (object);
+
if (service->priv->service_name) {
g_free (service->priv->service_name);
}
@@ -243,12 +251,5 @@ dmap_mdns_service_dispose (GObject * object)
g_free (service->priv->pair);
}
- G_OBJECT_CLASS (dmap_mdns_service_parent_class)->dispose (object);
-}
-
-static void
-dmap_mdns_service_finalize (GObject * object)
-{
- g_signal_handlers_destroy (object);
G_OBJECT_CLASS (dmap_mdns_service_parent_class)->finalize (object);
}
diff --git a/libdmapsharing/dmap-share.c b/libdmapsharing/dmap-share.c
index 8cbb0f7..de77594 100644
--- a/libdmapsharing/dmap-share.c
+++ b/libdmapsharing/dmap-share.c
@@ -501,13 +501,11 @@ _dmap_share_set_property (GObject * object,
share->priv->container_db = g_value_dup_object (value);
break;
case PROP_TRANSCODE_MIMETYPE:
- /* FIXME: get or dup? */
+ g_free(share->priv->transcode_mimetype);
share->priv->transcode_mimetype = g_value_dup_string (value);
break;
case PROP_TXT_RECORDS:
- if (share->priv->txt_records) {
- g_strfreev (share->priv->txt_records);
- }
+ g_strfreev (share->priv->txt_records);
share->priv->txt_records = g_value_dup_boxed (value);
break;
default:
@@ -561,6 +559,17 @@ _dmap_share_get_property (GObject * object,
}
static void
+_dmap_share_dispose (GObject * object)
+{
+ DMAPShare *share = DMAP_SHARE (object);
+
+ g_clear_object (&share->priv->db);
+ g_clear_object (&share->priv->container_db);
+ g_clear_object (&share->priv->publisher);
+ g_clear_object (&share->priv->server);
+}
+
+static void
_dmap_share_finalize (GObject * object)
{
DMAPShare *share = DMAP_SHARE (object);
@@ -577,16 +586,9 @@ _dmap_share_finalize (GObject * object)
g_free (share->priv->name);
g_free (share->priv->password);
-
- g_object_unref (share->priv->db);
- g_object_unref (share->priv->container_db);
-
+ g_free (share->priv->transcode_mimetype);
g_strfreev (share->priv->txt_records);
- if (share->priv->publisher) {
- g_object_unref (share->priv->publisher);
- }
-
G_OBJECT_CLASS (dmap_share_parent_class)->finalize (object);
}
@@ -597,6 +599,7 @@ dmap_share_class_init (DMAPShareClass * klass)
object_class->get_property = _dmap_share_get_property;
object_class->set_property = _dmap_share_set_property;
+ object_class->dispose = _dmap_share_dispose;
object_class->finalize = _dmap_share_finalize;
/* Pure virtual methods: */
diff --git a/libdmapsharing/dpap-share.c b/libdmapsharing/dpap-share.c
index 5d970ec..a014983 100644
--- a/libdmapsharing/dpap-share.c
+++ b/libdmapsharing/dpap-share.c
@@ -91,11 +91,6 @@ static GMappedFile *mapped_file = NULL;
#define DPAP_SHARE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DPAP_TYPE_SHARE, DPAPSharePrivate))
-enum
-{
- PROP_0,
-};
-
G_DEFINE_TYPE (DPAPShare, dpap_share, DMAP_TYPE_SHARE);
static void
@@ -455,7 +450,7 @@ add_entry_to_mlcl (guint id, DMAPRecord * record, gpointer _mb)
}
if (_dmap_share_client_requested (mb->bits, PHOTO_FILEDATA)) {
size_t size = 0;
- unsigned char *data = NULL;
+ char *data = NULL;
GArray *thumbnail = NULL;
if (_dmap_share_client_requested (mb->bits, PHOTO_THUMB)) {
@@ -484,7 +479,7 @@ add_entry_to_mlcl (guint id, DMAPRecord * record, gpointer _mb)
data = NULL;
size = 0;
} else {
- data = (unsigned char *)
+ data = (char *)
g_mapped_file_get_contents
(mapped_file);
size = g_mapped_file_get_length (mapped_file);
diff --git a/libdmapsharing/test-daap-record.c b/libdmapsharing/test-daap-record.c
index 0e873ca..0ce1b22 100644
--- a/libdmapsharing/test-daap-record.c
+++ b/libdmapsharing/test-daap-record.c
@@ -336,8 +336,11 @@ test_daap_record_finalize (GObject *object)
g_free (record->priv->location);
g_free (record->priv->title);
g_free (record->priv->format);
+ g_free (record->priv->real_format);
g_free (record->priv->album);
+ g_free (record->priv->sort_album);
g_free (record->priv->artist);
+ g_free (record->priv->sort_artist);
g_free (record->priv->genre);
if (record->priv->hash) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]