static void fetch_opml (IrisTask *task, gpointer user_data) { MarinaGoogleReaderSourcePrivate *priv; const gchar *cookie; SoupMessage *msg; GValue value = {0,}; g_return_if_fail (MARINA_IS_GOOGLE_READER_SOURCE (user_data)); priv = MARINA_GOOGLE_READER_SOURCE (user_data)->priv; iris_task_get_result (task, &value); cookie = g_value_get_string (&value); g_value_unset (&value); msg = soup_message_new ("GET", OPML_URI); soup_message_headers_append (msg->request_headers, "Cookie", cookie); if (soup_session_send_message (priv->session, msg) == 200) IRIS_TASK_RETURN_VALUE (task, G_TYPE_STRING, msg->response_body->data); else IRIS_TASK_THROW_NEW (task, GOOGLE_READER_ERROR_QUARK, 0, "Error retrieving OPML from google"); }
static void get_cookie (IrisTask *task, gpointer user_data) { MarinaGoogleReaderSourcePrivate *priv; SoupMessage *msg; gchar *uri; GValue value = {0,}; g_debug ("get_cookie here"); g_return_if_fail (IRIS_IS_TASK (task)); g_return_if_fail (MARINA_IS_GOOGLE_READER_SOURCE (user_data)); priv = MARINA_GOOGLE_READER_SOURCE (user_data)->priv; iris_task_get_result (task, &value); if (!G_VALUE_HOLDS_STRING (&value)) goto cleanup; if (!priv->cookie) { g_debug ("%d", __LINE__); uri = g_markup_printf_escaped (LOGIN_URI_FORMAT, priv->username, g_value_get_string (&value)); msg = soup_message_new ("GET", uri); g_free (uri); if (soup_session_send_message (priv->session, msg) == 200) { gchar *tmp = strstr (msg->response_body->data, "SID="); if (!tmp) ; // set error gchar *sid = tmp; gchar *end = strstr (sid, "\n"); if (!end) ; // set error *end = '\0'; priv->cookie = g_strdup (sid); g_object_unref (msg); } else { // set error } } if (priv->cookie) IRIS_TASK_RETURN_VALUE (task, G_TYPE_STRING, priv->cookie); cleanup: g_value_unset (&value); }
void callback (IrisTask *task, gpointer user_data) { GList *result, *iter; GValue value = {0,}; iris_task_get_result (task, &value); result = g_value_get_pointer (&value); g_value_unset (&value); for (iter = result; iter; iter = iter->next) { g_print ("%s\n", (gchar*)iter->data); g_free (iter->data); } g_mutex_lock (mutex); g_cond_signal (cond); g_mutex_unlock (mutex); }
static void parse_opml (IrisTask *task, gpointer user_data) { MarinaGoogleReaderSource *google_source; XmlReader *reader; GList *sources = NULL; MarinaSource *source; gchar *id; GValue value = {0,}; g_return_if_fail (MARINA_IS_GOOGLE_READER_SOURCE (user_data)); google_source = MARINA_GOOGLE_READER_SOURCE (user_data); reader = xml_reader_new (); iris_task_get_result (task, &value); if (!xml_reader_load_from_data (reader, g_value_get_string (&value), -1, OPML_URI, NULL)) goto cleanup; if (!xml_reader_read_start_element (reader, "opml")) // set error goto cleanup; if (!xml_reader_read_start_element (reader, "body")) // set error goto cleanup; while (xml_reader_read_start_element (reader, "outline")) { source = marina_soup_source_new (); id = g_strconcat (marina_source_get_id (MARINA_SOURCE (google_source)), "+", xml_reader_get_attribute (reader, "xmlUrl"), NULL); MARINA_SOURCE_BASE (source)->id = g_strdup (id); g_object_set (source, "title", xml_reader_get_attribute (reader, "title"), "uri", xml_reader_get_attribute (reader, "xmlUrl"), NULL); sources = g_list_prepend (sources, source); g_free (id); } sources = g_list_reverse (sources); if (!google_source->priv->children) { google_source->priv->children = sources; GList *iter; for (iter = sources; iter; iter = iter->next) { marina_source_child_added (MARINA_SOURCE (google_source), iter->data); marina_sync_source (iter->data); } } else { g_list_foreach (sources, (GFunc)g_object_unref, NULL); g_list_free (sources); sources = NULL; // set error } // update the unread counts marina_sources_stat (marina_sources_get_default ()); cleanup: g_object_unref (reader); }