/[weechat]/weechat/src/plugins/plugins.c
ViewVC logotype

Diff of /weechat/src/plugins/plugins.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.31 by flashcode, Sun Oct 23 22:07:18 2005 UTC revision 1.32 by flashcode, Tue Oct 25 17:37:13 2005 UTC
# Line 33  Line 33 
33  #include <sys/stat.h>  #include <sys/stat.h>
34  #include <dirent.h>  #include <dirent.h>
35  #include <dlfcn.h>  #include <dlfcn.h>
36    
37  #include "../common/weechat.h"  #include "../common/weechat.h"
38  #include "plugins.h"  #include "plugins.h"
39  #include "plugins-config.h"  #include "plugins-config.h"
# Line 160  plugin_search (char *name) Line 161  plugin_search (char *name)
161   *                            return: pointer to handler, NULL if not found   *                            return: pointer to handler, NULL if not found
162   */   */
163    
164  t_plugin_cmd_handler *  t_plugin_handler *
165  plugin_cmd_handler_search (char *command)  plugin_cmd_handler_search (char *command)
166  {  {
167      t_weechat_plugin *ptr_plugin;      t_weechat_plugin *ptr_plugin;
168      t_plugin_cmd_handler *ptr_plugin_cmd_handler;      t_plugin_handler *ptr_handler;
169            
170      for (ptr_plugin = weechat_plugins; ptr_plugin;      for (ptr_plugin = weechat_plugins; ptr_plugin;
171           ptr_plugin = ptr_plugin->next_plugin)           ptr_plugin = ptr_plugin->next_plugin)
172      {      {
173          for (ptr_plugin_cmd_handler = ptr_plugin->cmd_handlers;          for (ptr_handler = ptr_plugin->handlers;
174               ptr_plugin_cmd_handler;               ptr_handler; ptr_handler = ptr_handler->next_handler)
              ptr_plugin_cmd_handler = ptr_plugin_cmd_handler->next_handler)  
175          {          {
176              if (ascii_strcasecmp (ptr_plugin_cmd_handler->command, command) == 0)              if ((ptr_handler->type == HANDLER_COMMAND)
177                  return ptr_plugin_cmd_handler;                  && (ascii_strcasecmp (ptr_handler->command, command) == 0))
178                    return ptr_handler;
179          }          }
180      }      }
181            
# Line 194  plugin_cmd_handler_search (char *command Line 195  plugin_cmd_handler_search (char *command
195   *                              handler when called (used by scripts)   *                              handler when called (used by scripts)
196   */   */
197    
198  t_plugin_msg_handler *  t_plugin_handler *
199  plugin_msg_handler_add (t_weechat_plugin *plugin, char *irc_command,  plugin_msg_handler_add (t_weechat_plugin *plugin, char *irc_command,
200                          t_plugin_handler_func *handler_func,                          t_plugin_handler_func *handler_func,
201                          char *handler_args, void *handler_pointer)                          char *handler_args, void *handler_pointer)
202  {  {
203      t_plugin_msg_handler *new_plugin_msg_handler;      t_plugin_handler *new_handler;
204            
205      new_plugin_msg_handler = (t_plugin_msg_handler *)malloc (sizeof (t_plugin_msg_handler));      new_handler = (t_plugin_handler *)malloc (sizeof (t_plugin_handler));
206      if (new_plugin_msg_handler)      if (new_handler)
207      {      {
208          new_plugin_msg_handler->irc_command = strdup (irc_command);          new_handler->type = HANDLER_MESSAGE;
209          new_plugin_msg_handler->msg_handler = handler_func;          new_handler->irc_command = strdup (irc_command);
210          new_plugin_msg_handler->msg_handler_args = (handler_args) ? strdup (handler_args) : NULL;          new_handler->command = NULL;
211          new_plugin_msg_handler->msg_handler_pointer = handler_pointer;          new_handler->description = NULL;
212          new_plugin_msg_handler->running = 0;          new_handler->arguments = NULL;
213            new_handler->arguments_description = NULL;
214            new_handler->handler = handler_func;
215            new_handler->handler_args = (handler_args) ? strdup (handler_args) : NULL;
216            new_handler->handler_pointer = handler_pointer;
217            new_handler->running = 0;
218                    
219          /* add new handler to list */          /* add new handler to list */
220          new_plugin_msg_handler->prev_handler = plugin->last_msg_handler;          new_handler->prev_handler = plugin->last_handler;
221          new_plugin_msg_handler->next_handler = NULL;          new_handler->next_handler = NULL;
222          if (plugin->msg_handlers)          if (plugin->handlers)
223              (plugin->last_msg_handler)->next_handler = new_plugin_msg_handler;              (plugin->last_handler)->next_handler = new_handler;
224          else          else
225              plugin->msg_handlers = new_plugin_msg_handler;              plugin->handlers = new_handler;
226          plugin->last_msg_handler = new_plugin_msg_handler;          plugin->last_handler = new_handler;
227      }      }
228      else      else
229      {      {
# Line 227  plugin_msg_handler_add (t_weechat_plugin Line 233  plugin_msg_handler_add (t_weechat_plugin
233                      WEECHAT_ERROR, plugin->name, irc_command);                      WEECHAT_ERROR, plugin->name, irc_command);
234          return NULL;          return NULL;
235      }      }
236      return new_plugin_msg_handler;      return new_handler;
237  }  }
238    
239  /*  /*
# Line 245  plugin_msg_handler_add (t_weechat_plugin Line 251  plugin_msg_handler_add (t_weechat_plugin
251   *                              handler when called (used by scripts)   *                              handler when called (used by scripts)
252   */   */
253    
254  t_plugin_cmd_handler *  t_plugin_handler *
255  plugin_cmd_handler_add (t_weechat_plugin *plugin, char *command,  plugin_cmd_handler_add (t_weechat_plugin *plugin, char *command,
256                          char *description, char *arguments,                          char *description, char *arguments,
257                          char *arguments_description,                          char *arguments_description,
258                          t_plugin_handler_func *handler_func,                          t_plugin_handler_func *handler_func,
259                          char *handler_args, void *handler_pointer)                          char *handler_args, void *handler_pointer)
260  {  {
261      t_plugin_cmd_handler *new_plugin_cmd_handler;      t_plugin_handler *new_handler;
262            
263      if (plugin_cmd_handler_search (command))      if (plugin_cmd_handler_search (command))
264      {      {
# Line 264  plugin_cmd_handler_add (t_weechat_plugin Line 270  plugin_cmd_handler_add (t_weechat_plugin
270          return NULL;          return NULL;
271      }      }
272                    
273      new_plugin_cmd_handler = (t_plugin_cmd_handler *)malloc (sizeof (t_plugin_cmd_handler));      new_handler = (t_plugin_handler *)malloc (sizeof (t_plugin_handler));
274      if (new_plugin_cmd_handler)      if (new_handler)
275      {      {
276          new_plugin_cmd_handler->command = strdup (command);          new_handler->type = HANDLER_COMMAND;
277          new_plugin_cmd_handler->description = (description) ? strdup (description) : NULL;          new_handler->irc_command = NULL;
278          new_plugin_cmd_handler->arguments = (arguments) ? strdup (arguments) : NULL;          new_handler->command = strdup (command);
279          new_plugin_cmd_handler->arguments_description = (arguments_description) ? strdup (arguments_description) : NULL;          new_handler->description = (description) ? strdup (description) : NULL;
280          new_plugin_cmd_handler->cmd_handler = handler_func;          new_handler->arguments = (arguments) ? strdup (arguments) : NULL;
281          new_plugin_cmd_handler->cmd_handler_args = (handler_args) ? strdup (handler_args) : NULL;          new_handler->arguments_description = (arguments_description) ? strdup (arguments_description) : NULL;
282          new_plugin_cmd_handler->cmd_handler_pointer = handler_pointer;          new_handler->handler = handler_func;
283          new_plugin_cmd_handler->running = 0;          new_handler->handler_args = (handler_args) ? strdup (handler_args) : NULL;
284            new_handler->handler_pointer = handler_pointer;
285            new_handler->running = 0;
286                    
287          /* add new handler to list */          /* add new handler to list */
288          new_plugin_cmd_handler->prev_handler = plugin->last_cmd_handler;          new_handler->prev_handler = plugin->last_handler;
289          new_plugin_cmd_handler->next_handler = NULL;          new_handler->next_handler = NULL;
290          if (plugin->cmd_handlers)          if (plugin->handlers)
291              (plugin->last_cmd_handler)->next_handler = new_plugin_cmd_handler;              (plugin->last_handler)->next_handler = new_handler;
292          else          else
293              plugin->cmd_handlers = new_plugin_cmd_handler;              plugin->handlers = new_handler;
294          plugin->last_cmd_handler = new_plugin_cmd_handler;          plugin->last_handler = new_handler;
295                    
296          /* add command to WeeChat commands list */          /* add command to WeeChat commands list */
297          if (!weelist_search (index_commands, command))          if (!weelist_search (index_commands, command))
# Line 297  plugin_cmd_handler_add (t_weechat_plugin Line 305  plugin_cmd_handler_add (t_weechat_plugin
305                      WEECHAT_ERROR, plugin->name, command);                      WEECHAT_ERROR, plugin->name, command);
306          return NULL;          return NULL;
307      }      }
308      return new_plugin_cmd_handler;      return new_handler;
309  }  }
310    
311  /*  /*
# Line 309  int Line 317  int
317  plugin_msg_handler_exec (char *server, char *irc_command, char *irc_message)  plugin_msg_handler_exec (char *server, char *irc_command, char *irc_message)
318  {  {
319      t_weechat_plugin *ptr_plugin;      t_weechat_plugin *ptr_plugin;
320      t_plugin_msg_handler *ptr_plugin_msg_handler;      t_plugin_handler *ptr_handler;
321      int count;      int count;
322            
323      count = 0;      count = 0;
324      for (ptr_plugin = weechat_plugins; ptr_plugin;      for (ptr_plugin = weechat_plugins; ptr_plugin;
325           ptr_plugin = ptr_plugin->next_plugin)           ptr_plugin = ptr_plugin->next_plugin)
326      {      {
327          for (ptr_plugin_msg_handler = ptr_plugin->msg_handlers;          for (ptr_handler = ptr_plugin->handlers;
328               ptr_plugin_msg_handler;               ptr_handler; ptr_handler = ptr_handler->next_handler)
              ptr_plugin_msg_handler = ptr_plugin_msg_handler->next_handler)  
329          {          {
330              if (ascii_strcasecmp (ptr_plugin_msg_handler->irc_command, irc_command) == 0)              if ((ptr_handler->type == HANDLER_MESSAGE)
331                    && (ascii_strcasecmp (ptr_handler->irc_command, irc_command) == 0))
332              {              {
333                  if (ptr_plugin_msg_handler->running == 0)                  if (ptr_handler->running == 0)
334                  {                  {
335                      ptr_plugin_msg_handler->running = 1;                      ptr_handler->running = 1;
336                      if ((int) (ptr_plugin_msg_handler->msg_handler) (ptr_plugin,                      if ((int) (ptr_handler->handler) (ptr_plugin,
337                                                                       server,                                                        server,
338                                                                       irc_command,                                                        irc_command,
339                                                                       irc_message,                                                        irc_message,
340                                                                       ptr_plugin_msg_handler->msg_handler_args,                                                        ptr_handler->handler_args,
341                                                                       ptr_plugin_msg_handler->msg_handler_pointer))                                                        ptr_handler->handler_pointer))
342                          count++;                          count++;
343                      ptr_plugin_msg_handler->running = 0;                      ptr_handler->running = 0;
344                  }                  }
345              }              }
346          }          }
# Line 350  int Line 358  int
358  plugin_cmd_handler_exec (char *server, char *command, char *arguments)  plugin_cmd_handler_exec (char *server, char *command, char *arguments)
359  {  {
360      t_weechat_plugin *ptr_plugin;      t_weechat_plugin *ptr_plugin;
361      t_plugin_cmd_handler *ptr_plugin_cmd_handler;      t_plugin_handler *ptr_handler;
362      int return_code;      int return_code;
363            
364      for (ptr_plugin = weechat_plugins; ptr_plugin;      for (ptr_plugin = weechat_plugins; ptr_plugin;
365           ptr_plugin = ptr_plugin->next_plugin)           ptr_plugin = ptr_plugin->next_plugin)
366      {      {
367          for (ptr_plugin_cmd_handler = ptr_plugin->cmd_handlers;          for (ptr_handler = ptr_plugin->handlers;
368               ptr_plugin_cmd_handler;               ptr_handler; ptr_handler = ptr_handler->next_handler)
              ptr_plugin_cmd_handler = ptr_plugin_cmd_handler->next_handler)  
369          {          {
370              if (ascii_strcasecmp (ptr_plugin_cmd_handler->command, command) == 0)              if ((ptr_handler->type == HANDLER_COMMAND)
371                    && (ascii_strcasecmp (ptr_handler->command, command) == 0))
372              {              {
373                  if (ptr_plugin_cmd_handler->running == 0)                  if (ptr_handler->running == 0)
374                  {                  {
375                      ptr_plugin_cmd_handler->running = 1;                      ptr_handler->running = 1;
376                      return_code = (int) (ptr_plugin_cmd_handler->cmd_handler) (ptr_plugin,                      return_code = (int) (ptr_handler->handler) (ptr_plugin,
377                                                                                 server,                                                                  server,
378                                                                                 command,                                                                  command,
379                                                                                 arguments,                                                                  arguments,
380                                                                                 ptr_plugin_cmd_handler->cmd_handler_args,                                                                  ptr_handler->handler_args,
381                                                                                 ptr_plugin_cmd_handler->cmd_handler_pointer);                                                                  ptr_handler->handler_pointer);
382                      ptr_plugin_cmd_handler->running = 0;                      ptr_handler->running = 0;
383                      return (return_code) ? 1 : 0;                      return (return_code) ? 1 : 0;
384                  }                  }
385              }              }
# Line 382  plugin_cmd_handler_exec (char *server, c Line 390  plugin_cmd_handler_exec (char *server, c
390  }  }
391    
392  /*  /*
393   * plugin_msg_handler_remove: remove a message handler for a plugin   * plugin_handler_remove: remove a handler for a plugin
  */  
   
 void  
 plugin_msg_handler_remove (t_weechat_plugin *plugin,  
                            t_plugin_msg_handler *plugin_msg_handler)  
 {  
     t_plugin_msg_handler *new_plugin_msg_handlers;  
       
     /* remove handler from list */  
     if (plugin->last_msg_handler == plugin_msg_handler)  
         plugin->last_msg_handler = plugin_msg_handler->prev_handler;  
     if (plugin_msg_handler->prev_handler)  
     {  
         (plugin_msg_handler->prev_handler)->next_handler = plugin_msg_handler->next_handler;  
         new_plugin_msg_handlers = plugin->msg_handlers;  
     }  
     else  
         new_plugin_msg_handlers = plugin_msg_handler->next_handler;  
       
     if (plugin_msg_handler->next_handler)  
         (plugin_msg_handler->next_handler)->prev_handler = plugin_msg_handler->prev_handler;  
   
     /* free data */  
     if (plugin_msg_handler->irc_command)  
         free (plugin_msg_handler->irc_command);  
     if (plugin_msg_handler->msg_handler_args)  
         free (plugin_msg_handler->msg_handler_args);  
     plugin->msg_handlers = new_plugin_msg_handlers;  
 }  
   
 /*  
  * plugin_cmd_handler_remove: remove a command handler for a plugin  
394   */   */
395    
396  void  void
397  plugin_cmd_handler_remove (t_weechat_plugin *plugin,  plugin_handler_remove (t_weechat_plugin *plugin,
398                             t_plugin_cmd_handler *plugin_cmd_handler)                         t_plugin_handler *handler)
399  {  {
400      t_plugin_cmd_handler *new_plugin_cmd_handlers;      t_plugin_handler *new_handlers;
401            
402      /* remove handler from list */      /* remove handler from list */
403      if (plugin->last_cmd_handler == plugin_cmd_handler)      if (plugin->last_handler == handler)
404          plugin->last_cmd_handler = plugin_cmd_handler->prev_handler;          plugin->last_handler = handler->prev_handler;
405      if (plugin_cmd_handler->prev_handler)      if (handler->prev_handler)
406      {      {
407          (plugin_cmd_handler->prev_handler)->next_handler = plugin_cmd_handler->next_handler;          (handler->prev_handler)->next_handler = handler->next_handler;
408          new_plugin_cmd_handlers = plugin->cmd_handlers;          new_handlers = plugin->handlers;
409      }      }
410      else      else
411          new_plugin_cmd_handlers = plugin_cmd_handler->next_handler;          new_handlers = handler->next_handler;
412            
413      if (plugin_cmd_handler->next_handler)      if (handler->next_handler)
414          (plugin_cmd_handler->next_handler)->prev_handler = plugin_cmd_handler->prev_handler;          (handler->next_handler)->prev_handler = handler->prev_handler;
415            
416      /* remove command from WeeChat command list */      /* remove command from WeeChat command list, if command handler */
417      weelist_remove (&index_commands, &last_index_command,      if (handler->type == HANDLER_COMMAND)
418                      weelist_search (index_commands, plugin_cmd_handler->command));          weelist_remove (&index_commands, &last_index_command,
419                            weelist_search (index_commands, handler->command));
420            
421      /* free data */      /* free data */
422      if (plugin_cmd_handler->command)      if (handler->irc_command)
423          free (plugin_cmd_handler->command);          free (handler->irc_command);
424      if (plugin_cmd_handler->description)      if (handler->command)
425          free (plugin_cmd_handler->description);          free (handler->command);
426      if (plugin_cmd_handler->arguments)      if (handler->description)
427          free (plugin_cmd_handler->arguments);          free (handler->description);
428      if (plugin_cmd_handler->arguments_description)      if (handler->arguments)
429          free (plugin_cmd_handler->arguments_description);          free (handler->arguments);
430      if (plugin_cmd_handler->cmd_handler_args)      if (handler->arguments_description)
431          free (plugin_cmd_handler->cmd_handler_args);          free (handler->arguments_description);
432      plugin->cmd_handlers = new_plugin_cmd_handlers;      if (handler->handler_args)
433  }          free (handler->handler_args);
434        
435  /*      plugin->handlers = new_handlers;
  * plugin_msg_handler_remove_all: remove all message handlers for a plugin  
  */  
   
 void  
 plugin_msg_handler_remove_all (t_weechat_plugin *plugin)  
 {  
     while (plugin->msg_handlers)  
         plugin_msg_handler_remove (plugin, plugin->msg_handlers);  
436  }  }
437    
438  /*  /*
439   * plugin_cmd_handler_remove_all: remove all command handlers for a plugin   * plugin_handler_remove_all: remove all handlers for a plugin
440   */   */
441    
442  void  void
443  plugin_cmd_handler_remove_all (t_weechat_plugin *plugin)  plugin_handler_remove_all (t_weechat_plugin *plugin)
444  {  {
445      while (plugin->cmd_handlers)      while (plugin->handlers)
446          plugin_cmd_handler_remove (plugin, plugin->cmd_handlers);          plugin_handler_remove (plugin, plugin->handlers);
447  }  }
448    
449  /*  /*
# Line 650  plugin_load (char *filename) Line 619  plugin_load (char *filename)
619          new_plugin->mkdir_home = &weechat_plugin_mkdir_home;          new_plugin->mkdir_home = &weechat_plugin_mkdir_home;
620          new_plugin->exec_on_files = &weechat_plugin_exec_on_files;          new_plugin->exec_on_files = &weechat_plugin_exec_on_files;
621          new_plugin->msg_handler_add = &weechat_plugin_msg_handler_add;          new_plugin->msg_handler_add = &weechat_plugin_msg_handler_add;
         new_plugin->msg_handler_remove = &weechat_plugin_msg_handler_remove;  
         new_plugin->msg_handler_remove_all = &weechat_plugin_msg_handler_remove_all;  
622          new_plugin->cmd_handler_add = &weechat_plugin_cmd_handler_add;          new_plugin->cmd_handler_add = &weechat_plugin_cmd_handler_add;
623          new_plugin->cmd_handler_remove = &weechat_plugin_cmd_handler_remove;          new_plugin->handler_remove = &weechat_plugin_handler_remove;
624          new_plugin->cmd_handler_remove_all = &weechat_plugin_cmd_handler_remove_all;          new_plugin->handler_remove_all = &weechat_plugin_handler_remove_all;
625          new_plugin->printf = &weechat_plugin_printf;          new_plugin->printf = &weechat_plugin_printf;
626          new_plugin->printf_server = &weechat_plugin_printf_server;          new_plugin->printf_server = &weechat_plugin_printf_server;
627          new_plugin->infobar_printf = &weechat_plugin_infobar_printf;          new_plugin->infobar_printf = &weechat_plugin_infobar_printf;
# Line 668  plugin_load (char *filename) Line 635  plugin_load (char *filename)
635          new_plugin->set_plugin_config = &weechat_plugin_set_plugin_config;          new_plugin->set_plugin_config = &weechat_plugin_set_plugin_config;
636                    
637          /* handlers */          /* handlers */
638          new_plugin->msg_handlers = NULL;          new_plugin->handlers = NULL;
639          new_plugin->last_msg_handler = NULL;          new_plugin->last_handler = NULL;
         new_plugin->cmd_handlers = NULL;  
         new_plugin->last_cmd_handler = NULL;  
640                    
641          /* add new plugin to list */          /* add new plugin to list */
642          new_plugin->prev_plugin = last_weechat_plugin;          new_plugin->prev_plugin = last_weechat_plugin;
# Line 807  plugin_remove (t_weechat_plugin *plugin) Line 772  plugin_remove (t_weechat_plugin *plugin)
772          (plugin->next_plugin)->prev_plugin = plugin->prev_plugin;          (plugin->next_plugin)->prev_plugin = plugin->prev_plugin;
773            
774      /* free data */      /* free data */
775      plugin_msg_handler_remove_all (plugin);      plugin_handler_remove_all (plugin);
     plugin_cmd_handler_remove_all (plugin);  
776      if (plugin->filename)      if (plugin->filename)
777          free (plugin->filename);          free (plugin->filename);
778      dlclose (plugin->handle);      dlclose (plugin->handle);

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.32

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26