/******************************************************************
 * PTlink Services is (C) CopyRight PTlink IRC Software 1999-2005 *
 *                http://software.pt-link.net                     *
 * This program is distributed under GNU Public License           *
 * Please read the file COPYING for copyright information.        *
 ******************************************************************
   
  File: modules.h
  Desc: modules header file
 
 *  $Id: modules.h,v 1.5 2005/10/16 18:32:18 jpinto Exp $
*/
#ifndef _MODULES_H
#define _MODULES_H
#define MODULES_VERSION	1

#define MAX_MODULES 	128


struct SVS_Module_s
{
  char *name;  		/* module name */
  char *version;	/* version */
  char *desc;		/* desription */
};
typedef struct SVS_Module_s SVS_Module;

struct SVS_Module_dep_s
{
  char *name;		/* symbol name */
  void *ptr;		/* data/function pointer */
};
typedef struct SVS_Module_dep_s SVS_Module_dep;

struct Module_Function_s
{
  char *name;		/* symbol name */
  void *ptr;		/* data/function pointer */  
};
typedef struct Module_Function_s Module_Function;

struct FunctionList_s
{
  char *name;
  void *ptr;
  SVS_Module *modinfo;
  SVS_Module **modattach;	/* modules attached to this function */
  int attcount;			/* counf of attached modules */
  struct FunctionList_s *next;
};
typedef struct FunctionList_s FunctionList;


  
/* usefull macro */
#define GET_PARENT_MODULE	\
  if(mod_info.parent) /* we need a parent module, lets search it */ \
    { \
      pmodule = module_find(mod_info.parent); \
    } \
  if(pmodule == NULL) \
    { \
      slog(L_ERROR, "Could not find parent module: %s", mod_info.parent); \
      return -1; \
    }
    
#endif

extern SVS_Module* CurrentModule;

#define MOD_FUNC(x) { #x, &x },

#define MOD_REQUIRES Module_Function mod_requires[] =\
{

#define MOD_PROVIDES Module_Function mod_provides[] =\
{

#define MOD_OPTIONS Module_Function mod_options[] =\
{

#define MOD_END {NULL}\
};

/* functions */
int module_load(char *modfn, int silent);
int module_unload(SVS_Module* module);
SVS_Module*  module_find(char *modname);
int load_modules_file(char* fn);
int get_installed_version(char *fname);    
void register_provides(Module_Function funclist[], SVS_Module* modinfo);
int register_requires(Module_Function moddeps[], SVS_Module *modinfo, int stop);
void *attach_to_function(char *name, SVS_Module* modinfo);
int check_for_functions(SVS_Module *modinfo, char ** fname, char **modname);
int get_local_dconf(void);
void module_delall_attach(SVS_Module *module);
void modules_rehash(void);

/* extern structures */
extern int modules_count;
extern SVS_Module* svs_modules[MAX_MODULES];

#define COMMON_MODULES_HEADERS \
#include "stdinc.h" \
#include "ircservice.h" \
#include "suser.h" \
#include "s_log.h" \
#include "log.h" \
#include "lang.h" \
#include "modules.h" \
#include "strhand.h" \
#include "modevents.h" \
#include "ircsvs.h"


syntax highlighted by Code2HTML, v. 0.9.1