/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/************************************************

  rbgtkrecentinfo.c -

  $Author: mutoh $
  $Date: 2006/11/12 15:28:40 $

  Copyright (C) 2006 Masao Mutoh
************************************************/

#include "global.h"

#if GTK_CHECK_VERSION(2,10,0)

#define _SELF(self) ((GtkRecentInfo*)RVAL2BOXED(self, GTK_TYPE_RECENT_INFO))


static VALUE
ri_get_uri(self)
    VALUE self;
{
    return CSTR2RVAL(gtk_recent_info_get_uri(_SELF(self)));
}

static VALUE
ri_get_display_name(self)
    VALUE self;
{
    return CSTR2RVAL(gtk_recent_info_get_display_name(_SELF(self)));
}

static VALUE
ri_get_description(self)
    VALUE self;
{
    return CSTR2RVAL(gtk_recent_info_get_description(_SELF(self)));
}

static VALUE
ri_get_mime_type(self)
    VALUE self;
{
    return CSTR2RVAL(gtk_recent_info_get_mime_type(_SELF(self)));
}

static VALUE
ri_get_added(self)
    VALUE self;
{
    time_t t = gtk_recent_info_get_added(_SELF(self));
    return rb_funcall(rb_cTime, rb_intern("at"), 1, INT2NUM(t));
}

static VALUE
ri_get_modified(self)
    VALUE self;
{
    time_t t = gtk_recent_info_get_modified(_SELF(self));
    return rb_funcall(rb_cTime, rb_intern("at"), 1, INT2NUM(t));
}

static VALUE
ri_get_visited(self)
    VALUE self;
{
    time_t t = gtk_recent_info_get_visited(_SELF(self));
    return rb_funcall(rb_cTime, rb_intern("at"), 1, INT2NUM(t));
}

static VALUE
ri_get_private_hint(self)
    VALUE self;
{
    return CBOOL2RVAL(gtk_recent_info_get_private_hint(_SELF(self)));
}

static VALUE
ri_get_application_info(self, app_name)
    VALUE self, app_name;
{
    gchar* app_exec;
    guint count;
    time_t t;
    gboolean ret = gtk_recent_info_get_application_info(_SELF(self),
                                                        RVAL2CSTR(app_name),
                                                        &app_exec,
                                                        &count,
                                                        &t);
    VALUE ary = rb_ary_new();
    if (ret){
        rb_ary_push(ary, CSTR2RVAL(app_exec));
        g_free(app_exec);
        rb_ary_push(ary, UINT2NUM(count));
        rb_ary_push(ary, rb_funcall(rb_cTime, rb_intern("at"), 1, INT2NUM(t)));
    }
    return ary;
}    

static VALUE
ri_get_applications(self)
    VALUE self;
{
    gint i;
    gsize length;
    gchar** str = gtk_recent_info_get_applications(_SELF(self), &length);
    VALUE ary = rb_ary_new();
    for(i = 0; i < length; i++){
        rb_ary_push(ary, CSTR2RVAL(str[i]));
    }
    g_strfreev(str);
    return ary;
}

static VALUE
ri_last_application(self)
    VALUE self;
{
    return CSTR2RVAL(gtk_recent_info_last_application(_SELF(self)));
}

static VALUE
ri_get_groups(self)
    VALUE self;
{
    gint i;
    gsize length;
    gchar** str = gtk_recent_info_get_groups(_SELF(self), &length);
    VALUE ary = rb_ary_new();
    for(i = 0; i < length; i++){
        rb_ary_push(ary, CSTR2RVAL(str[i]));
    }
    g_strfreev(str);
    return ary;
}

static VALUE
ri_has_group(self, group_name)
    VALUE self, group_name;
{
    return CBOOL2RVAL(gtk_recent_info_has_group(_SELF(self), 
                                                RVAL2CSTR(group_name)));
}

static VALUE
ri_has_application(self, app_name)
    VALUE self, app_name;
{
    return CBOOL2RVAL(gtk_recent_info_has_application(_SELF(self), 
                                                RVAL2CSTR(app_name)));
}

static VALUE
ri_get_icon(self, size)
    VALUE self, size;
{
    return GOBJ2RVAL(gtk_recent_info_get_icon(_SELF(self), NUM2INT(size)));
}

static VALUE
ri_get_short_name(self)
    VALUE self;
{
    return CSTR2RVAL(gtk_recent_info_get_short_name(_SELF(self)));
}

static VALUE
ri_get_uri_display(self)
    VALUE self;
{
    return CSTR2RVAL(gtk_recent_info_get_uri_display(_SELF(self)));
}

static VALUE
ri_get_age(self)
    VALUE self;
{
    return INT2NUM(gtk_recent_info_get_age(_SELF(self)));
}

static VALUE
ri_is_local(self)
    VALUE self;
{
    return CBOOL2RVAL(gtk_recent_info_is_local(_SELF(self)));
}

static VALUE
ri_exist(self)
    VALUE self;
{
    return CBOOL2RVAL(gtk_recent_info_exists(_SELF(self)));
}

static VALUE
ri_match(self, other)
    VALUE self, other;
{
    return CBOOL2RVAL(gtk_recent_info_match(_SELF(self), _SELF(other)));
}

#endif

void 
Init_gtk_recent_info()
{
#if GTK_CHECK_VERSION(2,10,0)
    VALUE ri = G_DEF_CLASS(GTK_TYPE_RECENT_INFO, "RecentInfo", mGtk);
    rb_define_method(ri, "uri", ri_get_uri, 0);
    rb_define_method(ri, "display_name", ri_get_display_name, 0);
    rb_define_method(ri, "description", ri_get_description, 0);
    rb_define_method(ri, "mime_type", ri_get_mime_type, 0);
    rb_define_method(ri, "added", ri_get_added, 0);
    rb_define_method(ri, "modified", ri_get_modified, 0);
    rb_define_method(ri, "visited", ri_get_visited, 0);
    rb_define_method(ri, "private_hint?", ri_get_private_hint, 0);
    rb_define_method(ri, "application_info", ri_get_application_info, 1);
    rb_define_method(ri, "applications", ri_get_applications, 0);
    rb_define_method(ri, "last_application", ri_last_application, 0);
    rb_define_method(ri, "groups", ri_get_groups, 0);
    rb_define_method(ri, "has_group?", ri_has_group, 1);
    rb_define_method(ri, "has_application?", ri_has_application, 1);
    rb_define_method(ri, "get_icon", ri_get_icon, 1);
    rb_define_method(ri, "short_name", ri_get_short_name, 0);
    rb_define_method(ri, "uri_display", ri_get_uri_display, 0);
    rb_define_method(ri, "age", ri_get_age, 0);
    rb_define_method(ri, "local?", ri_is_local, 0);
    rb_define_method(ri, "exist?", ri_exist, 0);
    rb_define_method(ri, "==", ri_match, 1);

    G_DEF_SETTERS(ri);   
#endif
}
