- MilkTaskModelPrivate *priv = MILK_TASK_MODEL_PRIVATE (model);
- GList *rtm_tasks;
- GList *l;
- GTimeVal current_time;
- char *new_sync;
- GError *error = NULL;
-
- if (milk_auth_get_state (priv->auth) != MILK_AUTH_STATE_CONNECTED) {
- return TRUE;
- }
-
- g_get_current_time (¤t_time);
- new_sync = g_time_val_to_iso8601 (¤t_time);
- rtm_tasks = milk_auth_get_tasks (priv->auth, priv->last_sync, &error);
-
- if (error) {
- g_error (G_STRLOC ": failed to retrieve latest tasks: %s",
- error->message);
- g_clear_error (&error);
- } else {
- g_free (priv->last_sync);
- priv->last_sync = new_sync;
- }
-
- /* Populate model */
- for (l = rtm_tasks; l; l = g_list_delete_link (l, l)) {
- GtkTreeIter iter;
- RtmTask *rtm_task;
- const char *id;
- gboolean task_in_store;
-
- rtm_task = RTM_TASK (l->data);
-
- id = rtm_task_get_id (rtm_task);
- g_hash_table_insert (priv->tasks, g_strdup (id),
- g_object_ref (rtm_task));
-
- task_in_store = model_store_find_task (model, rtm_task, &iter);
-
- /* Task is deleted or completed */
- if (task_is_finished (rtm_task)) {
- if (task_in_store) {
- gtk_list_store_remove (priv->store, &iter);
- }
- /* Task has been changed */
- } else if (task_in_store) {
- RtmTask *old_task;
- GtkTreePath *path;
-
- /* rtm-glib doesn't re-use task structs when they're
- * updated, so we have to replace the changed */
- gtk_tree_model_get (
- GTK_TREE_MODEL (priv->store), &iter,
- MILK_TASK_MODEL_COLUMN_TASK, &old_task,
- -1);
-
- gtk_list_store_set (
- priv->store, &iter,
- MILK_TASK_MODEL_COLUMN_TASK, rtm_task,
- -1);
-
- path = gtk_tree_model_get_path (
- GTK_TREE_MODEL (priv->store), &iter);
- gtk_tree_model_row_changed (
- GTK_TREE_MODEL (priv->store),
- path, &iter);
- gtk_tree_path_free (path);
-
- g_object_unref (old_task);
-
- /* Task is new */
- } else {
- gtk_list_store_append (priv->store, &iter);
- gtk_list_store_set (
- priv->store, &iter,
- MILK_TASK_MODEL_COLUMN_TASK, rtm_task,
- -1);
- }
- }
-
- return TRUE;