diff --git a/plugins/python/python.c b/plugins/python/python.c index 90dbb22d..8c424524 100644 --- a/plugins/python/python.c +++ b/plugins/python/python.c @@ -593,10 +593,8 @@ Callback_Command(char *word[], char *word_eol[], void *userdata) return ret; } -/* No Callback_Server() here. We use Callback_Command() as well. */ - static int -Callback_Print(char *word[], hexchat_event_attrs *attrs, void *userdata) +Callback_Print_Attrs(char *word[], hexchat_event_attrs *attrs, void *userdata) { Hook *hook = (Hook *) userdata; PyObject *retobj; @@ -662,12 +660,8 @@ Callback_Print(char *word[], hexchat_event_attrs *attrs, void *userdata) attributes = Attribute_New(attrs); - if (hook->type == HOOK_XCHAT_ATTR) - retobj = PyObject_CallFunction(hook->callback, "(OOOO)", word_list, - word_eol_list, hook->userdata, attributes); - else - retobj = PyObject_CallFunction(hook->callback, "(OOO)", word_list, - word_eol_list, hook->userdata); + retobj = PyObject_CallFunction(hook->callback, "(OOOO)", word_list, + word_eol_list, hook->userdata, attributes); Py_DECREF(word_list); Py_DECREF(word_eol_list); @@ -690,6 +684,94 @@ Callback_Print(char *word[], hexchat_event_attrs *attrs, void *userdata) return ret; } +static int +Callback_Print(char *word[], void *userdata) +{ + Hook *hook = (Hook *) userdata; + PyObject *retobj; + PyObject *word_list; + PyObject *word_eol_list; + char **word_eol; + char *word_eol_raw; + int listsize = 0; + int next = 0; + int i; + int ret = 0; + PyObject *plugin; + + /* Cut off the message identifier. */ + word += 1; + + /* HexChat doesn't provide a word_eol for print events, so we + * build our own here. */ + while (word[listsize] && word[listsize][0]) + listsize++; + word_eol = (char **) g_malloc(sizeof(char*)*(listsize+1)); + if (word_eol == NULL) { + hexchat_print(ph, "Not enough memory to alloc word_eol " + "for python plugin callback."); + return 0; + } + /* First build a word clone, but NULL terminated. */ + memcpy(word_eol, word, listsize*sizeof(char*)); + word_eol[listsize] = NULL; + /* Then join it. */ + word_eol_raw = g_strjoinv(" ", word_eol); + if (word_eol_raw == NULL) { + hexchat_print(ph, "Not enough memory to alloc word_eol_raw " + "for python plugin callback."); + return 0; + } + /* And rebuild the real word_eol. */ + for (i = 0; i != listsize; i++) { + word_eol[i] = word_eol_raw+next; + next += strlen(word[i])+1; + } + word_eol[i] = ""; + + plugin = hook->plugin; + BEGIN_PLUGIN(plugin); + + word_list = Util_BuildList(word); + if (word_list == NULL) { + g_free(word_eol_raw); + g_free(word_eol); + END_PLUGIN(plugin); + return 0; + } + word_eol_list = Util_BuildList(word_eol); + if (word_eol_list == NULL) { + g_free(word_eol_raw); + g_free(word_eol); + Py_DECREF(word_list); + END_PLUGIN(plugin); + return 0; + } + + + retobj = PyObject_CallFunction(hook->callback, "(OOO)", word_list, + word_eol_list, hook->userdata); + + Py_DECREF(word_list); + Py_DECREF(word_eol_list); + + g_free(word_eol_raw); + g_free(word_eol); + if (retobj == Py_None) { + ret = HEXCHAT_EAT_NONE; + Py_DECREF(retobj); + } else if (retobj) { + ret = PyLong_AsLong(retobj); + Py_DECREF(retobj); + } else { + PyErr_Print(); + } + + END_PLUGIN(plugin); + + return ret; +} + static int Callback_Timer(void *userdata) { @@ -2028,7 +2110,7 @@ Module_hexchat_hook_print(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; BEGIN_XCHAT_CALLS(NONE); - hook->data = (void*)hexchat_hook_print_attrs(ph, name, priority, + hook->data = (void*)hexchat_hook_print(ph, name, priority, Callback_Print, hook); END_XCHAT_CALLS(); @@ -2065,7 +2147,7 @@ Module_hexchat_hook_print_attrs(PyObject *self, PyObject *args, PyObject *kwargs BEGIN_XCHAT_CALLS(NONE); hook->data = (void*)hexchat_hook_print_attrs(ph, name, priority, - Callback_Print, hook); + Callback_Print_Attrs, hook); END_XCHAT_CALLS(); return PyLong_FromVoidPtr(hook);