The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*
 * Copyright (c) 2006, 2013 by the gtk2-perl team (see the file AUTHORS)
 *
 * Licensed under the LGPL, see LICENSE file for more information.
 *
 * $Id$
 */

#include "gtk2perl.h"

 /* For gtk2perl_sv_to_strv and gtk2perl_sv_from_strv. */
#include "gtk2perl-private.h"

/*
struct _GtkRecentFilterInfo
{
  GtkRecentFilterFlags contains;

  const gchar *uri;
  const gchar *display_name;
  const gchar *mime_type;
  const gchar **applications;
  const gchar **groups;

  gint age;
};
*/

static SV *
newSVGtkRecentFilterInfo (const GtkRecentFilterInfo *info)
{
  HV *hv;

  if (!info)
    return &PL_sv_undef;

  hv = newHV ();

  gperl_hv_take_sv_s (hv, "contains",
                      newSVGtkRecentFilterFlags (info->contains));

  if (info->uri)
    gperl_hv_take_sv_s (hv, "uri", newSVpv (info->uri, 0));

  if (info->display_name)
    gperl_hv_take_sv_s (hv, "display_name", newSVGChar (info->display_name));

  if (info->mime_type)
    gperl_hv_take_sv_s (hv, "mime_type", newSVGChar (info->mime_type));

  if (info->applications)
    gperl_hv_take_sv_s (hv, "applications", gtk2perl_sv_from_strv (info->applications));

  if (info->groups)
    gperl_hv_take_sv_s (hv, "groups", gtk2perl_sv_from_strv (info->groups));

  gperl_hv_take_sv_s (hv, "age", newSViv (info->age));

  return newRV_noinc ((SV *) hv);
}

static GtkRecentFilterInfo *
SvGtkRecentFilterInfo (SV *sv)
{
  HV *hv;
  SV **svp;
  GtkRecentFilterInfo *info;

  if (!gperl_sv_is_hash_ref (sv))
    croak ("invalid recent filter info - expecting a hash reference");

  hv = (HV *) SvRV (sv);
  info = gperl_alloc_temp (sizeof (GtkRecentFilterInfo));

  if ((svp = hv_fetch (hv, "contains", 8, 0)))
    info->contains = SvGtkRecentFilterFlags (*svp);

  if ((svp = hv_fetch (hv, "uri", 3, 0)))
    info->uri = SvPV_nolen (*svp);

  if ((svp = hv_fetch (hv, "display_name", 12, 0)))
    info->display_name = SvGChar (*svp);

  if ((svp = hv_fetch (hv, "mime_type", 9, 0)))
    info->mime_type = SvGChar (*svp);

  if ((svp = hv_fetch (hv, "applications", 12, 0)))
    info->applications = gtk2perl_sv_to_strv (*svp);

  if ((svp = hv_fetch (hv, "groups", 6, 0)))
    info->groups = gtk2perl_sv_to_strv (*svp);

  if ((svp = hv_fetch (hv, "age", 3, 0)))
    info->age = SvIV (*svp);

  return info;
}

static gboolean
gtk2perl_recent_filter_func (const GtkRecentFilterInfo *filter_info,
			     gpointer                   user_data)
{
  GPerlCallback *callback = (GPerlCallback *) user_data;
  GValue value = { 0, };
  gboolean retval;
  SV *sv;

  g_value_init (&value, G_TYPE_BOOLEAN);
  sv = newSVGtkRecentFilterInfo (filter_info);

  gperl_callback_invoke (callback, &value, sv);
  retval = g_value_get_boolean (&value);

  SvREFCNT_dec (sv);
  g_value_unset (&value);

  return retval;
}

MODULE = Gtk2::RecentFilter	PACKAGE = Gtk2::RecentFilter	PREFIX = gtk_recent_filter_

GtkRecentFilter *
gtk_recent_filter_new (class)
    C_ARGS:
        /* void */

void gtk_recent_filter_set_name (GtkRecentFilter *filter, const gchar *name)

const gchar *gtk_recent_filter_get_name (GtkRecentFilter *filter)

void
gtk_recent_filter_add_mime_type (GtkRecentFilter *filter, const gchar *mime_type)

void
gtk_recent_filter_add_pattern (GtkRecentFilter *filter, const gchar *pattern)

void
gtk_recent_filter_add_pixbuf_formats (GtkRecentFilter *filter)

void
gtk_recent_filter_add_application (GtkRecentFilter *filter, const gchar *application)

void
gtk_recent_filter_add_group (GtkRecentFilter *filter, const gchar *group)

void
gtk_recent_filter_add_age (GtkRecentFilter *filter, gint days)

void
gtk_recent_filter_add_custom (filter, needed, func, data=NULL)
	GtkRecentFilter *filter
	GtkRecentFilterFlags needed
	SV *func
	SV *data
    PREINIT:
        GType param_types[1];
	GPerlCallback *callback;
    CODE:
        param_types[0] = GPERL_TYPE_SV;
	callback = gperl_callback_new (func, data, 1, param_types, G_TYPE_BOOLEAN);
	gtk_recent_filter_add_custom (filter, needed,
				      gtk2perl_recent_filter_func, callback,
				      (GDestroyNotify) gperl_callback_destroy);

GtkRecentFilterFlags
gtk_recent_filter_get_needed (GtkRecentFilter *filter)

gboolean
gtk_recent_filter_filter (filter, filter_info)
	GtkRecentFilter *filter
	SV *filter_info
    C_ARGS:
    	filter, SvGtkRecentFilterInfo (filter_info)