Beispiel #1
0
static NewsFeed *
news_format_rss_read (NewsFormat    *format,
                      GInputStream  *stream,
                      GError       **error)
{
   NewsFormatRssPrivate *priv;
   NewsFormatRss *rss = (NewsFormatRss *)format;
   GomAdapter *adapter;
   NewsSource *source;
   XmlReader *reader;
   NewsFeed *feed;
   gchar *source_id;

   ENTRY;

   g_return_val_if_fail(NEWS_IS_FORMAT_RSS(rss), NULL);

   priv = rss->priv;

   if (!(source = news_format_get_source(format))) {
      g_assert_not_reached();
      RETURN(NULL);
   }

   if (!(adapter = news_format_get_adapter(format))) {
      g_assert_not_reached();
      RETURN(NULL);
   }

   reader = xml_reader_new();
   if (!xml_reader_load_from_stream(reader, stream, error)) {
      g_object_unref(reader);
      RETURN(NULL);
   }

   g_signal_connect(reader, "error",
                    G_CALLBACK(news_format_rss_on_error),
                    format);

   g_object_get(source, "id", &source_id, NULL);
   feed = g_object_new(NEWS_TYPE_FEED,
                       "adapter", adapter,
                       "is-new", TRUE,
                       "source-id", source_id,
                       NULL);
   if (!news_format_rss_read_from_xml(rss, reader, feed, error)) {
      g_clear_object(&feed);
   } else if (priv->error) {
      g_clear_object(&feed);
      if (error) {
         *error = g_error_copy(priv->error);
      }
   }

   g_free(source_id);
   g_object_unref(reader);

   RETURN(feed);
}
Beispiel #2
0
gboolean
ide_doap_load_from_data (IdeDoap       *self,
                         const gchar   *data,
                         gsize          length,
                         GError       **error)
{
  g_autoptr(XmlReader) reader = NULL;

  g_return_val_if_fail (IDE_IS_DOAP (self), FALSE);
  g_return_val_if_fail (data != NULL, FALSE);

  reader = xml_reader_new ();

  if (!xml_reader_load_from_data (reader, (const gchar *)data, length, NULL, NULL))
    return FALSE;

  return load_doap (self, reader, error);
}
Beispiel #3
0
gboolean
ide_doap_load_from_file (IdeDoap       *self,
                         GFile         *file,
                         GCancellable  *cancellable,
                         GError       **error)
{
  g_autoptr(XmlReader) reader = NULL;

  g_return_val_if_fail (IDE_IS_DOAP (self), FALSE);
  g_return_val_if_fail (G_IS_FILE (file), FALSE);
  g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);

  reader = xml_reader_new ();

  if (!xml_reader_load_from_file (reader, file, cancellable, error))
    return FALSE;

  return load_doap (self, reader, error);
}
Beispiel #4
0
gboolean
ide_doap_load_from_file (IdeDoap       *self,
                         GFile         *file,
                         GCancellable  *cancellable,
                         GError       **error)
{
  g_autoptr(XmlReader) reader = NULL;

  g_return_val_if_fail (IDE_IS_DOAP (self), FALSE);
  g_return_val_if_fail (G_IS_FILE (file), FALSE);
  g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);

  reader = xml_reader_new ();

  if (!xml_reader_load_from_file (reader, file, cancellable, error))
    return FALSE;

  if (!xml_reader_read_start_element (reader, "Project"))
    {
      g_set_error (error,
                   IDE_DOAP_ERROR,
                   IDE_DOAP_ERROR_INVALID_FORMAT,
                   "Project element is missing from doap.");
      return FALSE;
    }

  g_object_freeze_notify (G_OBJECT (self));

  xml_reader_read (reader);

  do
    {
      const gchar *element_name;

      element_name = xml_reader_get_local_name (reader);

      if (ide_str_equal0 (element_name, "name") ||
          ide_str_equal0 (element_name, "shortdesc") ||
          ide_str_equal0 (element_name, "description"))
        {
          gchar *str;

          str = xml_reader_read_string (reader);
          if (str != NULL)
            g_object_set (self, element_name, g_strstrip (str), NULL);
          g_free (str);
        }
      else if (ide_str_equal0 (element_name, "category") ||
               ide_str_equal0 (element_name, "homepage") ||
               ide_str_equal0 (element_name, "download-page") ||
               ide_str_equal0 (element_name, "bug-database"))
        {
          gchar *str;

          str = xml_reader_get_attribute (reader, "rdf:resource");
          if (str != NULL)
            g_object_set (self, element_name, g_strstrip (str), NULL);
          g_free (str);
        }
      else if (ide_str_equal0 (element_name, "programming-language"))
        {
          gchar *str;

          str = xml_reader_read_string (reader);
          if (!ide_str_empty0 (str))
            ide_doap_add_language (self, g_strstrip (str));
          g_free (str);
        }
      else if (ide_str_equal0 (element_name, "maintainer"))
        {
          if (!ide_doap_parse_maintainer (self, reader))
            break;
        }
    }
  while (xml_reader_read_to_next (reader));

  g_object_thaw_notify (G_OBJECT (self));

  return TRUE;
}
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);
}