void rygel_didl_lite_writer_serialize (RygelDIDLLiteWriter* self, RygelMediaObject* media_object, GError** error) {
	GError * _inner_error_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (media_object != NULL);
	_inner_error_ = NULL;
	if (RYGEL_IS_MEDIA_ITEM (media_object)) {
		rygel_didl_lite_writer_serialize_item (self, RYGEL_MEDIA_ITEM (media_object), &_inner_error_);
		if (_inner_error_ != NULL) {
			g_propagate_error (error, _inner_error_);
			return;
		}
	} else {
		if (RYGEL_IS_MEDIA_CONTAINER (media_object)) {
			rygel_didl_lite_writer_serialize_container (self, RYGEL_MEDIA_CONTAINER (media_object), &_inner_error_);
			if (_inner_error_ != NULL) {
				g_propagate_error (error, _inner_error_);
				return;
			}
		} else {
			_inner_error_ = g_error_new_literal (RYGEL_DIDL_LITE_WRITER_ERROR, RYGEL_DIDL_LITE_WRITER_ERROR_UNSUPPORTED_OBJECT, "Unable to serialize unsupported object");
			if (_inner_error_ != NULL) {
				g_propagate_error (error, _inner_error_);
				return;
			}
		}
	}
}
/**
 * Factory method.
 *
 * Create a QueryContainer from a plain-text description string.
 *
 * @param definition Plain-text defintion of the query-container
 * @param name       The title of the container. If not supplied, it
 *                   will be derived from the plain-text description of
 *                   the container
 * @return A new instance of QueryContainer
 */
RygelMediaExportQueryContainer *
rygel_media_export_query_container_factory_create_from_description (RygelMediaExportQueryContainerFactory *self,
                                                                    const gchar                           *definition,
                                                                    const gchar                           *name) {
  gchar *title;
  gchar *attribute;
  gchar *pattern;
  gchar *upnp_class;
  gchar *id;
  RygelMediaExportQueryContainer *container;
  RygelSearchExpression *expression;

  g_return_val_if_fail (RYGEL_MEDIA_EXPORT_IS_QUERY_CONTAINER_FACTORY (self), NULL);
  g_return_val_if_fail (definition != NULL, NULL);
  g_return_val_if_fail (name != NULL, NULL);

  title = g_strdup (name);
  attribute = NULL;
  pattern = NULL;
  upnp_class = NULL;

  id = g_strdup (definition);
  rygel_media_export_query_container_factory_register_id (self, &id);
  expression = rygel_media_export_query_container_factory_parse_description (definition,
                                                                             &pattern,
                                                                             &attribute,
                                                                             &upnp_class,
                                                                             &title);
  if (!pattern || pattern[0] == '\0') {
    container = RYGEL_MEDIA_EXPORT_QUERY_CONTAINER (rygel_media_export_leaf_query_container_new (expression, id, title));
  } else {
    container = RYGEL_MEDIA_EXPORT_QUERY_CONTAINER (rygel_media_export_node_query_container_new (expression, id, title, pattern, attribute));
  }

  if (upnp_class) {
    rygel_media_object_set_upnp_class (RYGEL_MEDIA_OBJECT (container), upnp_class);
    if (!g_strcmp0 (upnp_class, RYGEL_MEDIA_CONTAINER_MUSIC_ALBUM)) {
      rygel_media_container_set_sort_criteria (RYGEL_MEDIA_CONTAINER (container),
                                               RYGEL_MEDIA_CONTAINER_ALBUM_SORT_CRITERIA);
    }
  }
  rygel_search_expression_unref (expression);
  g_free (id);
  g_free (upnp_class);
  g_free (pattern);
  g_free (attribute);
  g_free (title);

  return container;
}
static void
rygel_media_export_harvester_on_file_added (RygelMediaExportHarvester *self,
                                            GFile                     *file) {
  gchar *uri;
  GError *error;
  RygelMediaExportMediaCache *cache;
  GFileInfo *info;
  RygelMediaExportHarvesterPrivate *priv;

  g_return_if_fail (RYGEL_MEDIA_EXPORT_IS_HARVESTER (self));
  g_return_if_fail (G_IS_FILE (file));

  uri = g_file_get_uri (file);
  g_debug ("Filesystem events settled for %s, scheduling extraction…", uri);
  g_free (uri);
  cache = rygel_media_export_media_cache_get_default ();
  priv = self->priv;
  error = NULL;
  info = g_file_query_info (file,
                            G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
                            G_FILE_QUERY_INFO_NONE,
                            priv->cancellable,
                            &error);
  if (error) {
    g_warning ("Failed to query file: %s", error->message);
    g_error_free (error);
    error = NULL;

    goto out;
  }
  if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY ||
      rygel_media_export_harvester_is_eligible (info)) {
    RygelMediaContainer *parent_container = NULL;
    GFile *current = g_object_ref (file);
    GeeAbstractCollection *abstract_locations = GEE_ABSTRACT_COLLECTION (priv->locations);

    do {
      GFile *parent = g_file_get_parent (current);
      gchar *id = rygel_media_export_media_cache_get_id (parent);
      RygelMediaObject *tmp_object = rygel_media_export_media_cache_get_object (cache, id, &error);

      if (error) {
        g_warning (_("Error fetching object '%s' from database: %s"),
                   id,
                   error->message);
        g_free (id);
        g_object_unref (parent);

        g_error_free (error);
        error = NULL;

        goto inner_out;
      }
      g_free (id);
      if (parent_container) {
        g_object_unref (parent_container);
        parent_container = NULL;
      }
      if (RYGEL_IS_MEDIA_CONTAINER (tmp_object)) {
        parent_container = RYGEL_MEDIA_CONTAINER (tmp_object);
      } else {
        g_object_unref (tmp_object);
      }
      if (!parent_container) {
        g_object_ref (parent);
        g_object_unref (current);
        current = parent;
      }
      g_object_unref (parent);
      if (!parent_container &&
          gee_abstract_collection_contains (abstract_locations, current)) {
        RygelMediaObject* another_object = rygel_media_export_media_cache_get_object (cache,
                                                                                      RYGEL_MEDIA_EXPORT_ROOT_CONTAINER_FILESYSTEM_FOLDER_ID,
                                                                                      &error);

        if (error) {
          goto inner_out;
        }
        if (parent_container) {
          g_object_unref (parent_container);
          parent_container = NULL;
        }
        if (RYGEL_IS_MEDIA_CONTAINER (another_object)) {
          parent_container = RYGEL_MEDIA_CONTAINER (another_object);
        }

        break;
      }
    } while (!parent_container);
    rygel_media_export_harvester_schedule (self, current, parent_container, NULL);
  inner_out:

    g_object_unref (current);
    if (parent_container) {
      g_object_unref (parent_container);
    }
  } else {
    gchar* file_uri = g_file_get_uri (file);

    g_debug ("%s is not eligible for extraction", file_uri);
    g_free (file_uri);
  }
 out:
  g_object_unref (cache);
}
static gboolean rygel_external_container_real_search_co (RygelExternalContainerSearchData* data) {
	switch (data->_state_) {
		case 0:
		goto _state_0;
		case 2:
		goto _state_2;
		case 3:
		goto _state_3;
		case 4:
		goto _state_4;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	{
		data->results = gee_array_list_new (RYGEL_TYPE_MEDIA_OBJECT, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL);
#line 116 "rygel-external-container.vala"
		if (data->expression == NULL) {
#line 116 "rygel-external-container.vala"
			data->_tmp0_ = TRUE;
#line 553 "rygel-external-container.c"
		} else {
#line 116 "rygel-external-container.vala"
			data->_tmp0_ = !RYGEL_IS_RELATIONAL_EXPRESSION (data->expression);
#line 557 "rygel-external-container.c"
		}
#line 116 "rygel-external-container.vala"
		if (data->_tmp0_) {
#line 561 "rygel-external-container.c"
			data->_state_ = 2;
			RYGEL_MEDIA_CONTAINER_CLASS (rygel_external_container_parent_class)->search (RYGEL_MEDIA_CONTAINER (data->self), data->expression, data->offset, data->max_count, data->cancellable, rygel_external_container_search_ready, data);
			return FALSE;
			_state_2:
			data->_tmp1_ = RYGEL_MEDIA_CONTAINER_CLASS (rygel_external_container_parent_class)->search_finish (RYGEL_MEDIA_CONTAINER (data->self), data->_res_, &data->total_matches, &data->_inner_error_);
			if (data->_inner_error_ != NULL) {
				g_simple_async_result_set_from_error (data->_async_result, data->_inner_error_);
				g_error_free (data->_inner_error_);
				_g_object_unref0 (data->results);
				{
					if (data->_state_ == 0) {
						g_simple_async_result_complete_in_idle (data->_async_result);
					} else {
						g_simple_async_result_complete (data->_async_result);
					}
					g_object_unref (data->_async_result);
					return FALSE;
				}
			}
			data->result = data->_tmp1_;
			_g_object_unref0 (data->results);
			{
				if (data->_state_ == 0) {
					g_simple_async_result_complete_in_idle (data->_async_result);
				} else {
					g_simple_async_result_complete (data->_async_result);
				}
				g_object_unref (data->_async_result);
				return FALSE;
			}
		}
		data->rel_expression = _rygel_search_expression_ref0 ((data->_tmp2_ = data->expression, RYGEL_IS_RELATIONAL_EXPRESSION (data->_tmp2_) ? ((RygelRelationalExpression*) data->_tmp2_) : NULL));
		data->id = g_strdup ((const char*) ((RygelSearchExpression*) data->rel_expression)->operand2);
#line 128 "rygel-external-container.vala"
		if (_vala_strcmp0 ((const char*) ((RygelSearchExpression*) data->rel_expression)->operand1, "@id") != 0) {
#line 128 "rygel-external-container.vala"
			data->_tmp4_ = TRUE;
#line 599 "rygel-external-container.c"
		} else {
#line 129 "rygel-external-container.vala"
			data->_tmp4_ = GPOINTER_TO_INT (((RygelSearchExpression*) data->rel_expression)->op) != GUPNP_SEARCH_CRITERIA_OP_EQ;
#line 603 "rygel-external-container.c"
		}
#line 128 "rygel-external-container.vala"
		if (data->_tmp4_) {
#line 128 "rygel-external-container.vala"
			data->_tmp3_ = TRUE;
#line 609 "rygel-external-container.c"
		} else {
#line 130 "rygel-external-container.vala"
			data->_tmp3_ = !rygel_external_container_is_direct_child (data->self, data->id);
#line 613 "rygel-external-container.c"
		}
#line 128 "rygel-external-container.vala"
		if (data->_tmp3_) {
#line 617 "rygel-external-container.c"
			data->_state_ = 3;
			RYGEL_MEDIA_CONTAINER_CLASS (rygel_external_container_parent_class)->search (RYGEL_MEDIA_CONTAINER (data->self), data->expression, data->offset, data->max_count, data->cancellable, rygel_external_container_search_ready, data);
			return FALSE;
			_state_3:
			data->_tmp5_ = RYGEL_MEDIA_CONTAINER_CLASS (rygel_external_container_parent_class)->search_finish (RYGEL_MEDIA_CONTAINER (data->self), data->_res_, &data->total_matches, &data->_inner_error_);
			if (data->_inner_error_ != NULL) {
				g_simple_async_result_set_from_error (data->_async_result, data->_inner_error_);
				g_error_free (data->_inner_error_);
				_g_object_unref0 (data->results);
				_rygel_search_expression_unref0 (data->rel_expression);
				_g_free0 (data->id);
				{
					if (data->_state_ == 0) {
						g_simple_async_result_complete_in_idle (data->_async_result);
					} else {
						g_simple_async_result_complete (data->_async_result);
					}
					g_object_unref (data->_async_result);
					return FALSE;
				}
			}
			data->result = data->_tmp5_;
			_g_object_unref0 (data->results);
			_rygel_search_expression_unref0 (data->rel_expression);
			_g_free0 (data->id);
			{
				if (data->_state_ == 0) {
					g_simple_async_result_complete_in_idle (data->_async_result);
				} else {
					g_simple_async_result_complete (data->_async_result);
				}
				g_object_unref (data->_async_result);
				return FALSE;
			}
		}
		data->factory = rygel_external_item_factory_new ();
#line 140 "rygel-external-container.vala"
		if (rygel_external_item_factory_id_valid (data->id)) {
#line 656 "rygel-external-container.c"
			data->_state_ = 4;
			rygel_external_item_factory_create_for_id (data->factory, data->id, data->self, rygel_external_container_search_ready, data);
			return FALSE;
			_state_4:
			data->media_object = rygel_external_item_factory_create_for_id_finish (data->factory, data->_res_, &data->_inner_error_);
			if (data->_inner_error_ != NULL) {
				g_simple_async_result_set_from_error (data->_async_result, data->_inner_error_);
				g_error_free (data->_inner_error_);
				_g_object_unref0 (data->results);
				_rygel_search_expression_unref0 (data->rel_expression);
				_g_free0 (data->id);
				_rygel_external_item_factory_unref0 (data->factory);
				{
					if (data->_state_ == 0) {
						g_simple_async_result_complete_in_idle (data->_async_result);
					} else {
						g_simple_async_result_complete (data->_async_result);
					}
					g_object_unref (data->_async_result);
					return FALSE;
				}
			}
#line 142 "rygel-external-container.vala"
			gee_abstract_collection_add ((GeeAbstractCollection*) data->results, (RygelMediaObject*) data->media_object);
#line 681 "rygel-external-container.c"
			_g_object_unref0 (data->media_object);
		} else {
			{
				data->_container_it = gee_abstract_collection_iterator ((GeeAbstractCollection*) data->self->priv->containers);
#line 144 "rygel-external-container.vala"
				while (TRUE) {
#line 144 "rygel-external-container.vala"
					if (!gee_iterator_next (data->_container_it)) {
#line 144 "rygel-external-container.vala"
						break;
#line 692 "rygel-external-container.c"
					}
					data->container = (RygelExternalContainer*) gee_iterator_get (data->_container_it);
#line 145 "rygel-external-container.vala"
					if (_vala_strcmp0 (((RygelMediaObject*) data->container)->id, data->id) == 0) {
#line 146 "rygel-external-container.vala"
						gee_abstract_collection_add ((GeeAbstractCollection*) data->results, (RygelMediaObject*) data->container);
#line 699 "rygel-external-container.c"
					}
					_g_object_unref0 (data->container);
				}
				_g_object_unref0 (data->_container_it);
			}
		}
#line 151 "rygel-external-container.vala"
		data->total_matches = (guint) gee_collection_get_size ((GeeCollection*) data->results);
#line 708 "rygel-external-container.c"
		data->result = (GeeList*) data->results;
		_rygel_search_expression_unref0 (data->rel_expression);
		_g_free0 (data->id);
		_rygel_external_item_factory_unref0 (data->factory);
		{
			if (data->_state_ == 0) {
				g_simple_async_result_complete_in_idle (data->_async_result);
			} else {
				g_simple_async_result_complete (data->_async_result);
			}
			g_object_unref (data->_async_result);
			return FALSE;
		}
		_g_object_unref0 (data->results);
		_rygel_search_expression_unref0 (data->rel_expression);
		_g_free0 (data->id);
		_rygel_external_item_factory_unref0 (data->factory);
	}
	{
		if (data->_state_ == 0) {
			g_simple_async_result_complete_in_idle (data->_async_result);
		} else {
			g_simple_async_result_complete (data->_async_result);
		}
		g_object_unref (data->_async_result);
		return FALSE;
	}
}
Beispiel #5
0
static void rygel_media_container_finalize (GObject* obj) {
	RygelMediaContainer * self;
	self = RYGEL_MEDIA_CONTAINER (obj);
	G_OBJECT_CLASS (rygel_media_container_parent_class)->finalize (obj);
}