[libdmapsharing] Clean up code related to dynamically-allocated properties



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]