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);
}
示例#3
0
文件: task-ls.c 项目: antono/iris
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);
}