Sophie

Sophie

distrib > Mandriva > 8.2 > i586 > by-pkgid > 13aa745fa82315981ff58c83c7af0f46 > files > 18

gob-1.0.12-1mdk.i586.rpm

requires 0.92.1

/* This will work with an older version (0.92.1 specifically), if you want
 * to see a version with automatic argument<->datamember linking, automatic
 * initialization and destruction, look at my-person2.gob */

%{
#include <time.h>
#include "my-person.h"
#include "my-person-private.h"
%}

class My:Person from Gtk:Object {
	public char *name;
	public long dob; /* date of birth as a time_t */
	public long dod; /* date of death as a time_t */

	private int rounds_in_shotgun; /* number of rounds in our shotgun */
	
	argument POINTER (type char *) name
	get {
		/* note that g_strdup handles NULL correctly */
		ARG = g_strdup(self->name);
	}
	set {
		/* note that g_free and g_strdup handles NULL correctly */
		g_free(self->name);
		self->name = g_strdup(ARG);
	};

	argument LONG dob get { ARG = self->dob; } set { self->dob = ARG; };
	argument LONG dod get { ARG = self->dod; } set { self->dod = ARG; };

	init(self)
	{
		self->name = g_strdup("Nobody");
		self->dob = 0;
		self->dod = 0;
		
		/* initially we have no rounds in the shotgun */
		self->_priv->rounds_in_shotgun = 0;
	}

	/* when the person gets born, sends out a signal, the caller
	   of the signal should provide the date of birth */
	signal last NONE (LONG)
	void
	birth(self, long dob)
	{
		self->dob = dob;
	}
	
	/* when the person dies, sends out a signal, the caller
	   of the signal should provide the date of death */
	signal last NONE (LONG)
	void
	death(self, long dod)
	{
		self->dod = dod;
	}

	public
	void
	load_shotgun(self)
	{
		/* add a round to our shotgun */
		self->_priv->rounds_in_shotgun++;
	}

	public
	void
	shoot_oneself_in_the_head(self)
	{
		if(self->_priv->rounds_in_shotgun==0) {
			g_warning("No rounds in the shotgun!");
			return;
		}
		
		/* one round was fired */
		self->_priv->rounds_in_shotgun--;

		/* death is imminent if we shoot oneself in the head */
		death(self, (long)time(NULL));
	}

	/* override the destroy signal where we destroy data we need to free */
	override (Gtk:Object)
	void
	destroy (Gtk:Object *self (check null type))
	{
		g_free(MY_PERSON(self)->name);
		PARENT_HANDLER(self);
	}

	public GtkObject *
	new(void)
	{
		return (GtkObject *)GET_NEW;
	}
}