summaryrefslogtreecommitdiffstats
path: root/include/pils/interface.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/pils/interface.h')
-rw-r--r--include/pils/interface.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/include/pils/interface.h b/include/pils/interface.h
new file mode 100644
index 0000000..5a5114e
--- /dev/null
+++ b/include/pils/interface.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2000 Alan Robertson <alanr@unix.sh>
+ * This software licensed under the GNU LGPL.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+#ifndef PILS_INTERFACE_H
+# define PILS_INTERFACE_H
+# ifndef PILS_PLUGIN_H
+# include <pils/plugin.h>
+# endif
+
+/*****************************************************************************
+ *
+ * The most basic interface type is the "IFManager" interface.
+ * Each interface manager registers and deals with interfaces of a given type.
+ *
+ * Such an interface must be loaded before any plugins of it's type can
+ * be loaded.
+ *
+ * In order to register any plugin of type "foo", we must load a interface of
+ * type "Interface" named "foo". This interface then manages the
+ * registration of all interfaces of type foo.
+ *
+ * To bootstrap, we load a interface of type "Interface" named "Interface"
+ * during the initialization of the plugin system.
+ *
+ * IFManagers will be autoloaded if certain conditions are met...
+ *
+ * If a IFManager is to be autoloaded, there must be one interface manager
+ * per file, and the file must be named according to the type of the
+ * interface it implements, and loaded in the directory named PI_IFMANAGER
+ * ("Interface").
+ *
+ */
+
+
+/*
+ * I'm unsure exactly which of the following structures
+ * are needed to write a interface, or a interface manager.
+ * We'll get that figured out and scope the defintions accordingly...
+ */
+
+/*
+ * PILInterface (AKA struct PILInterface_s) holds the information
+ * we use to track a single interface manager.
+ */
+
+
+struct PILInterface_s {
+ unsigned long MagicNum;
+ PILInterfaceType* interfacetype; /* Parent pointer */
+ char * interfacename; /* malloced interface name */
+ PILInterface* ifmanager; /* plugin managing us */
+ void* exports; /* Exported Functions */
+ /* for this interface */
+ PILInterfaceFun if_close; /* Interface close operation*/
+ void* ud_interface; /* per-interface user data */
+ int refcnt; /* Ref count for plugin */
+ PILPlugin* loadingpi; /* Plugin that loaded us */
+};
+/*
+ * PILInterfaceType (AKA struct PILInterfaceType_s) holds the info
+ * we use to track the set of all interfaces of a single kind.
+ */
+struct PILInterfaceType_s {
+ unsigned long MagicNum;
+ char* typename; /* Our interface type name */
+ GHashTable* interfaces; /* The set of interfaces
+ * of our type. The
+ * "values" are all
+ * PILInterface * objects
+ */
+ void* ud_if_type; /* per-interface-type user
+ data*/
+ PILInterfaceUniv* universe; /* Pointer to parent (up) */
+ PILInterface* ifmgr_ref; /* Pointer to our interface
+ manager */
+};
+
+/*
+ * PILInterfaceUniv (AKA struct PILInterfaceUniv_s) holds the information
+ * for all interfaces of all types. From our point of view this is
+ * our universe ;-)
+ */
+
+struct PILInterfaceUniv_s{
+ unsigned long MagicNum;
+ GHashTable* iftypes; /*
+ * Set of Interface Types
+ * The values are all
+ * PILInterfaceType objects
+ */
+ struct PILPluginUniv_s* piuniv; /* parallel universe of
+ * plugins
+ */
+};
+
+#ifdef ENABLE_PLUGIN_MANAGER_PRIVATE
+/*
+ * From here to the end is specific to interface managers.
+ * This data is only needed by interface managers, and the interface
+ * management system itself.
+ *
+ */
+typedef struct PILInterfaceOps_s PILInterfaceOps;
+
+
+/* Interfaces imported by a IFManager interface */
+struct PILInterfaceImports_s {
+
+ /* Return current reference count */
+ int (*RefCount)(PILInterface * eifinfo);
+
+ /* Incr/Decr reference count */
+ int (*ModRefCount)(PILInterface*eifinfo, int plusminus);
+
+ /* Unregister us as a interface */
+ void (*ForceUnRegister)(PILInterface *eifinfo);
+
+ /* For each client */
+ void (*ForEachClientDel)(PILInterface* manangerif
+ , gboolean(*f)(PILInterface* clientif, void * other)
+ , void* other);
+
+};
+
+/* Interfaces exported by an InterfaceManager interface */
+struct PILInterfaceOps_s{
+/*
+ * These are the interfaces exported by an InterfaceManager to the
+ * interface management infrastructure. These are not imported
+ * by interfaces - only the interface management infrastructure.
+ */
+
+ /* RegisterInterface - register this interface */
+ PIL_rc (*RegisterInterface)(PILInterface* newif
+ , void** imports);
+
+ PIL_rc (*UnRegisterInterface)(PILInterface*ifinfo); /* Unregister IF*/
+ /* And destroy PILInterface object */
+};
+
+#endif /* ENABLE_PLUGIN_MANAGER_PRIVATE */
+#endif /* PILS_INTERFACE_H */