From 28d1b39edb08deff4edd50c7529c96aa23e39efe Mon Sep 17 00:00:00 2001
From: jaortega <jaortega>
Date: Wed, 14 Feb 2001 23:24:06 +0000
Subject: new MVC library

---
 Makefile.am             |   4 +-
 configure.in            |   3 +-
 mixmvc/.cvsignore       |   3 ++
 mixmvc/Makefile.am      |  19 +++++++++
 mixmvc/mix_vm_subject.c |  68 +++++++++++++++++++++++++++++++
 mixmvc/mix_vm_subject.h |  49 ++++++++++++++++++++++
 mixmvc/mvc.c            |  69 +++++++++++++++++++++++++++++++
 mixmvc/mvc.h            | 105 ++++++++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 317 insertions(+), 3 deletions(-)
 create mode 100644 mixmvc/.cvsignore
 create mode 100644 mixmvc/Makefile.am
 create mode 100644 mixmvc/mix_vm_subject.c
 create mode 100644 mixmvc/mix_vm_subject.h
 create mode 100644 mixmvc/mvc.c
 create mode 100644 mixmvc/mvc.h

diff --git a/Makefile.am b/Makefile.am
index c57ce00..7863fa3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-# Copyright (C) 2000 Jose Antonio Ortega Ruiz <jaortega@retemail.es>
+# Copyright (C) 2000, 2001 Free Software Foundation, Inc.
 #  
 # This file is free software; as a special exception the author gives
 # unlimited permission to copy and/or distribute it, with or without 
@@ -11,5 +11,5 @@
 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 EXTRA_DIST = ABOUT-NLS  autogen.sh configure
-SUBDIRS = po intl doc mixlib mixutils samples
+SUBDIRS = po intl doc mixlib mixutils mixmvc samples
 
diff --git a/configure.in b/configure.in
index 5c8ad5c..907190a 100644
--- a/configure.in
+++ b/configure.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2000 Jose Antonio Ortega Ruiz <jaortega@retemail.es>
+# Copyright (C) 2000, 2001 Free Software Foundation, Inc.
 #  
 # This file is free software; as a special exception the author gives
 # unlimited permission to copy and/or distribute it, with or without 
@@ -50,6 +50,7 @@ doc/html/Makefile
 mixlib/Makefile 
 mixlib/testsuite/Makefile 
 mixutils/Makefile 
+mixmvc/Makefile
 intl/Makefile 
 samples/Makefile
 po/Makefile.in 
diff --git a/mixmvc/.cvsignore b/mixmvc/.cvsignore
new file mode 100644
index 0000000..e995588
--- /dev/null
+++ b/mixmvc/.cvsignore
@@ -0,0 +1,3 @@
+.deps
+Makefile
+Makefile.in
diff --git a/mixmvc/Makefile.am b/mixmvc/Makefile.am
new file mode 100644
index 0000000..f252f4b
--- /dev/null
+++ b/mixmvc/Makefile.am
@@ -0,0 +1,19 @@
+## Process this file with automake to produce Makefile.in
+
+# Copyright (C) 2001 Free Software Foundation, Inc.
+#  
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without 
+# modifications, as long as this notice is preserved.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+SUBDIRS = .
+INCLUDES = -I$(includedir) -DG_LOG_DOMAIN=\"libmixmvc\"
+
+noinst_LIBRARIES = libmixmvc.a
+libmixmvc_a_SOURCES = mvc.h mvc.c \
+                      mix_vm_subject.h mix_vm_subject.c
+
diff --git a/mixmvc/mix_vm_subject.c b/mixmvc/mix_vm_subject.c
new file mode 100644
index 0000000..1c7e5d8
--- /dev/null
+++ b/mixmvc/mix_vm_subject.c
@@ -0,0 +1,68 @@
+/* -*-c-*- -------------- mix_vm_subject.c :
+ * Implementation of the functions declared in mix_vm_subject.h
+ * ------------------------------------------------------------------
+ *  Last change: Time-stamp: "01/02/13 02:19:34 jose"
+ * ------------------------------------------------------------------
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *  
+ */
+
+
+#include "mix_vm_subject.h"
+
+/* the mix virtual machine subject */
+struct mix_vm_subject_t 
+{
+  subject_t parent;
+  mix_vm_t *vm;
+};
+
+/* the notify callback */
+static void
+mix_vm_notify_ (subject_t *sub, data_t *data) 
+{
+}
+
+/* create a new mix_vm_subject */
+mix_vm_subject_t *
+mix_vm_subject_new (void)
+{
+  mix_vm_subject_t *result = g_new (mix_vm_subject_t, 1);
+  subject_init ((subject_t *)result);
+  ((subject_t *)result)->notify = mix_vm_notify_;
+  result->vm = mix_vm_new ();
+  return result;
+}
+
+/* delete */
+void
+mix_vm_subject_delete (mix_vm_subject_t *sub)
+{
+  g_return_if_fail (sub != NULL);
+  subject_clean ((subject_t *)sub);
+  mix_vm_delete (sub->vm);
+  g_free (sub);
+}
+
+/* get the mix_vm in the subject */
+mix_vm_t *
+mix_vm_subject_get_vm (const mix_vm_subject_t *sub) 
+{
+  g_return_val_if_fail (sub != NULL, NULL);
+  return sub->vm;
+}
+
diff --git a/mixmvc/mix_vm_subject.h b/mixmvc/mix_vm_subject.h
new file mode 100644
index 0000000..07d2118
--- /dev/null
+++ b/mixmvc/mix_vm_subject.h
@@ -0,0 +1,49 @@
+/* -*-c-*- ---------------- mix_vm_subject.h :
+ * A virtual machine subject (model)
+ * ------------------------------------------------------------------
+ *  Last change: Time-stamp: <01/02/13 02:18:50 jose>
+ * ------------------------------------------------------------------
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *  
+ */
+
+
+#ifndef MIX_VM_SUBJECT_H
+#define MIX_VM_SUBJECT_H
+
+#include <mixlib/mix_vm.h>
+#include "mvc.h"
+
+/* the mix virtual machine subject */
+typedef struct mix_vm_subject_t mix_vm_subject_t;
+
+/* create a new mix_vm_subject */
+extern mix_vm_subject_t *
+mix_vm_subject_new (void);
+
+/* delete */
+extern void
+mix_vm_subject_delete (mix_vm_subject_t *sub);
+
+/* get the mix_vm in the subject */
+extern mix_vm_t *
+mix_vm_subject_get_vm (const mix_vm_subject_t *sub);
+
+
+
+#endif /* MIX_VM_SUBJECT_H */
+
diff --git a/mixmvc/mvc.c b/mixmvc/mvc.c
new file mode 100644
index 0000000..dcd254f
--- /dev/null
+++ b/mixmvc/mvc.c
@@ -0,0 +1,69 @@
+/* -*-c-*- -------------- mvc.c :
+ * Implementation of the functions declared in mvc.h
+ * ------------------------------------------------------------------
+ *  Last change: Time-stamp: "01/02/13 02:17:37 jose"
+ * ------------------------------------------------------------------
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *  
+ */
+
+
+
+#include "mvc.h"
+
+/* clean up a subject */
+void
+subject_clean (subject_t *sub) 
+{
+  g_return_if_fail (sub != NULL);
+  g_slist_free (sub->observers);
+}
+
+/* add a new observer */
+void
+subject_add_observer (subject_t *sub, observer_t *obs) 
+{
+  g_return_if_fail (sub != NULL);
+  g_return_if_fail (obs != NULL);
+  sub->observers = g_slist_append (sub->observers, (gpointer)obs);
+  obs->subject = sub;
+}
+
+/* remove an observer */
+void
+subject_remove_observer (subject_t *sub, observer_t *obs)
+{
+  g_return_if_fail (sub != NULL);
+  g_return_if_fail (obs != NULL);
+  sub->observers = g_slist_remove (sub->observers, (gpointer)obs);
+}
+
+/* observer notifier callback */
+static void
+update_callback (gpointer obs, gpointer data) 
+{
+  ((observer_t *)obs)->update((observer_t *)obs, data);
+}
+
+/* notify all observers of a change */
+void
+subject_update_observers (subject_t *sub, data_t *data)
+{
+  g_return_if_fail (sub != NULL);
+  g_slist_foreach (sub->observers, update_callback, data);
+}
+
diff --git a/mixmvc/mvc.h b/mixmvc/mvc.h
new file mode 100644
index 0000000..6371a27
--- /dev/null
+++ b/mixmvc/mvc.h
@@ -0,0 +1,105 @@
+/* -*-c-*- ---------------- mvc.h :
+ * This header defines basic types supporting the MVC pattern
+ * ------------------------------------------------------------------
+ *  Last change: Time-stamp: <01/02/13 02:16:08 jose>
+ * ------------------------------------------------------------------
+ * Copyright (C) 2001 Free Software Foundation, Inc.
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *  
+ */
+
+
+#ifndef MVC_H
+#define MVC_H
+
+#include <glib.h>
+
+/* the subject which is observed (the model) */
+typedef struct subject_t subject_t;
+
+/* subject's observer (the view) */
+typedef struct observer_t observer_t;
+
+/* list of observers (maintained by the subject) */
+typedef GSList observer_list_t;
+
+/* data used in callbacks */
+typedef void data_t;
+
+/* (virtual) function used by subject on each observer to notify an update */
+typedef void (*update_callback_t)(observer_t *obs, data_t *data);
+
+/* (virtual) function used by observers to notify subject of a change */
+typedef void (*notify_callback_t)(subject_t *subj, data_t *data);
+
+/* base subject type, containing a notify callback to be invoked
+   by observers */
+struct subject_t
+{
+  notify_callback_t notify;	/* notify callback used by observers */
+  observer_list_t *observers;	/* the list of current observers */
+};
+
+/* base observer type, containing an update callback (to be invoked by
+   the subject) and a pointer to the observed subject
+*/
+struct observer_t
+{
+  update_callback_t update;	/* update callback used by subject */
+  subject_t *subject;		/* observed subject */
+};
+
+
+/* subject interface */
+/* init a subject */
+#define subject_init(sub)			\
+do {						\
+  (sub)->notify = NULL;				\
+  (sub)->observers = NULL;			\
+} while (FALSE)
+
+/* clean up a subject */
+extern void
+subject_clean (subject_t *sub);
+
+/* add a new observer */
+extern void
+subject_add_observer (subject_t *sub, observer_t *obs);
+
+/* remove an observer */
+extern void
+subject_remove_observer (subject_t *sub, observer_t *obs);
+
+/* notify all observers of a change */
+extern void
+subject_update_observers (subject_t *sub, data_t *data);
+
+/* observer interface */
+/* init an observer */
+#define observer_init(obs)			\
+do {						\
+  (obs)->update = NULL;				\
+  (obs)->subject = NULL;			\
+} while (FALSE)
+  
+/* macro used by observers to notify their subject of a change */
+#define observer_notify_subject(obs, data)				\
+    (*((observer_t *)obs->subject->notify)((observer_t *)obs->subject,	\
+					   (data_t *)data))
+
+       
+#endif /* MVC_H */
+
-- 
cgit v1.2.3